import * as React from "react"; import { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "#components/buttons/button"; import { Icon } from "./icon"; import "./icon.scss"; const meta: Meta = { component: Icon, title: "FP.React Components/Icons", tags: ["stable"], args: { // styles: Icon.styles, }, decorators: [ (Story) => (
), ], } as Meta; export default meta; type Story = StoryObj; export const IconSet = { args: {}, render: () => { return ( Code Icon{" "} ); }, }; export const IconButton = { args: {}, render: () => { return ( <> ); }, }; /** * Decorative icon (default behavior). * Icon is hidden from screen readers via aria-hidden="true". * Use when icon accompanies visible text. */ export const Code: Story = { args: { children: , }, } as Story; export const Home: Story = { args: { styles: Icon.styles, children: ( <> ), }, } as Story; export const Add: Story = { args: { children: , }, } as Story; export const ArrowDown: Story = { args: { children: , }, } as Story; export const ArrowLeft: Story = { args: { children: , }, } as Story; export const ArrowRight: Story = { args: { children: , }, } as Story; export const ArrowUp: Story = { args: { children: , }, } as Story; export const Chat: Story = { args: { children: , }, } as Story; export const User: Story = { args: { children: , }, } as Story; export const Left: Story = { args: { children: , }, } as Story; export const Right: Story = { args: { children: , }, } as Story; export const Up: Story = { args: { children: , }, } as Story; export const Down: Story = { args: { children: , }, } as Story; export const Minus: Story = { args: { children: , }, } as Story; export const Remove: Story = { args: { children: , }, } as Story; export const Star: Story = { args: { children: , }, } as Story; export const Copy: Story = { args: { children: , }, } as Story; export const Play: Story = { args: { children: , }, } as Story; export const Pause: Story = { args: { children: , }, } as Story; export const Resume: Story = { args: { children: , }, } as Story; export const Stop: Story = { args: { children: , }, } as Story; export const PlaySolid: Story = { args: { children: , }, } as Story; export const PauseSolid: Story = { args: { children: , }, } as Story; export const ResumeSolid: Story = { args: { children: , }, } as Story; export const StopSolid: Story = { args: { children: , }, } as Story; export const Info: Story = { args: { children: , }, } as Story; export const Alert: Story = { args: { children: , }, } as Story; export const InfoSolid: Story = { args: { children: , }, } as Story; export const QuestionSolid: Story = { args: { children: , }, } as Story; export const WarnSolid: Story = { args: { children: , }, } as Story; export const SuccessSolid: Story = { args: { children: , }, } as Story; export const AlertSquareSolid: Story = { args: { children: , }, } as Story; /** * ✅ ACCESSIBLE PATTERN: Decorative icon with visible text. * Icon is hidden from screen readers (default aria-hidden="true"). * Screen readers announce only "Save Changes". */ export const DecorativeIconWithText: Story = { args: {}, render: () => ( ), } as Story; /** * ✅ ACCESSIBLE PATTERN: Semantic icon-only button. * Icon is exposed to screen readers with aria-hidden={false}. * aria-label provides accessible name for screen readers. */ export const SemanticIconOnlyButton: Story = { args: {}, render: () => ( ), } as Story; /** * ✅ ACCESSIBLE PATTERN: Icon with role="img" for semantic meaning. * Use when icon conveys information beyond decoration. * Requires aria-label for accessible name. */ export const SemanticIconWithRole: Story = { args: { "aria-hidden": false, "aria-label": "Code snippet", role: "img", children: , }, } as Story; /** * ❌ ANTI-PATTERN: Icon-only button without accessible name. * This will fail WCAG 4.1.2 (Name, Role, Value). * Screen readers cannot identify the button's purpose. */ export const IconOnlyButtonNoLabel: Story = { args: {}, render: () => (

❌ BAD: No accessible name

), } as Story;