{
  "v": 0,
  "components": {
    "components-actionbar": {
      "id": "components-actionbar",
      "name": "ActionBar",
      "path": "./src/components/actions/ActionBar.stories.tsx",
      "jsDocTags": {},
      "description": "Use `ActionBar` to arrange actions in a horizontally scrolling row. Place `ActionButton` components inside it; their `visible` prop animates them in and out.\n\nSet `wrap` to allow wrapping, or `disableShadow` to remove the overflow fades.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ActionBar",
        "definedInFile": "/home/runner/work/ui/ui/src/components/actions/ActionBar.tsx",
        "actualName": "ActionBar",
        "exportName": "ActionBar",
        "props": {
          "children": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "wrap": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableShadow": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-actionbar--default",
          "name": "Default",
          "snippet": "const Default = () => <ActionBar>{[\n        <ActionButton key=\"1\">\n            <Icon name=\"plus\" />\n        </ActionButton>,\n        <ActionButton key=\"2\">\n            <Icon name=\"pencil\" />\n            Edit\n        </ActionButton>,\n        <ActionButton key=\"3\" color=\"accent\" emphasis=\"primary\">\n            <Icon name=\"globe\" />\n            Publish\n        </ActionButton>,\n        <ActionButton key=\"3\">\n            <Icon name=\"placeholder\" />\n            Overflow 1\n        </ActionButton>,\n        <ActionButton key=\"4\">\n            <Icon name=\"placeholder\" />\n            Overflow 2\n        </ActionButton>,\n        <ActionButton key=\"5\" toggled>\n            <Icon name=\"placeholder\" />\n            Overflow 3\n        </ActionButton>,\n    ]}</ActionBar>;"
        },
        {
          "id": "components-actionbar--on-background",
          "name": "On Background",
          "snippet": "const OnBackground = () => {\n    return (\n        <Box color=\"accent\" surface=\"primary\" overflow=\"hidden\">\n            <ActionBar>{[\n                    <ActionButton key=\"1\">\n                        <Icon name=\"plus\" />\n                    </ActionButton>,\n                    <ActionButton key=\"2\">\n                        <Icon name=\"pencil\" />\n                        Edit\n                    </ActionButton>,\n                    <ActionButton key=\"3\" color=\"accent\" emphasis=\"primary\">\n                        <Icon name=\"globe\" />\n                        Publish\n                    </ActionButton>,\n                    <ActionButton key=\"3\">\n                        <Icon name=\"placeholder\" />\n                        Overflow 1\n                    </ActionButton>,\n                    <ActionButton key=\"4\">\n                        <Icon name=\"placeholder\" />\n                        Overflow 2\n                    </ActionButton>,\n                    <ActionButton key=\"5\" toggled>\n                        <Icon name=\"placeholder\" />\n                        Overflow 3\n                    </ActionButton>,\n                ]}</ActionBar>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { ActionBar, ActionButton, Box, Icon } from '@a-type/ui';\nimport { ActionButton } from './ActionButton.js';\nimport { Icon } from '../icon/Icon.js';"
    },
    "components-autocomplete": {
      "id": "components-autocomplete",
      "name": "Autocomplete",
      "path": "./src/components/autocomplete/Autocomplete.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Autocomplete.create<Item>()` for typed suggestions, or `Autocomplete.createGrouped<Group>()` for groups with an `items` array. Compose `Input`, `Content`, `List`, and `Item`, and use `value` and `onValueChange` to control the input text.\n\n`Content` renders in a portal and accepts `arrow` and `positioner` options.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "AutocompleteIcon",
        "definedInFile": "/home/runner/work/ui/ui/src/components/autocomplete/Autocomplete.tsx",
        "actualName": "AutocompleteIcon",
        "exportName": "AutocompleteIcon"
      },
      "stories": [
        {
          "id": "components-autocomplete--default",
          "name": "Default",
          "snippet": "const Default = ({ arrow, autoHighlight, keepHighlight, highlightItemOnHover }) => {\n    const [value, setValue] = useState<string>('');\n    return (\n        <ExampleAutocomplete\n            value={value}\n            onValueChange={setValue}\n            items={items}\n            autoHighlight={autoHighlight}\n            keepHighlight={keepHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n        >\n            <ExampleAutocomplete.Input\n                icon={<Icon name=\"food\" />}\n                style={{ width: 200 }}\n            />\n            <ExampleAutocomplete.Content arrow={arrow}>\n                <ExampleAutocomplete.List>\n                    {(item) => (\n                        <ExampleAutocomplete.Item key={item.id} value={item.id}>\n                            {item.label}\n                        </ExampleAutocomplete.Item>\n                    )}\n                </ExampleAutocomplete.List>\n                <ExampleAutocomplete.Empty>\n                    No results found.\n                </ExampleAutocomplete.Empty>\n            </ExampleAutocomplete.Content>\n        </ExampleAutocomplete>\n    );\n};"
        },
        {
          "id": "components-autocomplete--grouped",
          "name": "Grouped",
          "snippet": "const Grouped = ({ arrow, autoHighlight, keepHighlight, highlightItemOnHover }) => {\n    const [value, setValue] = useState<string | undefined>(undefined);\n    return (\n        <GroupedAutocomplete\n            value={value}\n            onValueChange={setValue}\n            items={groupedItems}\n            autoHighlight={autoHighlight}\n            keepHighlight={keepHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n        >\n            <GroupedAutocomplete.Input />\n            <GroupedAutocomplete.Content arrow={arrow}>\n                <GroupedAutocomplete.List>\n                    {(group) => (\n                        <GroupedAutocomplete.Group key={group.category}>\n                            <GroupedAutocomplete.GroupLabel>\n                                {group.category}\n                            </GroupedAutocomplete.GroupLabel>\n                            <GroupedAutocomplete.GroupList>\n                                {group.items.map((item) => (\n                                    <GroupedAutocomplete.Item key={item.id} value={item.id}>\n                                        {item.label}\n                                    </GroupedAutocomplete.Item>\n                                ))}\n                            </GroupedAutocomplete.GroupList>\n                        </GroupedAutocomplete.Group>\n                    )}\n                </GroupedAutocomplete.List>\n                <GroupedAutocomplete.Empty>\n                    No results found.\n                </GroupedAutocomplete.Empty>\n                <GroupedAutocomplete.Separator />\n                <GroupedAutocomplete.Details>\n                    Select your favorite fruit or berry.\n                </GroupedAutocomplete.Details>\n            </GroupedAutocomplete.Content>\n        </GroupedAutocomplete>\n    );\n};"
        },
        {
          "id": "components-autocomplete--not-popover",
          "name": "Not Popover",
          "snippet": "const NotPopover = ({ autoHighlight, keepHighlight, highlightItemOnHover }) => {\n    const [value, setValue] = useState<string | undefined>(undefined);\n    return (\n        <GroupedAutocomplete\n            value={value}\n            onValueChange={setValue}\n            items={groupedItems}\n            autoHighlight={autoHighlight}\n            keepHighlight={keepHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n        >\n            <Box border p surface=\"ambient\" col>\n                <GroupedAutocomplete.Input\n                    disableCaret\n                    style={{ width: '100%' }}\n                    disableClear\n                >\n                    <Button\n                        size=\"small\"\n                        emphasis=\"primary\"\n                        style={{ aspectRatio: '1', height: '100%' }}\n                    >\n                        <Icon name=\"plus\" />\n                    </Button>\n                </GroupedAutocomplete.Input>\n                <GroupedAutocomplete.List>\n                    {(group) => (\n                        <GroupedAutocomplete.Group key={group.category}>\n                            <GroupedAutocomplete.GroupLabel>\n                                {group.category}\n                            </GroupedAutocomplete.GroupLabel>\n                            <GroupedAutocomplete.GroupList>\n                                {group.items.map((item) => (\n                                    <GroupedAutocomplete.Item key={item.id} value={item.id}>\n                                        {item.label}\n                                    </GroupedAutocomplete.Item>\n                                ))}\n                            </GroupedAutocomplete.GroupList>\n                        </GroupedAutocomplete.Group>\n                    )}\n                </GroupedAutocomplete.List>\n                <GroupedAutocomplete.Empty>\n                    No results found.\n                </GroupedAutocomplete.Empty>\n            </Box>\n        </GroupedAutocomplete>\n    );\n};"
        }
      ],
      "import": "import { Autocomplete, Box, Button, Icon } from '@a-type/ui';"
    },
    "components-avatar": {
      "id": "components-avatar",
      "name": "Avatar",
      "path": "./src/components/avatar/Avatar.stories.tsx",
      "jsDocTags": {},
      "description": "Pass `name` and optionally `imageSrc` to `Avatar`. It falls back to the first initial, or a profile icon when both are absent.\n\nFor overlapping avatars, use `AvatarList` with a `count` and an `index` on each `AvatarList.Item`.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Avatar",
        "definedInFile": "/home/runner/work/ui/ui/src/components/avatar/Avatar.tsx",
        "actualName": "Avatar",
        "exportName": "Avatar",
        "props": {
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "popIn": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "@deprecated"
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "imageSrc": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "string | null",
              "elements": [
                {
                  "name": "string"
                },
                {
                  "name": "null"
                }
              ]
            },
            "description": ""
          },
          "name": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "crossOrigin": {
            "required": false,
            "tsType": {
              "name": "HTMLProps['crossOrigin']",
              "raw": "HTMLProps<HTMLImageElement>['crossOrigin']"
            },
            "description": ""
          },
          "size": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "string | number",
              "elements": [
                {
                  "name": "string"
                },
                {
                  "name": "number"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "BaseAvatarProps"
        ]
      },
      "stories": [
        {
          "id": "components-avatar--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <Avatar />;\n};"
        },
        {
          "id": "components-avatar--with-image",
          "name": "With Image",
          "snippet": "const WithImage = () => <Avatar imageSrc=\"https://i.pravatar.cc/300\" name=\"John Doe\" />;"
        },
        {
          "id": "components-avatar--with-name",
          "name": "With Name",
          "snippet": "const WithName = () => <Avatar name=\"Jane Smith\" />;"
        },
        {
          "id": "components-avatar--failed-image",
          "name": "Failed Image",
          "snippet": "const FailedImage = () => <Avatar imageSrc=\"http://localhost:3333/nonexistent.jpg\" name=\"Fallback User\" />;"
        },
        {
          "id": "components-avatar--empty",
          "name": "Empty",
          "snippet": "const Empty = () => <Avatar name={undefined} imageSrc={undefined} />;"
        }
      ],
      "import": "import { Avatar } from '@a-type/ui';"
    },
    "components-box": {
      "id": "components-box",
      "name": "Box",
      "path": "./src/components/box/Box.stories.tsx",
      "jsDocTags": {},
      "description": "`Box` is a flex layout wrapper: it defaults to a row, and `col` switches to a column. Use `gap`, `p`, `items`, `justify`, and `surface` for common layout and styling needs.\n\nUse the `render` prop to render a different element while retaining the Box styles.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Box",
        "definedInFile": "/home/runner/work/ui/ui/src/components/box/Box.tsx",
        "actualName": "Box",
        "exportName": "Box",
        "props": {
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "col": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Apply flex-direction: column - default is row"
          },
          "reverse": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Reverse flex direction"
          },
          "items": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'center' | 'stretch' | 'start' | 'end'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'stretch'"
                },
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                }
              ]
            },
            "description": "Adjust align-items"
          },
          "justify": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "| 'center'\n| 'safe-center'\n| 'start'\n| 'stretch'\n| 'between'\n| 'around'\n| 'end'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'safe-center'"
                },
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'stretch'"
                },
                {
                  "name": "literal",
                  "value": "'between'"
                },
                {
                  "name": "literal",
                  "value": "'around'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                }
              ]
            },
            "description": "Adjust justify-content"
          },
          "layout": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "| `${BoxAlignment} ${BoxJustification}`\n| `${BoxAlignment & BoxJustification}`",
              "elements": [
                {
                  "name": "literal",
                  "value": "`${BoxAlignment} ${BoxJustification}`"
                },
                {
                  "name": "literal",
                  "value": "`${BoxAlignment & BoxJustification}`"
                }
              ]
            },
            "description": "Apply both align-items and justify-content together"
          },
          "gap": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "BoxSpacingSize | boolean",
              "elements": [
                {
                  "name": "union",
                  "raw": "'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'",
                  "elements": [
                    {
                      "name": "literal",
                      "value": "'none'"
                    },
                    {
                      "name": "literal",
                      "value": "'xs'"
                    },
                    {
                      "name": "literal",
                      "value": "'sm'"
                    },
                    {
                      "name": "literal",
                      "value": "'md'"
                    },
                    {
                      "name": "literal",
                      "value": "'lg'"
                    },
                    {
                      "name": "literal",
                      "value": "'xl'"
                    }
                  ]
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": "Adjust gap"
          },
          "wrap": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Add flex-wrap"
          },
          "p": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "BoxSpacingSize | boolean",
              "elements": [
                {
                  "name": "union",
                  "raw": "'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'",
                  "elements": [
                    {
                      "name": "literal",
                      "value": "'none'"
                    },
                    {
                      "name": "literal",
                      "value": "'xs'"
                    },
                    {
                      "name": "literal",
                      "value": "'sm'"
                    },
                    {
                      "name": "literal",
                      "value": "'md'"
                    },
                    {
                      "name": "literal",
                      "value": "'lg'"
                    },
                    {
                      "name": "literal",
                      "value": "'xl'"
                    }
                  ]
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": "Adjust padding"
          },
          "squish": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'vertical' | 'horizontal'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'vertical'"
                },
                {
                  "name": "literal",
                  "value": "'horizontal'"
                }
              ]
            },
            "description": "Reduce padding in one axis by one level"
          },
          "surface": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "boolean | 'ambient' | 'secondary' | 'primary'",
              "elements": [
                {
                  "name": "boolean"
                },
                {
                  "name": "literal",
                  "value": "'ambient'"
                },
                {
                  "name": "literal",
                  "value": "'secondary'"
                },
                {
                  "name": "literal",
                  "value": "'primary'"
                }
              ]
            },
            "description": "Apply surface intents"
          },
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'ambient' | 'secondary' | 'primary'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'ambient'"
                },
                {
                  "name": "literal",
                  "value": "'secondary'"
                },
                {
                  "name": "literal",
                  "value": "'primary'"
                }
              ]
            },
            "description": "Overlaps with 'surface' - use surface as a boolean when provided."
          },
          "border": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Add a default border"
          },
          "full": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "boolean | 'width' | 'height'",
              "elements": [
                {
                  "name": "boolean"
                },
                {
                  "name": "literal",
                  "value": "'width'"
                },
                {
                  "name": "literal",
                  "value": "'height'"
                }
              ]
            },
            "description": "Add 100% w/h"
          },
          "overflow": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'hidden' | 'clip' | 'auto' | 'auto-x' | 'auto-y'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'hidden'"
                },
                {
                  "name": "literal",
                  "value": "'clip'"
                },
                {
                  "name": "literal",
                  "value": "'auto'"
                },
                {
                  "name": "literal",
                  "value": "'auto-x'"
                },
                {
                  "name": "literal",
                  "value": "'auto-y'"
                }
              ]
            },
            "description": "Control overflow / scroll"
          },
          "grow": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Apply flex-grow"
          },
          "shrink": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Apply flex-shrink and min-width"
          },
          "elevated": {
            "required": false,
            "tsType": {
              "name": "literal",
              "value": "`${MaybeMinus}${ShadowSize}${MaybeUp}`"
            },
            "description": "Add shadow"
          },
          "rounded": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'xs' | 'sm' | 'md' | 'lg' | boolean",
              "elements": [
                {
                  "name": "literal",
                  "value": "'xs'"
                },
                {
                  "name": "literal",
                  "value": "'sm'"
                },
                {
                  "name": "literal",
                  "value": "'md'"
                },
                {
                  "name": "literal",
                  "value": "'lg'"
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": "@deprecated - use round",
            "defaultValue": {
              "value": "surface ? true : undefined",
              "computed": false
            }
          },
          "round": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'xs' | 'sm' | 'md' | 'lg' | boolean",
              "elements": [
                {
                  "name": "literal",
                  "value": "'xs'"
                },
                {
                  "name": "literal",
                  "value": "'sm'"
                },
                {
                  "name": "literal",
                  "value": "'md'"
                },
                {
                  "name": "literal",
                  "value": "'lg'"
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": "Adust border radius",
            "defaultValue": {
              "value": "rounded = surface ? true : undefined",
              "computed": false
            }
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ],
              "raw": "Ref<HTMLDivElement>"
            },
            "description": ""
          },
          "container": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "glass": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Adds transparency"
          },
          "dim": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Applies a gray foreground color"
          },
          "self": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'auto' | 'start' | 'end' | 'center' | 'stretch'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'auto'"
                },
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                },
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'stretch'"
                }
              ]
            },
            "description": ""
          },
          "m": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'auto' | 'y-auto' | 'x-auto'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'auto'"
                },
                {
                  "name": "literal",
                  "value": "'y-auto'"
                },
                {
                  "name": "literal",
                  "value": "'x-auto'"
                }
              ]
            },
            "description": "Use margin to center self in flex"
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-box--default",
          "name": "Default",
          "snippet": "const Default = () => <Box p=\"md\" gap=\"md\" border>(<>\n        <Button emphasis=\"primary\">Primary</Button>\n        <Button emphasis=\"ghost\">Ghost</Button>\n        <Button>Default</Button>\n    </>)</Box>;"
        },
        {
          "id": "components-box--surfaces",
          "name": "Surfaces",
          "snippet": "const Surfaces = () => {\n    return (\n        <div\n            className=\"bg-main-wash\"\n            style={{\n                display: 'grid',\n                gridTemplateColumns: 'repeat(2, 1fr)',\n                gap: 'var(--m-sp-lg)',\n            }}>\n            <Box surface=\"ambient\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Ambient\" />\n            </Box>\n            <Box surface=\"primary\" className=\"@mode-primary\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Primary\" />\n            </Box>\n            <Box surface=\"secondary\" className=\"@mode-primary\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Secondary\" />\n            </Box>\n            <Box surface className=\"@mode-accent\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Accent\" />\n            </Box>\n            <Box surface className=\"@mode-neutral\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Neutral\" />\n            </Box>\n            <Box surface className=\"@mode-attention\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Attention\" />\n            </Box>\n            <Box surface className=\"@mode-success\" p=\"lg\" col gap>\n                <SurfaceContent name=\"Success\" />\n            </Box>\n        </div>\n    );\n};"
        },
        {
          "id": "components-box--dim-comparison",
          "name": "Dim Comparison",
          "snippet": "const DimComparison = args => {\n    return (\n        <Box gap>\n            <Box dim>\n                Dimmed non-surface\n                <Text>Text</Text>\n                <Icon name=\"placeholder\" />\n            </Box>\n            <Box surface=\"ambient\" dim>\n                Dimmed box\n                <Text>Text</Text>\n                <Icon name=\"placeholder\" />\n            </Box>\n            <Box surface=\"primary\" dim>\n                Dimmed box\n                <Text>Text</Text>\n                <Icon name=\"placeholder\" />\n            </Box>\n            <Box surface=\"ambient\">\n                <Text dim>Dimmed text</Text>\n            </Box>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Checkbox, Icon, Progress, Slider, Switch, Text, ToggleGroup } from '@a-type/ui';\nimport { Button } from '../button/Button.js';"
    },
    "components-button": {
      "id": "components-button",
      "name": "Button",
      "path": "./src/components/button/Button.stories.tsx",
      "jsDocTags": {},
      "description": "Use `emphasis`, `size`, and `color` to style a `Button`. `loading` disables it, while `toggled` exposes a pressed state. Give icon-only buttons an accessible label.\n\n`ConfirmedButton` opens a confirmation dialog before calling `onConfirm`; `skip` bypasses the dialog.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Button",
        "definedInFile": "/home/runner/work/ui/ui/src/components/button/Button.tsx",
        "actualName": "ButtonRoot",
        "exportName": "ButtonRoot",
        "props": {
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'primary' | 'default' | 'ghost' | 'light' | 'unstyled'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'default'"
                },
                {
                  "name": "literal",
                  "value": "'ghost'"
                },
                {
                  "name": "literal",
                  "value": "'light'"
                },
                {
                  "name": "literal",
                  "value": "'unstyled'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'default'",
              "computed": false
            }
          },
          "size": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'default' | 'small' | 'wrapper'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'default'"
                },
                {
                  "name": "literal",
                  "value": "'small'"
                },
                {
                  "name": "literal",
                  "value": "'wrapper'"
                }
              ]
            },
            "description": ""
          },
          "toggled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "toggleMode": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'color-and-indicator' | 'color' | 'indicator' | 'state-only'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'color-and-indicator'"
                },
                {
                  "name": "literal",
                  "value": "'color'"
                },
                {
                  "name": "literal",
                  "value": "'indicator'"
                },
                {
                  "name": "literal",
                  "value": "'state-only'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'color-and-indicator'",
              "computed": false
            }
          },
          "visuallyDisabled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "loading": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "visuallyFocused": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableIconMode": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "forceIconMode": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLButtonElement"
                }
              ],
              "raw": "Ref<HTMLButtonElement>"
            },
            "description": ""
          },
          "disableDropdownTriggerIcon": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableDefaultLoadingIndicator": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "color": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'primary' | 'accent' | 'success' | 'attention'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'accent'"
                },
                {
                  "name": "literal",
                  "value": "'success'"
                },
                {
                  "name": "literal",
                  "value": "'attention'"
                }
              ]
            },
            "description": "Shortcuts for @mode-* classes."
          },
          "full": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'width' | 'height' | boolean",
              "elements": [
                {
                  "name": "literal",
                  "value": "'width'"
                },
                {
                  "name": "literal",
                  "value": "'height'"
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": ""
          },
          "align": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'start' | 'center' | 'end'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "ButtonHTMLAttributes",
          "Pick"
        ]
      },
      "stories": [
        {
          "id": "components-button--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Box col gap wrap full=\"width\">\n            <Box gap items=\"center\">\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\">Button</Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\">\n                    <Icon name=\"placeholder\" />\n                    Button\n                </Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    disabled>Disabled\n                                        </Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    size=\"small\">Button</Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    size=\"wrapper\">\n                    <Button.Icon render={<Avatar name=\"A\" />} />\n                </Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    size=\"small\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </Box>\n            <Box gap items=\"center\">\n                <Button\n                    loading={false}\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    emphasis=\"primary\">Primary\n                                        </Button>\n                <Button\n                    loading={false}\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    emphasis=\"default\">Default\n                                        </Button>\n                <Button\n                    loading={false}\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    emphasis=\"light\">Light\n                                        </Button>\n                <Button\n                    loading={false}\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    emphasis=\"ghost\">Ghost\n                                        </Button>\n                <Button\n                    loading={false}\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    emphasis=\"primary\"\n                    className=\"@mode-inverted\">Contrast\n                                        </Button>\n            </Box>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-button--all-buttons",
          "name": "All Buttons",
          "snippet": "const AllButtons = () => {\n    return (\n        <Box col gap>\n            <Box gap justify=\"between\">\n                {['primary', 'light', 'default', 'ghost'].map((emphasis) => (\n                    <ButtonStack\n                        key={emphasis}\n                        emphasis={emphasis as ButtonProps['emphasis']}\n                    />\n                ))}\n            </Box>\n            <Box gap surface justify=\"between\" className=\"@mode-success\">\n                {['primary', 'light', 'default', 'ghost'].map((emphasis) => (\n                    <ButtonStack\n                        key={emphasis}\n                        emphasis={emphasis as ButtonProps['emphasis']}\n                    />\n                ))}\n            </Box>\n            <Box gap surface justify=\"between\" className=\"@mode-attention\">\n                {['primary', 'light', 'default', 'ghost'].map((emphasis) => (\n                    <ButtonStack\n                        key={emphasis}\n                        emphasis={emphasis as ButtonProps['emphasis']}\n                    />\n                ))}\n            </Box>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-button--with-icon",
          "name": "With Icon",
          "snippet": "const WithIcon = () => <Button\n    loading={false}\n    emphasis=\"default\"\n    size=\"default\"\n    visuallyDisabled={false}\n    disabled={false}\n    visuallyFocused={false}\n    align=\"start\">(<>\n        <Icon name=\"placeholder\" />Iconic\n                    </>)</Button>;"
        },
        {
          "id": "components-button--icon-only",
          "name": "Icon Only",
          "snippet": "const IconOnly = () => <Button\n    loading={false}\n    emphasis=\"default\"\n    size=\"default\"\n    visuallyDisabled={false}\n    disabled={false}\n    visuallyFocused={false}\n    align=\"start\"><Icon name=\"placeholder\" /></Button>;"
        },
        {
          "id": "components-button--icon-transition",
          "name": "Icon Transition",
          "snippet": "const IconTransition = () => {\n    const [toggled, setToggled] = useState(false);\n\n    return (\n        <Button\n            loading={false}\n            emphasis=\"default\"\n            size=\"default\"\n            visuallyDisabled={false}\n            disabled={false}\n            visuallyFocused={false}\n            align=\"start\"\n            onClick={() => setToggled((v) => !v)}>\n            {toggled ? <Icon name=\"check\" /> : 'no icon'}\n        </Button>\n    );\n};"
        },
        {
          "id": "components-button--toggled",
          "name": "Toggled",
          "snippet": "const Toggled = () => {\n    const [on, setOn] = useState(false);\n    const toggle = () => setOn((v) => !v);\n\n    return (\n        <Button\n            loading={false}\n            emphasis=\"default\"\n            size=\"default\"\n            visuallyDisabled={false}\n            disabled={false}\n            visuallyFocused={false}\n            align=\"start\"\n            toggled={on}\n            onClick={toggle}>Button</Button>\n    );\n};"
        },
        {
          "id": "components-button--toggled-icon",
          "name": "Toggled Icon",
          "snippet": "const ToggledIcon = () => {\n    const [on, setOn] = useState(false);\n    const toggle = () => setOn((v) => !v);\n\n    return (\n        <Button\n            loading={false}\n            emphasis=\"default\"\n            size=\"default\"\n            visuallyDisabled={false}\n            disabled={false}\n            visuallyFocused={false}\n            align=\"start\"\n            toggled={on}\n            onClick={toggle}>\n            <Icon name=\"placeholder\" />\n        </Button>\n    );\n};"
        },
        {
          "id": "components-button--alignment",
          "name": "Alignment",
          "snippet": "const Alignment = () => {\n    return (\n        <div style={{ display: 'flex', flexDirection: 'column' }}>\n            <div\n                style={{\n                    display: 'flex',\n                    flexDirection: 'row',\n                    borderStyle: 'solid',\n                    borderWidth: 1,\n                }}>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    size=\"small\">Button\n                                        </Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    size=\"small\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </div>\n            <div\n                style={{\n                    display: 'flex',\n                    flexDirection: 'row',\n                    borderStyle: 'solid',\n                    borderWidth: 1,\n                }}>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\">Button</Button>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </div>\n        </div>\n    );\n};"
        },
        {
          "id": "components-button--confirmed-button-demo",
          "name": "Confirmed Button Demo",
          "snippet": "const ConfirmedButtonDemo = () => {\n    return (\n        <ConfirmedButton\n            confirmText=\"Are you sure?\"\n            confirmTitle=\"Confirm\"\n            onConfirm={() => console.log('confirmed')}\n            loading={false}\n            emphasis=\"default\"\n            size=\"default\"\n            visuallyDisabled={false}\n            disabled={false}\n            visuallyFocused={false}\n            align=\"start\">Confirm\n                        </ConfirmedButton>\n    );\n};"
        },
        {
          "id": "components-button--fragment-test",
          "name": "Fragment Test",
          "snippet": "const FragmentTest = () => {\n    return (\n        <Box gap items=\"center\">\n            <Button\n                loading={false}\n                emphasis=\"default\"\n                size=\"default\"\n                visuallyDisabled={false}\n                disabled={false}\n                visuallyFocused={false}\n                align=\"start\">\n                <>Button</>\n            </Button>\n            <Button\n                loading={false}\n                emphasis=\"default\"\n                size=\"default\"\n                visuallyDisabled={false}\n                disabled={false}\n                visuallyFocused={false}\n                align=\"start\">\n                <>\n                    <Icon name=\"placeholder\" />\n                    Button\n                </>\n            </Button>\n            <Button>\n                <>\n                    <Icon name=\"placeholder\" />\n                </>\n            </Button>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-button--skeleton-test",
          "name": "Skeleton Test",
          "snippet": "const SkeletonTest = () => {\n    return (\n        <Box gap items=\"center\">\n            <Button\n                loading={false}\n                emphasis=\"default\"\n                size=\"default\"\n                visuallyDisabled={false}\n                disabled={false}\n                visuallyFocused={false}\n                align=\"start\">\n                <TextSkeleton maxLength={10} />\n                <Icon name=\"placeholder\" />\n            </Button>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-button--full-size-test",
          "name": "Full Size Test",
          "snippet": "const FullSizeTest = () => {\n    return (\n        <Box col gap full=\"width\">\n            <Button\n                loading={false}\n                emphasis=\"default\"\n                size=\"default\"\n                visuallyDisabled={false}\n                disabled={false}\n                visuallyFocused={false}\n                align=\"start\"\n                full=\"width\">\n                <Icon name=\"placeholder\" />Full Width\n                                </Button>\n            <div style={{ width: '100%', aspectRatio: 1 }}>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    full=\"height\">\n                    <Icon name=\"placeholder\" />Full Height\n                                        </Button>\n            </div>\n            <div style={{ width: '100%', aspectRatio: 1 }}>\n                <Button\n                    loading={false}\n                    emphasis=\"default\"\n                    size=\"default\"\n                    visuallyDisabled={false}\n                    disabled={false}\n                    visuallyFocused={false}\n                    align=\"start\"\n                    full>Full Both\n                                        </Button>\n            </div>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Avatar, Box, Button, ConfirmedButton, Icon, TextSkeleton } from '@a-type/ui';\nimport { Icon } from '../icon/index.js';"
    },
    "components-camera": {
      "id": "components-camera",
      "name": "Camera",
      "path": "./src/components/camera/Camera.stories.tsx",
      "jsDocTags": {},
      "description": "`Camera` displays a live camera and sends a captured `File` to `onCapture`. Use `facingMode=\"environment\"` to request a rear-facing camera.\n\nCamera access requires browser permission and a secure context. `format` defaults to `image/png`, but photos taken with ImageCapture are not re-encoded to that format. Use `Camera.Root` and its controls for a custom layout.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "CameraRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/camera/Camera.tsx",
        "actualName": "CameraRoot",
        "exportName": "CameraRoot",
        "props": {
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "ReactCSSProperties",
              "raw": "React.CSSProperties"
            },
            "description": ""
          },
          "onCapture": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(data: File) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "File"
                    },
                    "name": "data"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "format": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'image/png' | 'image/jpeg'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'image/png'"
                },
                {
                  "name": "literal",
                  "value": "'image/jpeg'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'image/png'",
              "computed": false
            }
          },
          "facingMode": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'user' | 'environment'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'user'"
                },
                {
                  "name": "literal",
                  "value": "'environment'"
                }
              ]
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ],
              "raw": "Ref<HTMLDivElement>"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-camera--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <CameraDemo />;\n};"
        },
        {
          "id": "components-camera--back-camera",
          "name": "Back Camera",
          "snippet": "const BackCamera = () => {\n    return <CameraDemo facingMode=\"environment\" />;\n};"
        }
      ],
      "import": "import { Camera } from '@a-type/ui';"
    },
    "components-card": {
      "id": "components-card",
      "name": "CardRoot",
      "path": "./src/components/card/Card.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Card` with parts such as `Card.Main`, `Card.Title`, `Card.Content`, and `Card.Actions`. Set `size` or `emphasis` on the root, and use `Card.Grid` for a responsive masonry layout.\n\n`Card.Main` becomes interactive when given `onClick` or `render`; use `nonInteractive` to prevent that.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "CardRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/card/Card.tsx",
        "actualName": "CardRoot",
        "exportName": "CardRoot",
        "props": {
          "size": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'sm' | 'md' | 'lg'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'sm'"
                },
                {
                  "name": "literal",
                  "value": "'md'"
                },
                {
                  "name": "literal",
                  "value": "'lg'"
                }
              ]
            },
            "description": ""
          },
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'ambient' | 'secondary' | 'primary'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'ambient'"
                },
                {
                  "name": "literal",
                  "value": "'secondary'"
                },
                {
                  "name": "literal",
                  "value": "'primary'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'ambient'",
              "computed": false
            }
          },
          "render": {
            "required": false,
            "tsType": {
              "name": "UseRenderRenderProp",
              "elements": [
                {
                  "name": "signature",
                  "type": "object",
                  "raw": "{\n\temphasis?: 'ambient' | 'secondary' | 'primary';\n\tsize?: CardSize;\n}",
                  "signature": {
                    "properties": [
                      {
                        "key": "emphasis",
                        "value": {
                          "name": "union",
                          "raw": "'ambient' | 'secondary' | 'primary'",
                          "elements": [
                            {
                              "name": "literal",
                              "value": "'ambient'"
                            },
                            {
                              "name": "literal",
                              "value": "'secondary'"
                            },
                            {
                              "name": "literal",
                              "value": "'primary'"
                            }
                          ],
                          "required": false
                        }
                      },
                      {
                        "key": "size",
                        "value": {
                          "name": "union",
                          "raw": "'sm' | 'md' | 'lg'",
                          "elements": [
                            {
                              "name": "literal",
                              "value": "'sm'"
                            },
                            {
                              "name": "literal",
                              "value": "'md'"
                            },
                            {
                              "name": "literal",
                              "value": "'lg'"
                            }
                          ],
                          "required": false
                        }
                      }
                    ]
                  }
                }
              ],
              "raw": "UseRenderRenderProp<{\n\temphasis?: 'ambient' | 'secondary' | 'primary';\n\tsize?: CardSize;\n}>"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ],
              "raw": "Ref<HTMLDivElement>"
            },
            "description": ""
          }
        },
        "composes": [
          "HTMLAttributes"
        ]
      },
      "stories": [
        {
          "id": "components-card--default",
          "name": "Default",
          "snippet": "const Default = () => <div\n    style={{\n        display: 'flex',\n        flexDirection: 'row',\n        alignItems: 'stretch',\n        gap: 'var(--m-sp-md)',\n    }}>\n    <CardRoot style={{ minHeight: '20vh' }}>\n        <CardImage\n            render={\n                <img src=\"https://resources.biscuits.club/images/pashka.jpg\" />\n            } />\n        <CardMain onClick={() => alert('clicked')}>\n            <CardTitle>Card Title</CardTitle>\n            <CardContent>Other stuff you'd have on a card. Maybe a time?\n                                    </CardContent>\n            <CardContent>More things, if you want.</CardContent>\n        </CardMain>\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button size=\"small\" color=\"primary\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n            <CardMenu>\n                <Button size=\"small\" emphasis=\"ghost\">\n                    <Icon name=\"dots\" />\n                </Button>\n            </CardMenu>\n        </CardFooter>\n    </CardRoot>\n    <CardRoot style={{ maxWidth: 300 }}>\n        <CardMain onClick={() => alert('clicked')}>\n            <CardTitle>Card Title which is very long and would normally wrap\n                                    </CardTitle>\n            <CardContent>Other stuff</CardContent>\n            <CardContent unstyled>Styling optional</CardContent>\n        </CardMain>\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button size=\"small\" emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n</div>;"
        },
        {
          "id": "components-card--compact",
          "name": "Compact",
          "snippet": "const Compact = () => (\n    <CardRoot size=\"sm\">\n        <CardMain>\n            <CardTitle>Card Title</CardTitle>\n            <CardContent>Other stuff</CardContent>\n            <CardContent>More things, if you want.</CardContent>\n        </CardMain>\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button size=\"small\" emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n);"
        },
        {
          "id": "components-card--non-interactive",
          "name": "Non Interactive",
          "snippet": "const NonInteractive = () => (\n    <CardRoot>\n        <CardMain>\n            <CardTitle>Card Title</CardTitle>\n            <CardContent>Other stuff</CardContent>\n        </CardMain>\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n);"
        },
        {
          "id": "components-card--as-child",
          "name": "As Child",
          "snippet": "const AsChild = () => (\n    <CardRoot>\n        <CardMain\n            render={\n                <a href=\"#here\">\n                    <CardTitle>Card Title</CardTitle>\n                    <CardContent>Other stuff</CardContent>\n                </a>\n            }\n        />\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n);"
        },
        {
          "id": "components-card--as-child-non-interactive",
          "name": "As Child Non Interactive",
          "snippet": "const AsChildNonInteractive = () => (\n    <CardRoot>\n        <CardMain\n            nonInteractive\n            render={\n                <button>\n                    <CardTitle>Card Title</CardTitle>\n                    <CardContent>Other stuff</CardContent>\n                </button>\n            }\n        />\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n);"
        },
        {
          "id": "components-card--grid",
          "name": "Grid",
          "snippet": "const Grid = () => {\n    const [sizes, setSizes] = useState(() =>\n        Array.from({ length: 40 }, () => 50 + Math.floor(Math.random() * 300)),\n    );\n    const remove = (index: number) =>\n        setSizes((v) => v.filter((_, i) => i !== index));\n    const resize = (index: number) =>\n        setSizes((v) => {\n            const size = 50 + Math.floor(Math.random() * 300);\n            return v.map((s, i) => (i === index ? size : s));\n        });\n    return (\n        <Card.Grid>\n            {sizes.map((size, i) => (\n                <GridCard\n                    key={i}\n                    size={size}\n                    remove={() => remove(i)}\n                    resize={() => resize(i)}\n                />\n            ))}\n        </Card.Grid>\n    );\n};"
        },
        {
          "id": "components-card--grid-compact",
          "name": "Grid Compact",
          "snippet": "const GridCompact = () => {\n    const [sizes, setSizes] = useState(() =>\n        Array.from({ length: 40 }, () => 50 + Math.floor(Math.random() * 300)),\n    );\n    const remove = (index: number) =>\n        setSizes((v) => v.filter((_, i) => i !== index));\n    return (\n        <Card.Grid columns={cardGridColumns.small}>\n            {sizes.map((size, i) => (\n                <GridCard key={i} size={size} remove={() => remove(i)} />\n            ))}\n        </Card.Grid>\n    );\n};"
        },
        {
          "id": "components-card--visually-focused",
          "name": "Visually Focused",
          "snippet": "const VisuallyFocused = () => (\n    <CardRoot>\n        <CardMain visuallyFocused onClick={() => {}}>\n            <CardTitle>Card Title</CardTitle>\n            <CardContent>Other stuff</CardContent>\n        </CardMain>\n        <CardFooter>\n            <CardActions>\n                <Button size=\"small\">Button</Button>\n                <Button emphasis=\"ghost\">\n                    <Icon name=\"placeholder\" />\n                </Button>\n            </CardActions>\n        </CardFooter>\n    </CardRoot>\n);"
        },
        {
          "id": "components-card--cards-in-box",
          "name": "Cards In Box",
          "snippet": "const CardsInBox = () => {\n    return (\n        <div\n            style={{\n                width: '100%',\n                display: 'flex',\n                flexDirection: 'row',\n                gap: 'var(--m-sp-lg)',\n            }}\n        >\n            <div style={{ flex: 1 }}>\n                <CardRoot>\n                    <CardMain onClick={() => {}}>\n                        <CardTitle>Card Title</CardTitle>\n                        <CardContent>Other stuff</CardContent>\n                    </CardMain>\n                    <CardFooter>\n                        <CardActions>\n                            <Button size=\"small\">Button</Button>\n                            <Button emphasis=\"ghost\" size=\"small\">\n                                <Icon name=\"placeholder\" />\n                            </Button>\n                        </CardActions>\n                    </CardFooter>\n                </CardRoot>\n            </div>\n            <Box p gap col grow>\n                <CardRoot>\n                    <CardMain onClick={() => {}}>\n                        <CardTitle>Card Title</CardTitle>\n                        <CardContent>Other stuff</CardContent>\n                    </CardMain>\n                    <CardFooter>\n                        <CardActions>\n                            <Button size=\"small\">Button</Button>\n                            <Button emphasis=\"ghost\" size=\"small\">\n                                <Icon name=\"placeholder\" />\n                            </Button>\n                        </CardActions>\n                    </CardFooter>\n                </CardRoot>\n                <CardRoot>\n                    <CardMain onClick={() => {}}>\n                        <CardTitle>Card Title</CardTitle>\n                        <CardContent>Other stuff</CardContent>\n                    </CardMain>\n                    <CardFooter>\n                        <CardActions>\n                            <Button size=\"small\">Button</Button>\n                            <Button emphasis=\"ghost\" size=\"small\">\n                                <Icon name=\"placeholder\" />\n                            </Button>\n                        </CardActions>\n                    </CardFooter>\n                </CardRoot>\n            </Box>\n        </div>\n    );\n};"
        },
        {
          "id": "components-card--edge-cases",
          "name": "Edge Cases",
          "snippet": "const EdgeCases = () => {\n    return (\n        <Box p gap grow>\n            <CardRoot>\n                <CardMain onClick={() => {}}>\n                    <CardTitle>Card Title</CardTitle>\n                    <CardContent>Other stuff</CardContent>\n                </CardMain>\n                <CardFooter>\n                    <CardActions>\n                        <Button size=\"small\">Button</Button>\n                        <Button emphasis=\"ghost\" size=\"small\">\n                            <Icon name=\"placeholder\" />\n                        </Button>\n                    </CardActions>\n                </CardFooter>\n            </CardRoot>\n            <CardRoot>\n                <CardMain onClick={() => {}}>\n                    <CardTitle>Card Title</CardTitle>\n                </CardMain>\n            </CardRoot>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import {\n  Box,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardFooter,\n  CardImage,\n  CardMain,\n  CardMenu,\n  CardRoot,\n  CardTitle,\n  Icon,\n} from '@a-type/ui';"
    },
    "components-checkbox": {
      "id": "components-checkbox",
      "name": "Checkbox",
      "path": "./src/components/checkbox/Checkbox.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Checkbox` with a label and, when controlled, `checked` and `onCheckedChange`. Set `checkedMode=\"faded\"` to de-emphasize checked items, such as completed tasks.\n\nFor custom composition, use `Checkbox.Root` and `Checkbox.Indicator`.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Checkbox",
        "definedInFile": "/home/runner/work/ui/ui/src/components/checkbox/Checkbox.tsx",
        "actualName": "Checkbox",
        "exportName": "Checkbox",
        "props": {
          "checkedMode": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'prominent' | 'faded'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'prominent'"
                },
                {
                  "name": "literal",
                  "value": "'faded'"
                }
              ]
            },
            "description": "The checked visual state. Prominent mode means the checked version is visually\nemphasized to the user. Faded means the checked version is visually de-emphasized.\nProminent is appropriate when the user's attention should be drawn to the 'on' state,\nwhile faded is appropriate when a checked state means the item is 'done,' like in a task list."
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLButtonElement"
                }
              ],
              "raw": "Ref<HTMLButtonElement>"
            },
            "description": ""
          }
        },
        "composes": [
          "CheckboxRootProps"
        ]
      },
      "stories": [
        {
          "id": "components-checkbox--default",
          "name": "Default",
          "snippet": "const Default = () => <Checkbox />;"
        }
      ],
      "import": "import { Checkbox } from '@a-type/ui';"
    },
    "components-chip": {
      "id": "components-chip",
      "name": "Chip",
      "path": "./src/components/chip/Chip.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Chip` for a compact label or piece of metadata. Choose `emphasis` to change its appearance.\n\nFor an interactive chip, use `render` with a semantic button or link so it is keyboard accessible.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Chip",
        "definedInFile": "/home/runner/work/ui/ui/src/components/chip/Chip.tsx",
        "actualName": "Chip",
        "exportName": "Chip",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "any"
                }
              ],
              "raw": "Ref<any>"
            },
            "description": ""
          },
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'default' | 'primary' | 'ambient'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'default'"
                },
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'ambient'"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "UseRenderComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-chip--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <Chip emphasis=\"default\">Chip</Chip>;\n};"
        },
        {
          "id": "components-chip--colors",
          "name": "Colors",
          "snippet": "const Colors = () => {\n    return (\n        <div style={{ display: 'flex', gap: '12px' }}>\n            <Chip className=\"@mode-neutral\">Gray</Chip>\n            <Chip>Primary</Chip>\n            <Chip className=\"@mode-accent\">Accent</Chip>\n            <Chip className=\"@mode-attention\">Attention</Chip>\n            <Chip className=\"@mode-success\">Success</Chip>\n            <Chip className=\"@mode-lemon\">Lemon</Chip>\n            <Chip className=\"@mode-leek\">Leek</Chip>\n            <Chip className=\"@mode-tomato\">Tomato</Chip>\n            <Chip className=\"@mode-blueberry\">Blueberry</Chip>\n            <Chip className=\"@mode-eggplant\">Eggplant</Chip>\n        </div>\n    );\n};"
        },
        {
          "id": "components-chip--as-button",
          "name": "As Button",
          "snippet": "const AsButton = () => {\n    return (\n        <Box gap items=\"center\">\n            <Chip render={<Button />} emphasis=\"primary\">Clickable Chip\n                                </Chip>\n            <Chip emphasis=\"default\">Non-clickable Chip</Chip>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Chip } from '@a-type/ui';"
    },
    "components-collapsiblesimple": {
      "id": "components-collapsiblesimple",
      "name": "CollapsibleSimple",
      "path": "./src/components/collapsible/Collapsible.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Collapsible` with `Collapsible.Trigger` and `Collapsible.Content`, or use `Collapsible.Simple` when the open state is managed elsewhere.\n\nContent animates vertically by default; set `horizontal` or `both` for other directions.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "CollapsibleSimple",
        "definedInFile": "/home/runner/work/ui/ui/src/components/collapsible/Collapsible.tsx",
        "actualName": "CollapsibleSimple",
        "exportName": "CollapsibleSimple",
        "props": {
          "horizontal": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "both": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-collapsiblesimple--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    const [count, setCount] = useState(2);\n    const [open, setOpen] = useState(false);\n\n    return (\n        <>\n            <CollapsibleSimple open={open}>\n                <button onClick={() => setCount(count + 1)}>Increment</button>\n                <button onClick={() => setCount(count - 1)}>Decrement</button>\n                {new Array(count).fill(null).map((_, i) => (\n                    <div key={i}>Item {i}</div>\n                ))}\n            </CollapsibleSimple>\n            <button onClick={() => setOpen(!open)}>Toggle</button>\n        </>\n    );\n};"
        }
      ],
      "import": "import { CollapsibleSimple } from '@a-type/ui';"
    },
    "components-colormodetoggle": {
      "id": "components-colormodetoggle",
      "name": "ColorModeToggle",
      "path": "./src/components/colorMode/ColorModeToggle.stories.tsx",
      "jsDocTags": {},
      "description": "`ColorModeToggle` offers system, light, and dark modes. By default it uses the shared color mode and persists explicit choices in local storage.\n\nPass `value` and `onValueChange` to manage the selection yourself; providing the callback replaces the default update.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ColorModeToggle",
        "definedInFile": "/home/runner/work/ui/ui/src/components/colorMode/ColorModeToggle.tsx",
        "actualName": "ColorModeToggle",
        "exportName": "ColorModeToggle",
        "props": {
          "value": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'light' | 'dark' | 'system'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'light'"
                },
                {
                  "name": "literal",
                  "value": "'dark'"
                },
                {
                  "name": "literal",
                  "value": "'system'"
                }
              ]
            },
            "description": ""
          },
          "onValueChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: 'light' | 'dark' | 'system', event: any) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "union",
                      "raw": "'light' | 'dark' | 'system'",
                      "elements": [
                        {
                          "name": "literal",
                          "value": "'light'"
                        },
                        {
                          "name": "literal",
                          "value": "'dark'"
                        },
                        {
                          "name": "literal",
                          "value": "'system'"
                        }
                      ]
                    },
                    "name": "value"
                  },
                  {
                    "type": {
                      "name": "any"
                    },
                    "name": "event"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-colormodetoggle--default",
          "name": "Default",
          "snippet": "const Default = () => <ColorModeToggle />;"
        }
      ],
      "import": "import { ColorModeToggle } from '@a-type/ui';"
    },
    "components-combobox": {
      "id": "components-combobox",
      "name": "Combobox",
      "path": "./src/components/combobox/Combobox.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Combobox.create<Item>()` or `Combobox.createGrouped<Group>()` to select from typed items. Compose `Input`, `Content`, `List`, and `Item`; control selection with `value` and `onValueChange`.\n\nThe search text can be controlled separately with `inputValue` and `onInputValueChange`. Use `onCreate` and optionally `showCreatableItem` to offer new values.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ComboboxComposedInput",
        "definedInFile": "/home/runner/work/ui/ui/src/components/combobox/Combobox.tsx",
        "actualName": "ComboboxComposedInput",
        "exportName": "ComboboxComposedInput",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          },
          "icon": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "disableCaret": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableClear": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "open": {
            "required": true,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "render": {
            "required": false,
            "tsType": {
              "name": "InputProps['render']",
              "raw": "InputProps['render']"
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-combobox--default",
          "name": "Default",
          "snippet": "const Default = ({ arrow, autoHighlight, highlightItemOnHover, creatable }) => {\n    const [value, setValue] = useState<Item | null>(null);\n    const allItems =\n        value && items.includes(value)\n            ? items\n            : value\n            ? [value, ...items]\n            : items;\n    return (\n        <ExampleCombobox\n            value={value}\n            onValueChange={setValue}\n            items={allItems}\n            autoHighlight={autoHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n            showCreatableItem={creatable}\n            onCreate={\n                creatable\n                    ? (value: string) => {\n                            console.log('Creating item:', value);\n                            setValue({ id: value, label: value });\n                      }\n                    : undefined\n            }\n        >\n            <ExampleCombobox.Input\n                icon={<Icon name=\"food\" />}\n                style={{ width: 200 }}\n            >\n                {creatable && (\n                    <ExampleCombobox.CreateButton\n                        size=\"small\"\n                        emphasis=\"primary\"\n                        style={{ aspectRatio: '1', height: '100%' }}\n                    >\n                        <Icon name=\"plus\" />\n                    </ExampleCombobox.CreateButton>\n                )}\n            </ExampleCombobox.Input>\n            <ExampleCombobox.Content arrow={arrow}>\n                <ExampleCombobox.List>\n                    {(item) => (\n                        <ExampleCombobox.Item key={item.id} value={item}>\n                            {item.label}\n                        </ExampleCombobox.Item>\n                    )}\n                </ExampleCombobox.List>\n                <ExampleCombobox.Empty>No results found.</ExampleCombobox.Empty>\n            </ExampleCombobox.Content>\n        </ExampleCombobox>\n    );\n};"
        },
        {
          "id": "components-combobox--grouped",
          "name": "Grouped",
          "snippet": "const Grouped = ({ arrow, autoHighlight, highlightItemOnHover, creatable }) => {\n    const [value, setValue] = useState<Item | null>(null);\n    const [input, setInput] = useState<string>('');\n    return (\n        <GroupedCombobox\n            value={value}\n            onValueChange={setValue}\n            inputValue={input}\n            onInputValueChange={setInput}\n            items={groupedItems}\n            autoHighlight={autoHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n            onCreate={\n                creatable\n                    ? (value: string) => alert(`Create item: ${value}`)\n                    : undefined\n            }\n        >\n            <GroupedCombobox.Input placeholder=\"Select an item...\" />\n            <GroupedCombobox.Content arrow={arrow}>\n                <GroupedCombobox.List>\n                    {(group) => (\n                        <GroupedCombobox.Group key={group.category}>\n                            <GroupedCombobox.GroupLabel>\n                                {group.category}\n                            </GroupedCombobox.GroupLabel>\n                            <GroupedCombobox.GroupList>\n                                {group.items.map((item) => (\n                                    <GroupedCombobox.Item\n                                        key={item.id}\n                                        value={item}\n                                        className={`@mode-${group.color}`}\n                                    >\n                                        {item.label}\n                                    </GroupedCombobox.Item>\n                                ))}\n                            </GroupedCombobox.GroupList>\n                        </GroupedCombobox.Group>\n                    )}\n                </GroupedCombobox.List>\n                <GroupedCombobox.Empty>\n                    {creatable ? (\n                        <div>\n                            <Icon name=\"enterKey\" /> Create \"{input}\"\n                        </div>\n                    ) : (\n                        `No results found.`\n                    )}\n                </GroupedCombobox.Empty>\n                <GroupedCombobox.Separator />\n                <Combobox.Details>\n                    Select your favorite fruit or berry.\n                    {creatable ? ' Enter creates a new item.' : ''}\n                </Combobox.Details>\n            </GroupedCombobox.Content>\n        </GroupedCombobox>\n    );\n};"
        },
        {
          "id": "components-combobox--not-popover",
          "name": "Not Popover",
          "snippet": "const NotPopover = ({ autoHighlight, highlightItemOnHover, creatable }) => {\n    const [value, setValue] = useState<Item | null>(null);\n    return (\n        <GroupedCombobox\n            value={value}\n            onValueChange={setValue}\n            items={groupedItems}\n            autoHighlight={autoHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n            onCreate={\n                creatable\n                    ? (value: string) => alert(`Create item: ${value}`)\n                    : undefined\n            }\n        >\n            <Box border p surface=\"ambient\" col items=\"stretch\">\n                <GroupedCombobox.Input\n                    style={{ width: '100%' }}\n                    disableCaret\n                    disableClear\n                >\n                    <GroupedCombobox.CreateButton\n                        size=\"small\"\n                        emphasis=\"primary\"\n                        style={{\n                            aspectRatio: '1',\n                            height: '100%',\n                        }}\n                    >\n                        <Icon name=\"plus\" />\n                    </GroupedCombobox.CreateButton>\n                </GroupedCombobox.Input>\n                <GroupedCombobox.List>\n                    {(group) => (\n                        <GroupedCombobox.Group key={group.category}>\n                            <GroupedCombobox.GroupLabel>\n                                {group.category}\n                            </GroupedCombobox.GroupLabel>\n                            <GroupedCombobox.GroupList>\n                                {group.items.map((item) => (\n                                    <GroupedCombobox.Item key={item.id} value={item}>\n                                        {item.label}\n                                    </GroupedCombobox.Item>\n                                ))}\n                            </GroupedCombobox.GroupList>\n                        </GroupedCombobox.Group>\n                    )}\n                </GroupedCombobox.List>\n                <GroupedCombobox.Empty>No results found.</GroupedCombobox.Empty>\n            </Box>\n        </GroupedCombobox>\n    );\n};"
        },
        {
          "id": "components-combobox--multi-select",
          "name": "Multi Select",
          "snippet": "const MultiSelect = ({ arrow, autoHighlight, highlightItemOnHover, creatable }) => {\n    const [value, setValue] = useState<Item[]>([]);\n    return (\n        <ExampleCombobox.Multi\n            multiple\n            value={value}\n            onValueChange={setValue}\n            items={items}\n            autoHighlight={autoHighlight}\n            highlightItemOnHover={highlightItemOnHover}\n            showCreatableItem={creatable}\n        >\n            <ExampleCombobox.Chips style={{ width: 300 }}>\n                <ExampleCombobox.MultiValue>\n                    {(items) => (\n                        <>\n                            <ExampleCombobox.ChipsList>\n                                {items.map((item) => (\n                                    <ExampleCombobox.Chip key={item.id} color={'accent'}>\n                                        {item.label}\n                                    </ExampleCombobox.Chip>\n                                ))}\n                            </ExampleCombobox.ChipsList>\n                            <ExampleCombobox.Input />\n                        </>\n                    )}\n                </ExampleCombobox.MultiValue>\n            </ExampleCombobox.Chips>\n            <ExampleCombobox.Content arrow={arrow}>\n                <ExampleCombobox.List render={<ExampleCombobox.GroupItemList />}>\n                    {(item) => (\n                        <ExampleCombobox.GroupItem key={item.id} value={item}>\n                            {item.label}\n                        </ExampleCombobox.GroupItem>\n                    )}\n                </ExampleCombobox.List>\n                <ExampleCombobox.Empty>No results found.</ExampleCombobox.Empty>\n            </ExampleCombobox.Content>\n        </ExampleCombobox.Multi>\n    );\n};"
        }
      ],
      "import": "import { Box, Combobox, Icon } from '@a-type/ui';"
    },
    "components-contextmenu": {
      "id": "components-contextmenu",
      "name": "ContextMenu",
      "path": "./src/components/contextMenu/contextMenu.stories.tsx",
      "jsDocTags": {},
      "description": "Wrap a target in `ContextMenu.Trigger` and put `ContextMenu.Item` elements inside `ContextMenu.Content`. Use `onSelect` on items to handle actions.\n\nThe menu opens from the context-menu gesture, renders in a portal, and stops click propagation from its content.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ContextMenuContent",
        "definedInFile": "/home/runner/work/ui/ui/src/components/contextMenu/contextMenu.tsx",
        "actualName": "ContextMenuContent",
        "exportName": "ContextMenuContent",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-contextmenu--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <ContextMenu>\n            <ContextMenu.Trigger>\n                <Button>Right Click Me</Button>\n            </ContextMenu.Trigger>\n            <ContextMenu.Content>\n                <ContextMenu.Item onSelect={() => alert('Item 1 selected')}>Item 1\n                                        </ContextMenu.Item>\n                <ContextMenu.Item onSelect={() => alert('Item 2 selected')}>Item 2\n                                        </ContextMenu.Item>\n                <ContextMenu.Item onSelect={() => alert('Item 3 selected')}>Item 3\n                                        </ContextMenu.Item>\n            </ContextMenu.Content>\n        </ContextMenu>\n    );\n};"
        }
      ],
      "import": "import { Button, ContextMenu } from '@a-type/ui';"
    },
    "components-datepicker": {
      "id": "components-datepicker",
      "name": "DatePicker",
      "path": "./src/components/datePicker/DatePicker.stories.tsx",
      "jsDocTags": {},
      "description": "`DatePicker` is controlled with a `Date | null` value and `onChange`. `DateRangePicker` uses the same pattern with `{ start, end }`, where each date may be null.\n\nBoth start by displaying the current month. Use their `Root` and calendar parts to customize the layout.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "DatePickerDefault",
        "definedInFile": "/home/runner/work/ui/ui/src/components/datePicker/DatePicker.tsx",
        "actualName": "DatePickerDefault",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "union",
              "raw": "Date | null",
              "elements": [
                {
                  "name": "Date"
                },
                {
                  "name": "null"
                }
              ]
            },
            "description": ""
          },
          "onChange": {
            "required": true,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(date: Date | null) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "union",
                      "raw": "Date | null",
                      "elements": [
                        {
                          "name": "Date"
                        },
                        {
                          "name": "null"
                        }
                      ]
                    },
                    "name": "date"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-datepicker--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    const [value, setValue] = useState<Date | null>(null);\n    return <DatePicker value={value} onChange={setValue} />;\n};"
        },
        {
          "id": "components-datepicker--range",
          "name": "Range",
          "snippet": "const Range = () => {\n    const [value, setValue] = useState<{\n        start: Date | null;\n        end: Date | null;\n    }>({ start: null, end: null });\n    return <DateRangePicker value={value} onChange={setValue} />;\n};"
        },
        {
          "id": "components-datepicker--custom-composition",
          "name": "Custom Composition",
          "snippet": "const CustomComposition = () => {\n    const [value, setValue] = useState<Date | null>(null);\n\n    return (\n        <DatePicker.Root value={value} onChange={setValue}>\n            <DatePicker.MonthControls />\n            <DatePicker.CalendarGrid>\n                {(value) => <FakeLoadingDay value={value} key={value.key} />}\n            </DatePicker.CalendarGrid>\n        </DatePicker.Root>\n    );\n};"
        }
      ],
      "import": "import { DatePicker, DateRangePicker, Spinner } from '@a-type/ui';"
    },
    "components-dialog": {
      "id": "components-dialog",
      "name": "Dialog",
      "path": "./src/components/dialog/Dialog.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Dialog` with `Dialog.Trigger`, `Dialog.Content`, and a `Dialog.Title`; add `Description`, `Actions`, or `Close` as needed. Control it with `open` and `onOpenChange`, or use `defaultOpen`.\n\nOn screens at most 600px wide, it becomes a drawer unless `disableSheet` is set. Content includes a close button by default; use `disableDefaultClose` to remove it.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "DialogRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/dialog/Dialog.tsx",
        "actualName": "DialogRoot",
        "props": {
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "disableSheet": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-dialog--default",
          "name": "Default",
          "snippet": "const Default = () => <Dialog>(<ParticleLayer noPortal>\n        <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n        <DummyContent />\n        <Dialog.Content>\n            <Dialog.Title>Hello world</Dialog.Title>\n            <DummyContent />\n            <DummyContent />\n            <DummyContent />\n            <Box gap>\n                <Input placeholder=\"Type something...\" />\n                <Button emphasis=\"primary\">Submit</Button>\n            </Box>\n            <Dialog.Actions>\n                <Dialog.Close />\n                <Button emphasis=\"primary\">Accept</Button>\n            </Dialog.Actions>\n        </Dialog.Content>\n    </ParticleLayer>)</Dialog>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-dialog--small",
          "name": "Small",
          "snippet": "const Small = () => <Dialog>(<ParticleLayer noPortal>\n        <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n        <DummyContent />\n        <Dialog.Content>\n            <Dialog.Title>Hello world</Dialog.Title>\n            <DummyContent />\n            <Dialog.Actions>\n                <Dialog.Close />\n            </Dialog.Actions>\n        </Dialog.Content>\n    </ParticleLayer>)</Dialog>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-dialog--no-sheet",
          "name": "No Sheet",
          "snippet": "const NoSheet = () => <Dialog disableSheet>(<ParticleLayer noPortal>\n        <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n        <DummyContent />\n        <Dialog.Content>\n            <Dialog.Title>Hello world</Dialog.Title>\n            <Dialog.Actions>\n                <Dialog.Close />\n            </Dialog.Actions>\n        </Dialog.Content>\n    </ParticleLayer>)</Dialog>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-dialog--positioned",
          "name": "Positioned",
          "snippet": "const Positioned = () => <Dialog>(<ParticleLayer noPortal>\n        <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n        <DummyContent />\n        <Dialog.Content style={{ bottom: 0, top: 'auto' }}>\n            <Dialog.Title>Hello world</Dialog.Title>\n            <Dialog.Actions>\n                <Dialog.Close />\n            </Dialog.Actions>\n        </Dialog.Content>\n    </ParticleLayer>)</Dialog>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-dialog--virtual-keyboard",
          "name": "Virtual Keyboard",
          "snippet": "const VirtualKeyboard = () => {\n    const [keyboard, setKeyboard] = useState(false);\n\n    useEffect(() => {\n        if (keyboard) {\n            document.body.style.setProperty(\n                '--mock-virtual-keyboard-height',\n                '300px',\n            );\n        } else {\n            document.body.style.removeProperty('--mock-virtual-keyboard-height');\n        }\n    }, [keyboard]);\n\n    return (\n        <Provider virtualKeyboardBehavior=\"overlay\">\n            <Dialog>\n                <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n                <DummyContent />\n                <Dialog.Content>\n                    <Dialog.Title>Hello world</Dialog.Title>\n                    <Input />\n                    <Dialog.Actions>\n                        <Dialog.Close />\n                        <Button onClick={() => setKeyboard((v) => !v)}>\n                            Toggle fake kb\n                        </Button>\n                    </Dialog.Actions>\n                </Dialog.Content>\n            </Dialog>\n            <div\n                className=\"bg-neutral-ink\"\n                style={{\n                    position: 'fixed',\n                    bottom: 0,\n                    left: 0,\n                    right: 0,\n                    height: 'var(--mock-virtual-keyboard-height,0)',\n                    width: '100%',\n                    transition: 'height var(--m-dur) var(--m-ease)',\n                }}\n            />\n        </Provider>\n    );\n};"
        },
        {
          "id": "components-dialog--multi-nested",
          "name": "Multi Nested",
          "snippet": "const MultiNested = () => {\n    return (\n        <Dialog>\n            <Dialog.Trigger render={<Button />}>Open</Dialog.Trigger>\n            <Dialog.Content>\n                <Dialog.Title>Hello world</Dialog.Title>\n                <DummyContent />\n                <Select value=\"\">\n                    <Select.Trigger>\n                        <Select.Value />\n                    </Select.Trigger>\n                    <Select.Content>\n                        <Select.Item value={null}>Select an option</Select.Item>\n                        <Select.Item value=\"option1\">Option 1</Select.Item>\n                        <Select.Item value=\"option2\">Option 2</Select.Item>\n                        <Select.Item value=\"option3\">Option 3</Select.Item>\n                    </Select.Content>\n                </Select>\n                <Dialog>\n                    <Dialog.Trigger render={<Button />}>Open nested</Dialog.Trigger>\n                    <Dialog.Content>\n                        <Dialog.Title>Nested dialog</Dialog.Title>\n                        <Tooltip content=\"This is a tooltip\">\n                            <Button>Hover me</Button>\n                        </Tooltip>\n                        <DummyContent />\n                        <DummyContent />\n                    </Dialog.Content>\n                </Dialog>\n            </Dialog.Content>\n        </Dialog>\n    );\n};"
        },
        {
          "id": "components-dialog--selectable",
          "name": "Selectable",
          "snippet": "const Selectable = () => {\n    return (\n        <Dialog>\n            <Dialog.SelectTrigger>Open</Dialog.SelectTrigger>\n            <Dialog.Content>\n                <Dialog.Title>Hello world</Dialog.Title>\n                <Dialog.SelectList>\n                    <Dialog.SelectItem value=\"option1\">Option 1</Dialog.SelectItem>\n                    <Dialog.SelectItem value=\"option2\">Option 2</Dialog.SelectItem>\n                    <Dialog.SelectItem value=\"option3\">Option 3</Dialog.SelectItem>\n                </Dialog.SelectList>\n            </Dialog.Content>\n        </Dialog>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Dialog, H1, Input, P, ParticleLayer, Provider, Select, Tooltip } from '@a-type/ui';\nimport { ParticleLayer } from '../particles/index.js';\nimport { Dialog } from './Dialog.js';\nimport { Button } from '../button/index.js';\nimport { Box } from '../box/Box.js';\nimport { Input } from '../input/index.js';"
    },
    "components-drawer": {
      "id": "components-drawer",
      "name": "Drawer",
      "path": "./src/components/drawer/Drawer.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Drawer` with `Trigger`, `Content`, `Title`, and optional `Description` and `Actions` parts. Use `open` and `onOpenChange` when controlling it externally.\n\nThe drawer swipes downward. Content includes a swipe handle and close button; `disableDefaultClose` removes the button.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "DrawerRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/drawer/Drawer.tsx",
        "actualName": "DrawerRoot",
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-drawer--default",
          "name": "Default",
          "snippet": "const Default = () => <Drawer>(<>\n        <Drawer.Trigger render={<Button />}>Open</Drawer.Trigger>\n        <Drawer.Content>\n            <Drawer.Title>Hello world</Drawer.Title>\n            <DummyContent />\n            <Drawer.Actions>\n                <Drawer.Close />\n                <Button emphasis=\"primary\">Accept</Button>\n            </Drawer.Actions>\n        </Drawer.Content>\n    </>)</Drawer>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-drawer--no-default-close",
          "name": "No Default Close",
          "snippet": "const NoDefaultClose = () => <Drawer>(<>\n        <Drawer.Trigger render={<Button />}>Open</Drawer.Trigger>\n        <Drawer.Content disableDefaultClose>\n            <Drawer.Title>No default close</Drawer.Title>\n            <DummyContent />\n            <Drawer.Actions>\n                <Drawer.Close />\n            </Drawer.Actions>\n        </Drawer.Content>\n    </>)</Drawer>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        },
        {
          "id": "components-drawer--small",
          "name": "Small",
          "snippet": "const Small = () => <Drawer>(<>\n        <Drawer.Trigger render={<Button />}>Open</Drawer.Trigger>\n        <Drawer.Content>\n            <Drawer.Title>Small drawer</Drawer.Title>\n            <Drawer.Actions>\n                <Drawer.Close />\n                <Button emphasis=\"primary\">Accept</Button>\n            </Drawer.Actions>\n        </Drawer.Content>\n    </>)</Drawer>;"
        },
        {
          "id": "components-drawer--snap-points",
          "name": "Snap Points",
          "snippet": "const SnapPoints = () => <Drawer snapPoints={[0.5, 1]}>(<>\n        <Drawer.Trigger render={<Button />}>Open</Drawer.Trigger>\n        <Drawer.Content>\n            <Drawer.Title>Snap points</Drawer.Title>\n            <DummyContent />\n            <Drawer.Actions>\n                <Drawer.Close />\n                <Button emphasis=\"primary\">Accept</Button>\n            </Drawer.Actions>\n        </Drawer.Content>\n    </>)</Drawer>;",
          "warning": "Incomplete snippet: `DummyContent` could not be resolved statically."
        }
      ],
      "import": "import { Button, Drawer, H1, Input, P } from '@a-type/ui';\nimport { Drawer } from './Drawer.js';\nimport { Button } from '../button/index.js';"
    },
    "components-dropdownmenu": {
      "id": "components-dropdownmenu",
      "name": "DropdownMenu",
      "path": "./src/components/dropdownMenu/DropdownMenu.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `DropdownMenu` with a `Trigger`, `Content`, and `Item` children. Use the trigger `render` prop to supply a `Button`, and use checkbox or radio items for selectable options.\n\nContent is portaled and includes an arrow; positioning options such as `side` and `align` are passed to `Content`.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "StyledItem",
        "definedInFile": "/home/runner/work/ui/ui/src/components/dropdownMenu/DropdownMenu.tsx",
        "actualName": "StyledItem",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ],
              "raw": "Ref<HTMLDivElement>"
            },
            "description": ""
          }
        },
        "composes": [
          "MenuItemProps"
        ]
      },
      "stories": [
        {
          "id": "components-dropdownmenu--default",
          "name": "Default",
          "snippet": "const Default = () => <DropdownMenu>(<>\n        <DropdownMenu.Trigger render={<Button />}>Open</DropdownMenu.Trigger>\n        <DropdownMenu.Content>\n            <DropdownMenu.Item className=\"@mode-attention\">\n                <DropdownMenu.Label>Item 1</DropdownMenu.Label>\n                <DropdownMenu.ItemRightSlot>\n                    <Icon name=\"flag\" />\n                </DropdownMenu.ItemRightSlot>\n            </DropdownMenu.Item>\n            <DropdownMenu.Item>\n                <DropdownMenu.Label>Item 2</DropdownMenu.Label>\n                <DropdownMenu.ItemRightSlot>\n                    <Icon name=\"add_person\" />\n                </DropdownMenu.ItemRightSlot>\n            </DropdownMenu.Item>\n        </DropdownMenu.Content>\n    </>)</DropdownMenu>;"
        },
        {
          "id": "components-dropdownmenu--sides",
          "name": "Sides",
          "snippet": "const Sides = (args) => (\n    <Box\n        col\n        gap=\"xl\"\n        items=\"center\"\n        justify=\"center\"\n        full\n        p=\"xl\"\n        style={{ marginTop: 200 }}\n    >\n        <DropdownMenu open={args.open}>\n            <DropdownMenu.Trigger render={<Button />}>Top</DropdownMenu.Trigger>\n            <DropdownMenu.Content side=\"top\">\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 1</DropdownMenu.Label>\n                </DropdownMenu.Item>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 2</DropdownMenu.Label>\n                </DropdownMenu.Item>\n            </DropdownMenu.Content>\n        </DropdownMenu>\n        <DropdownMenu open={args.open}>\n            <DropdownMenu.Trigger render={<Button />}>Right</DropdownMenu.Trigger>\n            <DropdownMenu.Content side=\"right\">\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 1</DropdownMenu.Label>\n                </DropdownMenu.Item>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 2</DropdownMenu.Label>\n                </DropdownMenu.Item>\n            </DropdownMenu.Content>\n        </DropdownMenu>\n        <DropdownMenu open={args.open}>\n            <DropdownMenu.Trigger render={<Button />}>Left</DropdownMenu.Trigger>\n            <DropdownMenu.Content side=\"left\" sideOffset={8}>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 1</DropdownMenu.Label>\n                </DropdownMenu.Item>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 2</DropdownMenu.Label>\n                </DropdownMenu.Item>\n            </DropdownMenu.Content>\n        </DropdownMenu>\n        <DropdownMenu open={args.open}>\n            <DropdownMenu.Trigger render={<Button />}>Bottom</DropdownMenu.Trigger>\n            <DropdownMenu.Content side=\"bottom\" sideOffset={8}>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 1</DropdownMenu.Label>\n                </DropdownMenu.Item>\n                <DropdownMenu.Item>\n                    <DropdownMenu.Label>Item 2</DropdownMenu.Label>\n                </DropdownMenu.Item>\n            </DropdownMenu.Content>\n        </DropdownMenu>\n    </Box>\n);"
        }
      ],
      "import": "import { Box, Button, DropdownMenu, Icon } from '@a-type/ui';\nimport { DropdownMenu } from './DropdownMenu.js';\nimport { Button } from '../button/Button.js';\nimport { Icon } from '../icon/index.js';"
    },
    "components-editabletext": {
      "id": "components-editabletext",
      "name": "EditableText",
      "path": "./src/components/editableText/EditableText.stories.tsx",
      "jsDocTags": {},
      "description": "`EditableText` displays text that can be clicked to edit. Pass `value` and `onValueChange`; changes are reported as the user types.\n\nEditing ends on Enter or blur. Pass `editing` and `onEditingChange` to control the editing state.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "EditableText",
        "definedInFile": "/home/runner/work/ui/ui/src/components/editableText/EditableText.tsx",
        "actualName": "EditableText",
        "exportName": "EditableText",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "onValueChange": {
            "required": true,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: string) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "string"
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "editing": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "onEditingChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(editing: boolean) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "boolean"
                    },
                    "name": "editing"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "id": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "autoSelect": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "autoFocus": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "onFocus": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: FocusEvent) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "FocusEvent"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onBlur": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: FocusEvent) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "FocusEvent"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: ChangeEvent<HTMLInputElement>) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "ChangeEvent",
                      "elements": [
                        {
                          "name": "HTMLInputElement"
                        }
                      ],
                      "raw": "ChangeEvent<HTMLInputElement>"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onKeyDown": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: KeyboardEvent) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "KeyboardEvent"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onKeyUp": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: KeyboardEvent) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "KeyboardEvent"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-editabletext--default",
          "name": "Default",
          "snippet": "const Default = args => {\n    const [value, setValue] = useState(args.value);\n    const [editable, setEditable] = useState(false);\n\n    return (\n        <EditableText\n            value={value}\n            onValueChange={setValue}\n            editing={editable}\n            onEditingChange={setEditable}\n            style={{ margin: 'auto' }} />\n    );\n};"
        },
        {
          "id": "components-editabletext--title",
          "name": "Title",
          "snippet": "const Title = args => {\n    const [value, setValue] = useState(args.value);\n    const [editable, setEditable] = useState(false);\n\n    return (\n        <Heading>\n            <EditableText\n                value={value}\n                onValueChange={setValue}\n                editing={editable}\n                onEditingChange={setEditable}\n                style={{ margin: 'auto' }} />\n        </Heading>\n    );\n};"
        }
      ],
      "import": "import { EditableText, Heading } from '@a-type/ui';"
    },
    "components-emojipicker": {
      "id": "components-emojipicker",
      "name": "EmojiPicker",
      "path": "./src/components/emojiPicker/EmojiPicker.stories.tsx",
      "jsDocTags": {},
      "description": "Use `EmojiPicker` with `onValueChange`, which receives the emoji and its label. An optional `onClear` adds a clear action.\n\nThe prefab includes search and skin-tone controls; the skin-tone choice is stored in local storage. Use the exposed parts for a custom picker.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "EmojiPickerViewport",
        "definedInFile": "/home/runner/work/ui/ui/src/components/emojiPicker/EmojiPicker.tsx",
        "actualName": "EmojiPickerViewport",
        "exportName": "EmojiPickerViewport"
      },
      "stories": [
        {
          "id": "components-emojipicker--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <EmojiPicker />;\n};"
        }
      ],
      "import": "import { EmojiPicker } from '@a-type/ui';"
    },
    "components-form": {
      "id": "components-form",
      "name": "FormikForm",
      "path": "./src/components/forms/FormikForm.stories.tsx",
      "jsDocTags": {},
      "description": "`FormikForm` wraps Formik and a styled form. Provide `initialValues` and `onSubmit`, then use named fields such as `FormikForm.TextField`, `FormikForm.CheckboxField`, and `FormikForm.SubmitButton`. It also exposes `TextAreaField`, `NumberStepperField`, `SwitchField`, `ToggleGroupField`, and `EmojiField`.\n\nField names must match the Formik values. `Field` exposes `Label`, `Control`, `Description`, and `Error` for custom layouts.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "FormikFormRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/forms/FormikForm.tsx",
        "actualName": "FormikFormRoot",
        "exportName": "FormikFormRoot",
        "props": {
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "ReactCSSProperties",
              "raw": "React.CSSProperties"
            },
            "description": ""
          }
        },
        "composes": [
          "FormikConfig"
        ]
      },
      "stories": [
        {
          "id": "components-form--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <FormikForm\n            initialValues={{\n                email: '',\n                password: '',\n                age: 18,\n                tos: false,\n                newsletter: false,\n                plan: 'basic',\n                emoji: '',\n            }}\n            validate={(values) => {\n                if (!values.email.endsWith('.com')) {\n                    return { email: 'Email must end with .com' };\n                }\n            }}\n            onSubmit={(values) => {\n                alert(JSON.stringify(values, null, 2));\n            }}>\n            <TextField name=\"email\" type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n            <TextField\n                name=\"password\"\n                type=\"password\"\n                label=\"Password\"\n                minLength={8}\n                description=\"Make it a good one\" />\n            <NumberStepperField\n                name=\"age\"\n                label=\"Age\"\n                min={13}\n                max={100}\n                description=\"You can mail your government ID to us, don't worry, we're the good guys\" />\n            <CheckboxField name=\"tos\" label=\"I agree\" description=\"To what? Not telling.\" />\n            <SwitchField\n                name=\"newsletter\"\n                label=\"Subscribe to newsletter\"\n                description=\"Don't worry, we don't bother you much\" />\n            <ToggleGroupField\n                type=\"single\"\n                name=\"plan\"\n                label=\"Select your plan\"\n                required\n                description=\"Please do the expensive one!!!\">\n                <ToggleGroupField.Item value=\"basic\">Basic</ToggleGroupField.Item>\n                <ToggleGroupField.Item value=\"pro\">Pro</ToggleGroupField.Item>\n                <ToggleGroupField.Item value=\"enterprise\" className=\"@mode-accent\">Enterprise\n                                        </ToggleGroupField.Item>\n            </ToggleGroupField>\n            <EmojiField name=\"emoji\" label=\"Favorite Emoji\" />\n            <SubmitButton>Sign up</SubmitButton>\n        </FormikForm>\n    );\n};"
        }
      ],
      "import": "import {\n  CheckboxField,\n  EmojiField,\n  FormikForm,\n  NumberStepperField,\n  SubmitButton,\n  SwitchField,\n  TextField,\n  ToggleGroupField,\n} from '@a-type/ui';"
    },
    "components-horizontallist": {
      "id": "components-horizontallist",
      "name": "HorizontalList",
      "path": "./src/components/horizontalList/HorizontalList.stories.tsx",
      "jsDocTags": {},
      "description": "`HorizontalList` displays a scrolling row and can expand overflowing items into a wrapped layout. It manages its own open state, or accepts `open` and `onOpenChange`.\n\nUse `onCanOpenChange` to observe whether content overflows and `disableInternalOpenToggle` to supply your own toggle.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "HorizontalList",
        "definedInFile": "/home/runner/work/ui/ui/src/components/horizontalList/HorizontalList.tsx",
        "actualName": "HorizontalList",
        "exportName": "HorizontalList",
        "props": {
          "open": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "onOpenChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(open: boolean) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "boolean"
                    },
                    "name": "open"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "children": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "contentClassName": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "onCanOpenChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(canOpen: boolean) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "boolean"
                    },
                    "name": "canOpen"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "openDirection": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'up' | 'down'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'up'"
                },
                {
                  "name": "literal",
                  "value": "'down'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'down'",
              "computed": false
            }
          },
          "disableInternalOpenToggle": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "ReactCSSProperties",
              "raw": "React.CSSProperties"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-horizontallist--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    const [open, setOpen] = useState(false);\n\n    return (\n        <div\n            style={{\n                height: '100%',\n                minHeight: '80vh',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center',\n                backgroundColor: 'var(--m-gray-ink)',\n            }}>\n            <div\n                style={{\n                    width: 400,\n                    display: 'flex',\n                    flexDirection: 'column',\n                    flex: 1,\n                    alignItems: 'stretch',\n                    backgroundColor: 'var(--m-gray-paper)',\n                }}>\n                <Button\n                    toggled={open}\n                    onClick={() => setOpen(!open)}\n                    style={{\n                        marginBottom: '0.25rem',\n                        marginRight: '0.25rem',\n                        marginTop: 'auto',\n                        alignSelf: 'flex-end',\n                    }}>\n                    {open ? 'Close' : 'Open'}\n                </Button>\n                <HorizontalList\n                    style={{\n                        borderTop: '1px solid var(--m-gray)',\n                        maxHeight: 200,\n                    }}\n                    openDirection=\"up\"\n                    onCanOpenChange={() => {}}\n                    open={open}\n                    onOpenChange={setOpen}><>\n                        <Button size=\"small\">One</Button>\n                        <Button size=\"small\">Two</Button>\n                        <Button size=\"small\">Three</Button>\n                        <Button size=\"small\">Four but long</Button>\n                        <Button size=\"small\">Five</Button>\n                        <Button size=\"small\">Six</Button>\n                        <Button size=\"small\">Seven</Button>\n                        <Button size=\"small\">Eight</Button>\n                        <Button size=\"small\">Nine</Button>\n                        <Button size=\"small\">Ten</Button>\n                        <Button size=\"small\">Eleven</Button>\n                        <Button size=\"small\">Twelve</Button>\n                        <Button size=\"small\">Thirteen</Button>\n                        <Button size=\"small\">Fourteen and long</Button>\n                        <Button size=\"small\">Fifteen</Button>\n                        <Button size=\"small\">Sixteen</Button>\n                        <Button size=\"small\">Seventeen</Button>\n                        <Button size=\"small\">Eighteen</Button>\n                        <Button size=\"small\">Nineteen</Button>\n                        <Button size=\"small\">Twenty</Button>\n                        <Button size=\"small\">Twenty one</Button>\n                        <Button size=\"small\">Twenty two</Button>\n                        <Button size=\"small\">Twenty three</Button>\n                        <Button size=\"small\">Twenty four</Button>\n                        <Button\n                            emphasis=\"primary\"\n                            style={{\n                                position: 'sticky',\n                                bottom: 8,\n                                right: 8,\n                                marginLeft: 'auto',\n                                flexShrink: 0,\n                                boxShadow: 'var(--m-shadow-sm)',\n                            }}>\n                            <Icon name=\"plus\" />\n                        </Button>\n                    </></HorizontalList>\n            </div>\n        </div>\n    );\n};"
        },
        {
          "id": "components-horizontallist--cant-open",
          "name": "Cant Open",
          "snippet": "const CantOpen = () => {\n    const [more, setMore] = useState(false);\n\n    return (\n        <div\n            style={{\n                width: '100%',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'stretch',\n                justifyContent: 'flex-end',\n                backgroundColor: 'var(--m-gray-paper)',\n            }}>\n            <HorizontalList\n                style={{\n                    maxHeight: 200,\n                    borderTop: '1px solid var(--m-gray)',\n                }}\n                openDirection=\"up\"\n                onCanOpenChange={() => {}}>\n                <Button size=\"small\" toggled={more} onClick={() => setMore(!more)}>More\n                                        </Button>\n                <Button size=\"small\">One</Button>\n                <Button size=\"small\">Two</Button>\n                {more && (\n                    <>\n                        <Button size=\"small\">Three</Button>\n                        <Button size=\"small\">Four</Button>\n                        <Button size=\"small\">Five</Button>\n                        <Button size=\"small\">Six</Button>\n                        <Button size=\"small\">Seven</Button>\n                        <Button size=\"small\">Eight</Button>\n                        <Button size=\"small\">Nine</Button>\n                        <Button size=\"small\">Ten</Button>\n                        <Button size=\"small\">Eleven</Button>\n                        <Button size=\"small\">Twelve</Button>\n                        <Button size=\"small\">Thirteen</Button>\n                        <Button size=\"small\">Fourteen</Button>\n                        <Button size=\"small\">Fifteen</Button>\n                    </>\n                )}\n                <Button\n                    color=\"primary\"\n                    style={{\n                        position: 'sticky',\n                        bottom: 8,\n                        right: 8,\n                        marginLeft: 'auto',\n                        flexShrink: 0,\n                        boxShadow: 'var(--m-shadow-sm)',\n                    }}>\n                    <Icon name=\"plus\" />\n                </Button>\n            </HorizontalList>\n        </div>\n    );\n};"
        },
        {
          "id": "components-horizontallist--initial-open",
          "name": "Initial Open",
          "snippet": "const InitialOpen = () => {\n    const [open, setOpen] = useState(true);\n\n    return (\n        <div\n            style={{\n                width: '300px',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'stretch',\n                justifyContent: 'flex-end',\n                backgroundColor: 'var(--m-gray-paper)',\n                border: `1px solid var(--m-gray)`,\n            }}>\n            <HorizontalList\n                style={{\n                    maxHeight: 200,\n                    borderTop: '1px solid var(--m-gray)',\n                }}\n                openDirection=\"up\"\n                onCanOpenChange={() => {}}\n                open={open}\n                onOpenChange={setOpen}><>\n                    <Button size=\"small\">One</Button>\n                    <Button size=\"small\">Two</Button>\n                    <Button size=\"small\">Three</Button>\n                    <Button size=\"small\">Four but long</Button>\n                    <Button size=\"small\">Five</Button>\n                    <Button size=\"small\">Six</Button>\n                    <Button size=\"small\">Seven</Button>\n                    <Button size=\"small\">Eight</Button>\n                    <Button size=\"small\">Nine</Button>\n                    <Button size=\"small\">Ten</Button>\n                    <Button size=\"small\">Eleven</Button>\n                    <Button size=\"small\">Twelve</Button>\n                    <Button size=\"small\">Thirteen</Button>\n                    <Button size=\"small\">Fourteen and long</Button>\n                    <Button size=\"small\">Fifteen</Button>\n                    <Button size=\"small\">Sixteen</Button>\n                    <Button size=\"small\">Seventeen</Button>\n                    <Button size=\"small\">Eighteen</Button>\n                    <Button size=\"small\">Nineteen</Button>\n                    <Button size=\"small\">Twenty</Button>\n                    <Button size=\"small\">Twenty one</Button>\n                    <Button size=\"small\">Twenty two</Button>\n                    <Button size=\"small\">Twenty three</Button>\n                    <Button size=\"small\">Twenty four</Button>\n                    <Button\n                        emphasis=\"primary\"\n                        style={{\n                            position: 'sticky',\n                            bottom: 8,\n                            right: 8,\n                            marginLeft: 'auto',\n                            flexShrink: 0,\n                            boxShadow: 'var(--m-shadow-sm)',\n                        }}>\n                        <Icon name=\"plus\" />\n                    </Button>\n                </></HorizontalList>\n        </div>\n    );\n};"
        },
        {
          "id": "components-horizontallist--can-open-changes-dynamically",
          "name": "Can Open Changes Dynamically",
          "snippet": "const CanOpenChangesDynamically = () => {\n    const [itemCount, setItemCount] = useState(1);\n\n    return (\n        <div\n            style={{\n                width: '300px',\n                height: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'stretch',\n                justifyContent: 'flex-end',\n                backgroundColor: 'var(--m-gray-paper)',\n                border: `1px solid var(--m-gray)`,\n            }}>\n            <HorizontalList\n                style={{\n                    maxHeight: 200,\n                    borderTop: '1px solid var(--m-gray)',\n                }}\n                openDirection=\"up\"\n                onCanOpenChange={() => {}}>\n                {new Array(itemCount).fill(null).map((_, i) => (\n                    <Button key={i} size=\"small\">\n                        Item {i + 1}\n                    </Button>\n                ))}\n                <Button size=\"small\" onClick={() => setItemCount(itemCount + 1)}>Add Item\n                                        </Button>\n            </HorizontalList>\n        </div>\n    );\n};"
        }
      ],
      "import": "import { Button, HorizontalList, Icon } from '@a-type/ui';\nimport { Button } from '../button/index.js';\nimport { Icon } from '../icon/index.js';"
    },
    "components-icon": {
      "id": "components-icon",
      "name": "Icon",
      "path": "./src/components/icon/Icon.stories.tsx",
      "jsDocTags": {},
      "description": "Render `Icon` with a supported `name` and optional pixel `size`; the All story lists the available names. Icons need the spritesheet provided by `Provider`, or a manually mounted `IconSpritesheet`.\n\nIcons inside a loading `Button` show a spinner unless `loading={false}` is passed.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Icon",
        "definedInFile": "/home/runner/work/ui/ui/src/components/icon/Icon.tsx",
        "actualName": "Icon",
        "exportName": "Icon",
        "props": {
          "name": {
            "required": true,
            "tsType": {
              "name": "unknown[number]",
              "raw": "(typeof iconNames)[number]"
            },
            "description": ""
          },
          "size": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "loading": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "filled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<SVGSVGElement>",
              "elements": [
                {
                  "name": "SVGSVGElement"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "UseRenderComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-icon--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <Icon name=\"placeholder\" />;\n};"
        },
        {
          "id": "components-icon--all",
          "name": "All",
          "snippet": "const All = () => {\n    return (\n        <div\n            style={{\n                display: 'grid',\n                gridTemplateColumns: 'repeat(6, 1fr)',\n                gap: 'var(--m-sp-xs)',\n            }}\n        >\n            {iconNames.map((name) => (\n                <Box\n                    surface=\"ambient\"\n                    col\n                    p=\"sm\"\n                    layout=\"center center\"\n                    border\n                    key={name}\n                >\n                    <Icon name={name} size={25} />\n                    <span\n                        style={{\n                            textAlign: 'center',\n                            fontSize: 'var(--m-prose-ambient-size)',\n                        }}\n                    >\n                        {name}\n                    </span>\n                </Box>\n            ))}\n        </div>\n    );\n};"
        }
      ],
      "import": "import { Box, Icon } from '@a-type/ui';"
    },
    "components-imageuploader": {
      "id": "components-imageuploader",
      "name": "ImageUploader",
      "path": "./src/components/imageUploader/ImageUploader.stories.tsx",
      "jsDocTags": {},
      "description": "`ImageUploader` takes an image URL or null as `value` and reports a `File | null` through `onChange`. It supports file selection, drag and drop, camera capture, and optional `altText`/`onAltText`.\n\n`maxDimension` resizes selected or dropped files; camera captures bypass that resize. The caller is responsible for storing the file and updating the URL.",
      "reactDocgen": {
        "description": "Renders an image if one is already set, and allows either clicking\non the image to select a new one, or dragging a new image onto the\ncomponent to replace the existing one.",
        "methods": [],
        "displayName": "ImageUploaderRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/imageUploader/ImageUploader.tsx",
        "actualName": "ImageUploaderRoot",
        "exportName": "ImageUploaderRoot",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "union",
              "raw": "string | null",
              "elements": [
                {
                  "name": "string"
                },
                {
                  "name": "null"
                }
              ]
            },
            "description": ""
          },
          "onChange": {
            "required": true,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: File | null) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "union",
                      "raw": "File | null",
                      "elements": [
                        {
                          "name": "File"
                        },
                        {
                          "name": "null"
                        }
                      ]
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "altText": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "onAltText": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: string) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "string"
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "maxDimension": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-imageuploader--default",
          "name": "Default",
          "snippet": "const Default = () => <ImageUploaderDemo />;"
        },
        {
          "id": "components-imageuploader--with-alt-text",
          "name": "With Alt Text",
          "snippet": "const WithAltText = () => <ImageUploaderAltTextDemo />;"
        },
        {
          "id": "components-imageuploader--read-only-alt-text",
          "name": "Read Only Alt Text",
          "snippet": "const ReadOnlyAltText = () => <ImageUploaderReadOnlyAltTextDemo />;"
        }
      ],
      "import": "import { ImageUploader } from '@a-type/ui';"
    },
    "components-input": {
      "id": "components-input",
      "name": "Input",
      "path": "./src/components/input/Input.stories.tsx",
      "jsDocTags": {},
      "description": "`Input` is a styled text input. Use `value` and `onValueChange` for a controlled value, and `startAccessory` or `endAccessory` for content inside its border.\n\n`autoSelect` selects text on focus; `placeholders` can rotate placeholder text. Associate the input with a label, or use a form field.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "InputDefault",
        "definedInFile": "/home/runner/work/ui/ui/src/components/input/Input.tsx",
        "actualName": "InputDefault",
        "props": {
          "autoSelect": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "placeholders": {
            "required": false,
            "tsType": {
              "name": "Array",
              "elements": [
                {
                  "name": "string"
                }
              ],
              "raw": "string[]"
            },
            "description": "Shuffle between random placeholders"
          },
          "placeholdersIntervalMs": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "borderRef": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          },
          "startAccessory": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "endAccessory": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLInputElement"
                }
              ],
              "raw": "Ref<HTMLInputElement>"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-input--default",
          "name": "Default",
          "snippet": "const Default = () => <Input />;"
        },
        {
          "id": "components-input--button-and-input",
          "name": "Button And Input",
          "snippet": "const ButtonAndInput = () => <Box gap items=\"center\">\n    <Input placeholder=\"Type something...\" />\n    <Button>Submit</Button>\n</Box>;"
        },
        {
          "id": "components-input--with-accessories",
          "name": "With Accessories",
          "snippet": "const WithAccessories = () => <Input.Border>\n    <Icon name=\"search\" />\n    <Input.Input placeholder=\"Search...\" />\n    <Button emphasis=\"ghost\">\n        <Icon name=\"arrowRight\" />\n    </Button>\n</Input.Border>;"
        },
        {
          "id": "components-input--nested-in-boxes",
          "name": "Nested In Boxes",
          "snippet": "const NestedInBoxes = () => <Box p border rounded>\n    <Box p border rounded>\n        <Input placeholder=\"Type something...\" />\n    </Box>\n</Box>;"
        }
      ],
      "import": "import { Box, Button, Icon, Input } from '@a-type/ui';"
    },
    "components-layouts": {
      "id": "components-layouts",
      "name": "PageRoot",
      "path": "./src/components/layouts/layouts.stories.tsx",
      "jsDocTags": {},
      "description": "Build a page with `PageRoot`, `PageContent`, and optionally `PageNav`; `PageSection` and `PageSectionGrid` organize content. `PageFixedArea` provides a fixed area, while `PageNowPlaying` is useful for floating controls.\n\n`PageNav` hides while the keyboard is open. `PageNowPlaying` portals to the body by default; set `disablePortal` to keep it in place.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "SlotDiv",
        "definedInFile": "/home/runner/work/ui/ui/src/components/utility/SlotDiv.tsx",
        "actualName": "SlotDiv",
        "exportName": "SlotDiv",
        "composes": [
          "UseRenderComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-layouts--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    const [content, setContent] = useState(true);\n    const toggleContent = () => setContent((prev) => !prev);\n    return (\n        <PageRoot>\n            <PageContent>\n                <div style={{ textAlign: 'center' }}>\n                    <h1 className=\"text-primary\" style={{ fontWeight: 'bold' }}>\n                        Hello, World!\n                    </h1>\n                    <p className=\"text-primary\">This is a simple page layout.</p>\n                </div>\n                <Switch checked={content} onCheckedChange={toggleContent} />\n                {content && (\n                    <Card.Grid>\n                        {new Array(100).fill(null).map((_, i) => (\n                            <Card key={i}>\n                                <Card.Main />\n                            </Card>\n                        ))}\n                    </Card.Grid>\n                )}\n                <Box\n                    render={<PageNowPlaying />}\n                    surface=\"ambient\"\n                    elevated=\"lg\"\n                    p\n                    border\n                >\n                    Now playing\n                </Box>\n            </PageContent>\n            <PageNav>\n                <NavBarRoot>\n                    <NavBarItem>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"cart\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 1 long</NavBarItemText>\n                    </NavBarItem>\n                    <NavBarItem active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"book\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 2</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                    <NavBarItem color=\"neutral\" active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon\n                                render={(_, { size }) => (\n                                    <Avatar name=\"Grant Forrest\" size={size} />\n                                )}\n                            />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Neutral</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                </NavBarRoot>\n            </PageNav>\n        </PageRoot>\n    );\n};"
        },
        {
          "id": "components-layouts--manual-width",
          "name": "Manual Width",
          "snippet": "const ManualWidth = () => {\n    return (\n        <PageRoot>\n            <PageContent style={{ maxWidth: 300 }}>\n                <div style={{ textAlign: 'center' }}>\n                    <h1 className=\"text-primary\" style={{ fontWeight: 'bold' }}>\n                        Hello, World!\n                    </h1>\n                    <p className=\"text-primary\">This is a simple page layout.</p>\n                </div>\n                <Card.Grid>\n                    {new Array(100).fill(null).map((_, i) => (\n                        <Card key={i}>\n                            <Card.Main />\n                        </Card>\n                    ))}\n                </Card.Grid>\n            </PageContent>\n            <PageNav>\n                <NavBarRoot>\n                    <NavBarItem>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"cart\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 1 long</NavBarItemText>\n                    </NavBarItem>\n                    <NavBarItem active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"book\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 2</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                    <NavBarItem color=\"neutral\" active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"book\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Neutral</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                </NavBarRoot>\n            </PageNav>\n        </PageRoot>\n    );\n};"
        },
        {
          "id": "components-layouts--without-nav",
          "name": "Without Nav",
          "snippet": "const WithoutNav = () => (\n    <PageRoot style={{ height: '100%', width: '100%' }}>\n        <PageContent>\n            <div style={{ textAlign: 'center' }}>\n                <h1 className=\"text-primary\" style={{ fontWeight: 'bold' }}>\n                    Hello, World!\n                </h1>\n                <p className=\"text-primary\">This is a simple page layout.</p>\n                <Card.Grid>\n                    {new Array(100).fill(null).map((_, i) => (\n                        <Card key={i}>\n                            <Card.Main />\n                        </Card>\n                    ))}\n                </Card.Grid>\n            </div>\n            <PageNowPlaying>\n                <Box full elevated=\"lg\" p surface=\"ambient\">\n                    Now playing\n                </Box>\n            </PageNowPlaying>\n        </PageContent>\n    </PageRoot>\n);"
        },
        {
          "id": "components-layouts--with-virtual-keyboard",
          "name": "With Virtual Keyboard",
          "snippet": "const WithVirtualKeyboard = () => {\n    const [keyboard, setKeyboard] = useState(false);\n\n    useEffect(() => {\n        if (keyboard) {\n            document.body.style.setProperty(\n                '--mock-virtual-keyboard-height',\n                '300px',\n            );\n        } else {\n            document.body.style.removeProperty('--mock-virtual-keyboard-height');\n        }\n    }, [keyboard]);\n\n    return (\n        <PageRoot style={{ height: '100%', width: '100%' }}>\n            <PageContent>\n                <div style={{ textAlign: 'center' }}>\n                    <h1 className=\"text-primary\" style={{ fontWeight: 'bold' }}>\n                        Hello, World!\n                    </h1>\n                    <p className=\"text-primary\">This is a simple page layout.</p>\n                </div>\n                <PageNowPlaying keepAboveKeyboard>\n                    <Button onClick={() => setKeyboard((v) => !v)}>\n                        Toggle fake kb\n                    </Button>\n                    <Input />\n                </PageNowPlaying>\n            </PageContent>\n            <PageNav>\n                <NavBarRoot>\n                    <NavBarItem>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"cart\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 1 long</NavBarItemText>\n                    </NavBarItem>\n                    <NavBarItem active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon render={<Avatar name=\"Grant Forrest\" />} />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 2</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                </NavBarRoot>\n            </PageNav>\n            <div\n                className=\"bg-neutral-ink\"\n                style={{\n                    position: 'fixed',\n                    bottom: 0,\n                    left: 0,\n                    right: 0,\n                    height: 'var(--mock-virtual-keyboard-height,0)',\n                    width: '100%',\n                    transition: 'height var(--m-dur) var(--m-ease)',\n                }}\n            />\n        </PageRoot>\n    );\n};"
        },
        {
          "id": "components-layouts--no-content",
          "name": "No Content",
          "snippet": "const NoContent = () => {\n    return (\n        <PageRoot>\n            <PageNav>\n                <NavBarRoot>\n                    <NavBarItem>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"cart\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 1 long</NavBarItemText>\n                    </NavBarItem>\n                    <NavBarItem active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon name=\"book\" />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Item 2</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                    <NavBarItem color=\"neutral\" active={true}>\n                        <NavBarItemIconWrapper>\n                            <NavBarItemIcon\n                                render={(_, { size }) => (\n                                    <Avatar name=\"Grant Forrest\" size={size} />\n                                )}\n                            />\n                        </NavBarItemIconWrapper>\n                        <NavBarItemText>Neutral</NavBarItemText>\n                        <NavBarItemPip />\n                    </NavBarItem>\n                </NavBarRoot>\n            </PageNav>\n        </PageRoot>\n    );\n};"
        }
      ],
      "import": "import {\n  Avatar,\n  Box,\n  Button,\n  Card,\n  Input,\n  NavBarItem,\n  NavBarItemIcon,\n  NavBarItemIconWrapper,\n  NavBarItemPip,\n  NavBarItemText,\n  NavBarRoot,\n  PageContent,\n  PageNav,\n  PageNowPlaying,\n  PageRoot,\n  Switch,\n} from '@a-type/ui';"
    },
    "components-lightbox": {
      "id": "components-lightbox",
      "name": "Lightbox",
      "path": "./src/components/lightbox/Lightbox.stories.tsx",
      "jsDocTags": {},
      "description": "Wrap a single element in `Lightbox` to use it as both the trigger and the enlarged content. `Lightbox.Image` provides image styling.\n\nFor different trigger and content elements, compose `Lightbox.Root`, `Trigger`, `Portal`, `Overlay`, and `Content` yourself.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "LightboxTitle",
        "definedInFile": "/home/runner/work/ui/ui/src/components/lightbox/Lightbox.tsx",
        "actualName": "LightboxTitle",
        "exportName": "LightboxTitle"
      },
      "stories": [
        {
          "id": "components-lightbox--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Lightbox>\n            <Lightbox.Image src=\"https://resources.biscuits.club/images/pashka.jpg\" alt=\"Sample\" />\n        </Lightbox>\n    );\n};"
        }
      ],
      "import": "import { Lightbox } from '@a-type/ui';"
    },
    "components-lists": {
      "id": "components-lists",
      "name": "Ul",
      "path": "./src/components/lists/lists.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Ol` or `Ul` with their `Item` parts for styled ordered or unordered lists. They render semantic list elements and accept normal list props.\n\nSet `unstyled` to remove markers and default spacing.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "OlBase",
        "definedInFile": "/home/runner/work/ui/ui/src/components/lists/lists.tsx",
        "actualName": "OlBase",
        "props": {
          "unstyled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          }
        },
        "composes": [
          "ComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-lists--ordered-list",
          "name": "Ordered List",
          "snippet": "const OrderedList = () => {\n    return (\n        <Ol>\n            <Ol.Item>First item</Ol.Item>\n            <Ol.Item>Second item</Ol.Item>\n            <Ol.Item>Third item</Ol.Item>\n        </Ol>\n    );\n};"
        },
        {
          "id": "components-lists--unordered-list",
          "name": "Unordered List",
          "snippet": "const UnorderedList = () => {\n    return (\n        <Ul>\n            <Ul.Item>First item</Ul.Item>\n            <Ul.Item>Second item</Ul.Item>\n            <Ul.Item>Third item</Ul.Item>\n        </Ul>\n    );\n};"
        },
        {
          "id": "components-lists--no-markers",
          "name": "No Markers",
          "snippet": "const NoMarkers = () => {\n    return (\n        <Ul unstyled>\n            <Ul.Item>First item</Ul.Item>\n            <Ul.Item>Second item</Ul.Item>\n            <Ul.Item>Third item</Ul.Item>\n        </Ul>\n    );\n};"
        }
      ],
      "import": "import { Ol, Ul } from '@a-type/ui';"
    },
    "components-liveupdatetextfield": {
      "id": "components-liveupdatetextfield",
      "name": "LiveUpdateTextField",
      "path": "./src/components/liveUpdateTextField/LiveUpdateTextField.stories.tsx",
      "jsDocTags": {},
      "description": "Use `LiveUpdateTextField` with `value` and `onChange` for optimistic, debounced updates. The default debounce is 500ms; set `debounceMs` to change it, or `textArea` for multiline input.\n\nExternal value changes are ignored while focused. Blur sends an edited value immediately, even if a debounced update was already sent.",
      "reactDocgen": {
        "description": "An extension of TextField which keeps a local realtime value in state and\nperiodically reports changes to the parent. Use this to connect\nto the API and update a value from the field directly.\n\nThis component is optimistic and will not respond to external changes while focused.",
        "methods": [],
        "displayName": "LiveUpdateTextField",
        "definedInFile": "/home/runner/work/ui/ui/src/components/liveUpdateTextField/LiveUpdateTextField.tsx",
        "actualName": "LiveUpdateTextField",
        "exportName": "LiveUpdateTextField",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "debounceMs": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "500",
              "computed": false
            }
          },
          "onChange": {
            "required": true,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: string) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "string"
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "textArea": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "onFocus": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "FocusEvent",
                      "elements": [
                        {
                          "name": "union",
                          "raw": "HTMLInputElement | HTMLTextAreaElement",
                          "elements": [
                            {
                              "name": "HTMLInputElement"
                            },
                            {
                              "name": "HTMLTextAreaElement"
                            }
                          ]
                        }
                      ],
                      "raw": "FocusEvent<HTMLInputElement | HTMLTextAreaElement>"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onBlur": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "FocusEvent",
                      "elements": [
                        {
                          "name": "union",
                          "raw": "HTMLInputElement | HTMLTextAreaElement",
                          "elements": [
                            {
                              "name": "HTMLInputElement"
                            },
                            {
                              "name": "HTMLTextAreaElement"
                            }
                          ]
                        }
                      ],
                      "raw": "FocusEvent<HTMLInputElement | HTMLTextAreaElement>"
                    },
                    "name": "ev"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "autoComplete": {
            "required": false,
            "tsType": {
              "name": "InputProps['autoComplete']",
              "raw": "InputProps['autoComplete']"
            },
            "description": ""
          },
          "autoFocus": {
            "required": false,
            "tsType": {
              "name": "InputProps['autoFocus']",
              "raw": "InputProps['autoFocus']"
            },
            "description": ""
          },
          "autoSelect": {
            "required": false,
            "tsType": {
              "name": "InputProps['autoSelect']",
              "raw": "InputProps['autoSelect']"
            },
            "description": ""
          },
          "required": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "placeholder": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "type": {
            "required": false,
            "tsType": {
              "name": "InputProps['type']",
              "raw": "InputProps['type']"
            },
            "description": ""
          },
          "id": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "onKeyDown": {
            "required": false,
            "tsType": {
              "name": "KeyboardEventHandler"
            },
            "description": ""
          },
          "onKeyUp": {
            "required": false,
            "tsType": {
              "name": "KeyboardEventHandler"
            },
            "description": ""
          },
          "onClick": {
            "required": false,
            "tsType": {
              "name": "MouseEventHandler"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "union",
                  "raw": "HTMLInputElement | HTMLTextAreaElement",
                  "elements": [
                    {
                      "name": "HTMLInputElement"
                    },
                    {
                      "name": "HTMLTextAreaElement"
                    }
                  ]
                }
              ],
              "raw": "Ref<HTMLInputElement | HTMLTextAreaElement>"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-liveupdatetextfield--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    const [value, setValue] = useState('Initial value');\n    return <LiveUpdateTextField value={value} onChange={setValue} />;\n};"
        }
      ],
      "import": "import { LiveUpdateTextField } from '@a-type/ui';"
    },
    "components-marquee": {
      "id": "components-marquee",
      "name": "Marquee",
      "path": "./src/components/marquee/marquee.stories.tsx",
      "jsDocTags": {},
      "description": "Place `Marquee.Item` children inside `Marquee` to cycle through them one at a time. The `timeout` prop controls the interval in milliseconds and defaults to 5000.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Marquee",
        "definedInFile": "/home/runner/work/ui/ui/src/components/marquee/marquee.tsx",
        "actualName": "Marquee",
        "exportName": "Marquee",
        "props": {
          "timeout": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "5000",
              "computed": false
            }
          }
        },
        "composes": [
          "ComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-marquee--default",
          "name": "Default",
          "snippet": "const Default = params => {\n    return (\n        <Marquee style={{ height: 200 }} {...params}>\n            <Marquee.Item>\n                <img src=\"https://resources.biscuits.club/images/pashka.jpg\" />\n            </Marquee.Item>\n            <Marquee.Item\n                className=\"bg-primary-wash color-main-heavy text-primary\"\n                style={{\n                    display: 'flex',\n                    alignItems: 'center',\n                    justifyContent: 'center',\n                }}\n            >\n                Hello, world\n            </Marquee.Item>\n            <Marquee.Item\n                render={\n                    <img src=\"https://resources.biscuits.club/images/pashka.jpg\" />\n                }\n            />\n        </Marquee>\n    );\n};"
        }
      ],
      "import": "import { Marquee } from '@a-type/ui';"
    },
    "components-masonry": {
      "id": "components-masonry",
      "name": "Masonry",
      "path": "./src/components/masonry/masonry.stories.tsx",
      "jsDocTags": {},
      "description": "`Masonry` arranges its direct children into columns based on their measured heights. Set `columns` to a number or a function of container width, and `gap` to a pixel value.\n\nSet `data-span` on a child, or spread `masonrySpan(n)`, to span multiple columns.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Masonry",
        "definedInFile": "/home/runner/work/ui/ui/src/components/masonry/masonry.tsx",
        "actualName": "Masonry",
        "exportName": "Masonry",
        "props": {
          "children": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "columns": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "number | ((containerWidth: number) => number)",
              "elements": [
                {
                  "name": "number"
                },
                {
                  "name": "unknown"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "3",
              "computed": false
            }
          },
          "gap": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "16",
              "computed": false
            }
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-masonry--default",
          "name": "Default",
          "snippet": "const Default = props => {\n    return <Masonry {...props}>{content()}</Masonry>;\n};"
        },
        {
          "id": "components-masonry--with-span",
          "name": "With Span",
          "snippet": "const WithSpan = props => {\n    return <Masonry {...props}>{content(true)}</Masonry>;\n};"
        }
      ],
      "import": "import { Box, Masonry } from '@a-type/ui';"
    },
    "components-note": {
      "id": "components-note",
      "name": "Note",
      "path": "./src/components/note/Note.stories.tsx",
      "jsDocTags": {},
      "description": "`Note` renders its children in a folded-note surface. Use `Note.Input` for an editable, auto-sizing text area inside it.\n\n`Note.Input` is the input itself rather than a complete labeled field, so provide a label when editing.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "NoteRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/note/Note.tsx",
        "actualName": "NoteRoot",
        "props": {
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          }
        },
        "composes": [
          "HTMLAttributes"
        ]
      },
      "stories": [
        {
          "id": "components-note--default",
          "name": "Default",
          "snippet": "const Default = () => <Note>This is a note</Note>;"
        },
        {
          "id": "components-note--editable",
          "name": "Editable",
          "snippet": "const Editable = () => {\n    return (\n        <Note>\n            <Note.Input />\n        </Note>\n    );\n};"
        }
      ],
      "import": "import { Note } from '@a-type/ui';"
    },
    "components-numberstepper": {
      "id": "components-numberstepper",
      "name": "NumberStepper",
      "path": "./src/components/numberStepper/NumberStepper.stories.tsx",
      "jsDocTags": {},
      "description": "`NumberStepper` is controlled with a numeric `value` and `onChange`. Use `increment` for a fixed step or `steps` for a list of allowed values; the current value should be in that list.\n\n`min` and `max` disable buttons at the boundaries but do not clamp a step that crosses them.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "NumberStepper",
        "definedInFile": "/home/runner/work/ui/ui/src/components/numberStepper/NumberStepper.tsx",
        "actualName": "NumberStepper",
        "exportName": "NumberStepper",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "onChange": {
            "required": true,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: number) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "number"
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "highlightChange": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "steps": {
            "required": false,
            "tsType": {
              "name": "Array",
              "elements": [
                {
                  "name": "number"
                }
              ],
              "raw": "number[]"
            },
            "description": ""
          },
          "increment": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "1",
              "computed": false
            }
          },
          "renderValue": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(value: number) => ReactNode",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "number"
                    },
                    "name": "value"
                  }
                ],
                "return": {
                  "name": "ReactNode"
                }
              }
            },
            "description": "",
            "defaultValue": {
              "value": "function fractionToText(decimal) {\n    let maxDenominator = 10;\n    let sign = 1;\n    // erase negativity for now\n    if (decimal < 0) {\n        sign = -1;\n        decimal *= -1;\n    }\n    let matrix = [\n        [1, 0],\n        [0, 1],\n    ];\n    let x = decimal;\n    let ai;\n    let count = 0;\n    while (matrix[1][0] * (ai = Math.floor(x)) + matrix[1][1] <= maxDenominator) {\n        // avoid infinite loop\n        if (count++ > 50) {\n            break;\n        }\n        let term = matrix[0][0] * ai + matrix[0][1];\n        matrix[0][1] = matrix[0][0];\n        matrix[0][0] = term;\n        term = matrix[1][0] * ai + matrix[1][1];\n        matrix[1][1] = matrix[1][0];\n        matrix[1][0] = term;\n        if (x === ai) {\n            // don't divide by zero\n            break;\n        }\n        x = 1 / Math.abs(x - ai);\n    }\n    let numerator = matrix[0][0] * sign;\n    let denominator = matrix[1][0];\n    if (numerator === 0) {\n        return '0';\n    }\n    if (denominator === 1) {\n        return numerator.toString();\n    }\n    // resolve improper fractions\n    if (numerator > denominator) {\n        let whole = Math.floor(numerator / denominator);\n        let remainder = numerator % denominator;\n        if (remainder === 0) {\n            return whole.toString();\n        }\n        return `${whole} ${fractionToUnicode(remainder, denominator)}`;\n    }\n    return fractionToUnicode(numerator, denominator);\n}",
              "computed": false
            }
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "disabled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "min": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "max": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "id": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "defaultValue": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-numberstepper--default",
          "name": "Default",
          "snippet": "const Default = () => <NumberStepper value={0} />;"
        }
      ],
      "import": "import { NumberStepper } from '@a-type/ui';"
    },
    "components-particlelayer": {
      "id": "components-particlelayer",
      "name": "ParticleLayer",
      "path": "./src/components/particles/ParticleLayer.stories.tsx",
      "jsDocTags": {},
      "description": "`ParticleLayer` provides a canvas and particle state to descendants; use `useParticles()` to create effects. `Provider` already includes a layer unless `disableParticles` is set.\n\nThe canvas is portaled to the body by default; `noPortal` keeps it in place. The layer and its children render after the client mounts, not during server rendering.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ParticleLayer",
        "definedInFile": "/home/runner/work/ui/ui/src/components/particles/ParticleLayer.tsx",
        "actualName": "ParticleLayer",
        "exportName": "ParticleLayer",
        "props": {
          "children": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "noPortal": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-particlelayer--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <div\n            style={{\n                position: 'relative',\n                height: '100vh',\n                width: '100%',\n                display: 'flex',\n                flexDirection: 'column',\n                alignItems: 'center',\n                justifyContent: 'center',\n            }}\n        >\n            <ExplodeButton />\n        </div>\n    );\n};"
        },
        {
          "id": "components-particlelayer--hidden-test",
          "name": "Hidden Test",
          "snippet": "const HiddenTest = () => {\n    const [hide, setHide] = useState(false);\n    const targetRef = useRef<SVGSVGElement>(null);\n    const particles = useParticles();\n\n    return (\n        <>\n            <div\n                style={{\n                    position: 'relative',\n                    width: '100%',\n                    display: 'flex',\n                    flexDirection: 'column',\n                    alignItems: 'center',\n                    justifyContent: 'center',\n                    padding: '2.5rem',\n                    visibility: hide ? 'hidden' : 'visible',\n                }}\n            >\n                <Icon name=\"placeholder\" ref={targetRef} />\n            </div>\n            <div style={{ display: 'flex', flexDirection: 'row' }}>\n                <Button\n                    onClick={() => {\n                        particles?.addParticles(\n                            particles.elementExplosion({\n                                element: targetRef.current!,\n                                count: 10,\n                            }),\n                        );\n                    }}\n                >\n                    Burst\n                </Button>\n                <Checkbox checked={hide} onCheckedChange={(c) => setHide(!!c)} />\n                <span>Hide (hidden elements should not show particles)</span>\n            </div>\n        </>\n    );\n};"
        }
      ],
      "import": "import { Button, Checkbox, Icon, ParticleLayer } from '@a-type/ui';"
    },
    "components-peek": {
      "id": "components-peek",
      "name": "Peek",
      "path": "./src/components/peek/Peek.stories.tsx",
      "jsDocTags": {},
      "description": "`Peek` initially shows a limited height of its children and provides a toggle when the content overflows. Set `peekHeight` in pixels; it defaults to 120. The expanded state is managed internally.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Peek",
        "definedInFile": "/home/runner/work/ui/ui/src/components/peek/Peek.tsx",
        "actualName": "Peek",
        "exportName": "Peek",
        "props": {
          "peekHeight": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "120",
              "computed": false
            }
          },
          "children": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-peek--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Peek>\n            <Box col>\n                <P>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n                                            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n                                            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n                                            aliquip ex ea commodo consequat. Duis aute irure dolor in\n                                            reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\n                                            pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\n                                            culpa qui officia deserunt mollit anim id est laborum.\n                                        </P>\n                <P>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n                                            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n                                            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n                                            aliquip ex ea commodo consequat. Duis aute irure dolor in\n                                            reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\n                                            pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\n                                            culpa qui officia deserunt mollit anim id est laborum.\n                                        </P>\n                <P>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n                                            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n                                            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n                                            aliquip ex ea commodo consequat. Duis aute irure dolor in\n                                            reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\n                                            pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\n                                            culpa qui officia deserunt mollit anim id est laborum.\n                                        </P>\n            </Box>\n        </Peek>\n    );\n};"
        }
      ],
      "import": "import { Box, P, Peek } from '@a-type/ui';"
    },
    "components-popover": {
      "id": "components-popover",
      "name": "Popover",
      "path": "./src/components/popover/Popover.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Popover` with `Popover.Trigger` and `Popover.Content`; add `Title`, `Description`, and `Close` as appropriate. The trigger can render a custom button through `render`.\n\nContent is portaled and accepts positioning props such as `side` and `align`. Add `Popover.Arrow` explicitly if desired.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "StyledArrow",
        "definedInFile": "/home/runner/work/ui/ui/src/components/popover/Popover.tsx",
        "actualName": "StyledArrow"
      },
      "stories": [
        {
          "id": "components-popover--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Popover>\n            <Popover.Trigger render={<Button color=\"primary\" size=\"small\" />}>Open Popover\n                                </Popover.Trigger>\n            <Popover.Content style={{ padding: 'var(--m-sp-md)' }}>\n                <Popover.Arrow />\n                <Popover.Title>Hello</Popover.Title>\n                <Popover.Description>This is a popover content.</Popover.Description>\n                <Popover.Close />\n            </Popover.Content>\n        </Popover>\n    );\n};"
        }
      ],
      "import": "import { Button, Popover } from '@a-type/ui';"
    },
    "components-progress": {
      "id": "components-progress",
      "name": "Progress",
      "path": "./src/components/progress/Progress.stories.tsx",
      "jsDocTags": {},
      "description": "Pass `value` and optionally `max` to `Progress` to show completion; `max` defaults to 100. Use `Progress.Labeled` with a `label` for a visible label and value.\n\nThe `Root`, `Track`, `Indicator`, `Label`, and `Value` parts are available for custom composition.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ProgressLabeled",
        "definedInFile": "/home/runner/work/ui/ui/src/components/progress/Progress.tsx",
        "actualName": "ProgressLabeled",
        "exportName": "ProgressLabeled",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          },
          "label": {
            "required": true,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "formatValue": {
            "required": false,
            "tsType": {
              "name": "ProgressValueProps['children']",
              "raw": "ProgressValueProps['children']"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-progress--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Box col gap>\n            <Progress value={50} max={100} />\n            <Progress value={100} max={100} />\n            <Progress value={0} max={100} />\n        </Box>\n    );\n};"
        },
        {
          "id": "components-progress--labeled",
          "name": "Labeled",
          "snippet": "const Labeled = () => {\n    return (\n        <Box col gap>\n            <Progress.Labeled value={33} max={100} label=\"Loading...\" />\n            <Progress.Labeled value={100} max={100} label=\"Complete\" />\n            <Progress.Labeled value={0} max={100} label=\"Starting...\" />\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, Progress } from '@a-type/ui';"
    },
    "components-pwainstalltrigger": {
      "id": "components-pwainstalltrigger",
      "name": "PwaInstallTrigger",
      "path": "./src/components/pwaInstall/PwaInstallTrigger.stories.tsx",
      "jsDocTags": {},
      "description": "`PwaInstallTrigger` opens the install dialog supplied by `Provider` and hides when the app is already installed. It renders an Install button by default and accepts custom children.\n\nThe provider loads `/manifest.json` by default; use `manifestPath` to change it. Setting `manifestPath={false}` removes the install dialog, so the trigger will not open one.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "PwaInstallTrigger",
        "definedInFile": "/home/runner/work/ui/ui/src/components/pwaInstall/PwaInstallTrigger.tsx",
        "actualName": "PwaInstallTrigger",
        "exportName": "PwaInstallTrigger",
        "props": {
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'primary' | 'default' | 'ghost' | 'light' | 'unstyled'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'default'"
                },
                {
                  "name": "literal",
                  "value": "'ghost'"
                },
                {
                  "name": "literal",
                  "value": "'light'"
                },
                {
                  "name": "literal",
                  "value": "'unstyled'"
                }
              ]
            },
            "description": ""
          },
          "size": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'default' | 'small' | 'wrapper'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'default'"
                },
                {
                  "name": "literal",
                  "value": "'small'"
                },
                {
                  "name": "literal",
                  "value": "'wrapper'"
                }
              ]
            },
            "description": ""
          },
          "toggled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "toggleMode": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'color-and-indicator' | 'color' | 'indicator' | 'state-only'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'color-and-indicator'"
                },
                {
                  "name": "literal",
                  "value": "'color'"
                },
                {
                  "name": "literal",
                  "value": "'indicator'"
                },
                {
                  "name": "literal",
                  "value": "'state-only'"
                }
              ]
            },
            "description": ""
          },
          "visuallyDisabled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "loading": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "visuallyFocused": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableIconMode": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "forceIconMode": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLButtonElement"
                }
              ],
              "raw": "Ref<HTMLButtonElement>"
            },
            "description": ""
          },
          "disableDropdownTriggerIcon": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disableDefaultLoadingIndicator": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "color": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'primary' | 'accent' | 'success' | 'attention'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'accent'"
                },
                {
                  "name": "literal",
                  "value": "'success'"
                },
                {
                  "name": "literal",
                  "value": "'attention'"
                }
              ]
            },
            "description": "Shortcuts for @mode-* classes."
          },
          "full": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'width' | 'height' | boolean",
              "elements": [
                {
                  "name": "literal",
                  "value": "'width'"
                },
                {
                  "name": "literal",
                  "value": "'height'"
                },
                {
                  "name": "boolean"
                }
              ]
            },
            "description": ""
          },
          "align": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'start' | 'center' | 'end'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "ButtonHTMLAttributes",
          "Pick"
        ]
      },
      "stories": [
        {
          "id": "components-pwainstalltrigger--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <PwaInstallTrigger render={<Button color=\"primary\" emphasis=\"light\" />}>\n            <Icon name=\"star\" />Install\n                        </PwaInstallTrigger>\n    );\n};"
        }
      ],
      "import": "import { Button, Icon, PwaInstallTrigger } from '@a-type/ui';"
    },
    "components-quickaction": {
      "id": "components-quickaction",
      "name": "QuickAction",
      "path": "./src/components/quickAction/QuickAction.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `QuickAction` with `QuickAction.Trigger` and `QuickAction.Content` for an action panel anchored to its trigger. Set `align` on the content to `start`, `center`, or `end`.\n\nThe popup is portaled and uses CSS anchor positioning, so positioning depends on browser support.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "QuickActionRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/quickAction/QuickAction.tsx",
        "actualName": "QuickActionRoot",
        "exportName": "QuickActionRoot",
        "props": {
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-quickaction--default",
          "name": "Default",
          "snippet": "const Default = args => {\n    return (\n        <PageRoot>\n            <PageContent>\n                <PageNowPlaying\n                    className={clsx({\n                        'items-center': args.align === 'center',\n                        'items-start': args.align === 'start',\n                        'items-end': args.align === 'end',\n                    })}\n                    style={{ display: 'flex', flexDirection: 'column' }}>\n                    <QuickAction>\n                        <QuickAction.Trigger>\n                            <Icon name=\"plus\" />\n                        </QuickAction.Trigger>\n                        <QuickAction.Content style={{ width: '95vw' }} align={args.align}>\n                            <ActionContent />\n                        </QuickAction.Content>\n                    </QuickAction>\n                </PageNowPlaying>\n            </PageContent>\n            <PageNav>\n                <NavBar>\n                    <NavBarItem>\n                        <NavBarItemIcon name=\"home\" />\n                        <NavBarItemText>Home</NavBarItemText>\n                    </NavBarItem>\n                </NavBar>\n            </PageNav>\n        </PageRoot>\n    );\n};"
        }
      ],
      "import": "import {\n  Box,\n  Icon,\n  NavBar,\n  NavBarItem,\n  NavBarItemIcon,\n  NavBarItemText,\n  PageContent,\n  PageNav,\n  PageNowPlaying,\n  PageRoot,\n  QuickAction,\n} from '@a-type/ui';"
    },
    "components-relativetime": {
      "id": "components-relativetime",
      "name": "RelativeTime",
      "path": "./src/components/relativeTime/RelativeTime.stories.tsx",
      "jsDocTags": {},
      "description": "Pass a timestamp in milliseconds as `value` to display a relative time. Use `abbreviate` for shorter units or `disableRelativeText` to omit \"ago\" and \"from now\".\n\nThe text updates every minute; `countdownSeconds` updates once per second for future times less than a minute away.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "RelativeTime",
        "definedInFile": "/home/runner/work/ui/ui/src/components/relativeTime/RelativeTime.tsx",
        "actualName": "RelativeTime",
        "exportName": "RelativeTime",
        "props": {
          "value": {
            "required": true,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "abbreviate": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "countdownSeconds": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Makes it count down seconds for a future date value as it approaches.\nDoes not affect past dates."
          },
          "disableRelativeText": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": "Remove \"from now\" or \"ago\" from the output."
          }
        }
      },
      "stories": [
        {
          "id": "components-relativetime--default",
          "name": "Default",
          "snippet": "const Default = () => <RelativeTime value={Date.now() + 60 * 1000 * 2} abbreviate={false} />;"
        }
      ],
      "import": "import { RelativeTime } from '@a-type/ui';"
    },
    "components-richeditor": {
      "id": "components-richeditor",
      "name": "RichEditor",
      "path": "./src/components/richEditor/richEditor.stories.tsx",
      "jsDocTags": {},
      "error": {
        "name": "No component found",
        "message": "We could not detect the component from your story file. Specify meta.component.\n   9 |  * Configure the editor and its editable state separately.\n  10 |  */\n> 11 | const meta = {\n     | ^\n  12 | \ttitle: 'Components/RichEditor',\n  13 | \targTypes: {\n  14 | \t\treadonly: { control: 'boolean' },\n\n./src/components/richEditor/richEditor.stories.tsx:\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport clsx from 'clsx';\nimport { Input } from '../input/Input.js';\nimport { tipTapClassName, tipTapReadonlyClassName } from './index.js';\n\n/**\n * This export provides styles, not an editor component. Apply `tipTapClassName` to the wrapper around a TipTap/ProseMirror editor, and add `tipTapReadonlyClassName` for its read-only appearance.\n *\n * Configure the editor and its editable state separately.\n */\nconst meta = {\n\ttitle: 'Components/RichEditor',\n\targTypes: {\n\t\treadonly: { control: 'boolean' },\n\t},\n\tparameters: {\n\t\tcontrols: { expanded: true },\n\t},\n} satisfies Meta<{ readonly: boolean }>;\n\nexport default meta;\n\ntype Story = StoryObj<{ readonly: boolean }>;\n\nexport const Default: Story = {\n\trender(args) {\n\t\treturn (\n\t\t\t<Input.Border>\n\t\t\t\t<div\n\t\t\t\t\tcontentEditable={true}\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\ttipTapClassName,\n\t\t\t\t\t\targs.readonly && tipTapReadonlyClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"ProseMirror\">\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<h1>Heading 1</h1>\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<h2>Heading 2</h2>\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\n\t\t\t\t\t\t<blockquote>{paragraphText}</blockquote>\n\t\t\t\t\t\t<h3>Heading 3</h3>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>{paragraphText}</li>\n\t\t\t\t\t\t\t<li>{paragraphText}</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<ol>\n\t\t\t\t\t\t\t<li>{paragraphText}</li>\n\t\t\t\t\t\t\t<li>{paragraphText}</li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<h4>Heading 4</h4>\n\t\t\t\t\t\t<p>{paragraphText}</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<mark>Highlighted</mark> text\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<a href=\"#\">Link</a>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<strong>Bold</strong> text\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<em>Italic</em> text\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</Input.Border>\n\t\t);\n\t},\n};\n\nconst paragraphText = `Lorem ipsum dolor sit amet, consectetur adipiscing elit\nSed do eiusmod tempor incididunt ut labore et dolore magna aliqua\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum`;\n"
      },
      "stories": [
        {
          "id": "components-richeditor--default",
          "name": "Default",
          "snippet": "const Default = args => {\n    return (\n        <Input.Border>\n            <div\n                contentEditable={true}\n                className={clsx(\n                    tipTapClassName,\n                    args.readonly && tipTapReadonlyClassName,\n                )}\n            >\n                <div className=\"ProseMirror\">\n                    <p>{paragraphText}</p>\n                    <h1>Heading 1</h1>\n                    <p>{paragraphText}</p>\n                    <h2>Heading 2</h2>\n                    <p>{paragraphText}</p>\n                    <p>{paragraphText}</p>\n                    <hr />\n                    <p>{paragraphText}</p>\n\n                    <blockquote>{paragraphText}</blockquote>\n                    <h3>Heading 3</h3>\n                    <ul>\n                        <li>{paragraphText}</li>\n                        <li>{paragraphText}</li>\n                    </ul>\n                    <p>{paragraphText}</p>\n                    <ol>\n                        <li>{paragraphText}</li>\n                        <li>{paragraphText}</li>\n                    </ol>\n                    <h4>Heading 4</h4>\n                    <p>{paragraphText}</p>\n                    <p>\n                        <mark>Highlighted</mark> text\n                    </p>\n                    <p>\n                        <a href=\"#\">Link</a>\n                    </p>\n                    <p>\n                        <strong>Bold</strong> text\n                    </p>\n                    <p>\n                        <em>Italic</em> text\n                    </p>\n                </div>\n            </div>\n        </Input.Border>\n    );\n};"
        }
      ],
      "import": "import { Input } from '@a-type/ui';"
    },
    "components-scrollarea": {
      "id": "components-scrollarea",
      "name": "ScrollArea",
      "path": "./src/components/scrollArea/ScrollArea.stories.tsx",
      "jsDocTags": {},
      "description": "Give `ScrollArea` a constrained size and choose `direction` (`vertical`, `horizontal`, or `both`). Put the scrollable children in `ScrollArea.Content`.\n\nFades are included by default; set `disableFades` to remove them. Use `Root`, `Viewport`, and `Scrollbar` for a custom composition.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ScrollAreaViewportFades",
        "definedInFile": "/home/runner/work/ui/ui/src/components/scrollArea/ScrollArea.tsx",
        "actualName": "ScrollAreaViewportFades",
        "exportName": "ScrollAreaViewportFades"
      },
      "stories": [
        {
          "id": "components-scrollarea--default",
          "name": "Default",
          "snippet": "const Default = ({ direction }) => {\n    return (\n        <ScrollArea\n            direction={direction}\n            style={{ height: '200px', width: '400px' }}\n        >\n            <ScrollArea.Content\n                style={{\n                    width: direction === 'horizontal' ? '10000px' : undefined,\n                    height: direction === 'both' ? '10000px' : undefined,\n                }}\n            >\n                <Content />\n            </ScrollArea.Content>\n        </ScrollArea>\n    );\n};"
        },
        {
          "id": "components-scrollarea--constraint-test",
          "name": "Constraint Test",
          "snippet": "const ConstraintTest = ({ direction }) => {\n    return (\n        <ScrollArea direction={direction} style={{ height: 300, width: 300 }}>\n            <ScrollArea.Content>\n                <Box gap>\n                    <Input placeholder=\"Test input\" />\n                    <Button>Submit</Button>\n                </Box>\n                <Content />\n            </ScrollArea.Content>\n        </ScrollArea>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Input, ScrollArea } from '@a-type/ui';"
    },
    "components-select": {
      "id": "components-select",
      "name": "Select",
      "path": "./src/components/select/Select.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Select` with `Select.Trigger`, `Select.Content`, and `Select.Item` elements. Use `value` and `onValueChange` for a controlled selection, or `defaultValue` for an initial value.\n\nThe trigger displays the selected value and a chevron by default. Use `itemToStringLabel` when values need a custom display label.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "SelectItem",
        "definedInFile": "/home/runner/work/ui/ui/src/components/select/Select.tsx",
        "actualName": "SelectItem",
        "exportName": "SelectItem",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-select--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Box full layout=\"center center\" style={{ minHeight: 200 }}>\n            <Select value=\"One\">\n                <SelectTrigger />\n                <SelectContent>\n                    {['One', 'Two', 'Three'].map((item) => (\n                        <SelectItem key={item} value={item}>\n                            {item}\n                        </SelectItem>\n                    ))}\n                </SelectContent>\n            </Select>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-select--empty",
          "name": "Empty",
          "snippet": "const Empty = args => {\n    return (\n        <Box full layout=\"center center\" style={{ minHeight: 200 }}>\n            <Select value={null}>\n                <SelectTrigger placeholder=\"Select an option\" />\n                <SelectContent>\n                    {['One', 'Two', 'Three'].map((item) => (\n                        <SelectItem key={item} value={item}>\n                            {item}\n                        </SelectItem>\n                    ))}\n                </SelectContent>\n            </Select>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-select--long-list-with-item-labels",
          "name": "Long List With Item Labels",
          "snippet": "const LongListWithItemLabels = () => {\n    return (\n        <Box full layout=\"center center\" style={{ minHeight: 200 }}>\n            <Select\n                value=\"One\"\n                defaultValue={0}\n                itemToStringLabel={(i: number) => `Item number ${i + 1}`}>\n                <SelectTrigger />\n                <SelectContent>\n                    {new Array(50).fill(null).map((_, i) => {\n                        const item = `Item number ${i + 1}`;\n                        return (\n                            <SelectItem key={item} value={i}>\n                                {item}\n                            </SelectItem>\n                        );\n                    })}\n                </SelectContent>\n            </Select>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-select--compare-select-and-button",
          "name": "Compare Select And Button",
          "snippet": "const CompareSelectAndButton = () => {\n    return (\n        <div style={{ display: 'flex', flexDirection: 'row' }}>\n            <Select value=\"One\">\n                <SelectTrigger />\n                <SelectContent>\n                    {['One', 'Two', 'Three'].map((item) => (\n                        <SelectItem key={item} value={item}>\n                            {item}\n                        </SelectItem>\n                    ))}\n                </SelectContent>\n            </Select>\n            <Button>Button</Button>\n            <Select value=\"One\">\n                <SelectTrigger size=\"small\" />\n                <SelectContent>\n                    {['One', 'Two', 'Three'].map((item) => (\n                        <SelectItem key={item} value={item}>\n                            {item}\n                        </SelectItem>\n                    ))}\n                </SelectContent>\n            </Select>\n            <Button size=\"small\">Button</Button>\n        </div>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Select, SelectContent, SelectItem, SelectTrigger } from '@a-type/ui';"
    },
    "components-textskeleton": {
      "id": "components-textskeleton",
      "name": "TextSkeleton",
      "path": "./src/components/skeletons/TextSkeleton.stories.tsx",
      "jsDocTags": {},
      "description": "Use `TextSkeleton` as a placeholder for text while content loads. Pass `maxLength` to influence its randomly chosen width, which stays fixed for that mount.\n\nProvide loading status separately for assistive technology.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "TextSkeleton",
        "definedInFile": "/home/runner/work/ui/ui/src/components/skeletons/skeletons.tsx",
        "actualName": "TextSkeleton",
        "exportName": "TextSkeleton",
        "props": {
          "maxLength": {
            "required": true,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-textskeleton--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <TextSkeleton maxLength={20} />;\n};"
        },
        {
          "id": "components-textskeleton--on-background",
          "name": "On Background",
          "snippet": "const OnBackground = () => {\n    return (\n        <Box col gap p color=\"attention\" surface layout=\"start center\">\n            <TextSkeleton maxLength={20} />\n            <TextSkeleton maxLength={20} />\n            <TextSkeleton maxLength={20} />\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, TextSkeleton } from '@a-type/ui';"
    },
    "components-slider": {
      "id": "components-slider",
      "name": "Slider",
      "path": "./src/components/slider/Slider.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Slider` with `defaultValue`, or control it with `value` and `onValueChange`; configure `min`, `max`, and `step` as needed. `Slider.getSingle` extracts one value from a number or value array.\n\nFor a labeled thumb or a displayed value, compose `Slider.Root`, `Slider.Ui`, and `Slider.Value`.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Slider",
        "definedInFile": "/home/runner/work/ui/ui/src/components/slider/Slider.tsx",
        "actualName": "Slider",
        "exportName": "Slider",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "Ref",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ],
              "raw": "Ref<HTMLDivElement>"
            },
            "description": ""
          }
        },
        "composes": [
          "SliderRootProps"
        ]
      },
      "stories": [
        {
          "id": "components-slider--default",
          "name": "Default",
          "snippet": "const Default = () => <Slider />;"
        },
        {
          "id": "components-slider--vertical",
          "name": "Vertical",
          "snippet": "const Vertical = () => <Slider orientation=\"vertical\" style={{ height: '200px' }} />;"
        },
        {
          "id": "components-slider--custom-styles",
          "name": "Custom Styles",
          "snippet": "const CustomStyles = () => {\n    const [value, setValue] = useState<number>(0);\n\n    return (\n        <Slider.Base\n            value={value}\n            onValueChange={(v) => {\n                if (Array.isArray(v)) {\n                    setValue(v[0]);\n                } else {\n                    setValue(v as number);\n                }\n            }}\n            className={\n                value < 0\n                    ? '@mode-attention'\n                    : value > 0\n                    ? '@mode-success'\n                    : '@mode-base'\n            }\n            orientation=\"vertical\"\n            style={{ height: '200px' }}\n            min={-2}\n            max={2}\n            defaultValue={0}>\n            <Slider.Track\n                className={clsx({\n                    'bg-attention': value === -2,\n                    'bg-attention-light': value === -1,\n                    'bg-main': value === 0,\n                    'bg-success-light': value === 1,\n                    'bg-success': value === 2,\n                })}>\n                <Slider.Indicator />\n                <Slider.Thumb style={{ height: 24, width: 24 }}>\n                    <div className=\"text-primary\">\n                        {['😭', '😔', '😐', '😊', '😃'][(value as number) + 2]}\n                    </div>\n                </Slider.Thumb>\n            </Slider.Track>\n        </Slider.Base>\n    );\n};"
        },
        {
          "id": "components-slider--with-value",
          "name": "With Value",
          "snippet": "const WithValue = () => <Slider.Root defaultValue={50}>\n    <Slider.Ui />\n    <Slider.Value />\n</Slider.Root>;"
        }
      ],
      "import": "import { Slider } from '@a-type/ui';"
    },
    "components-spinner": {
      "id": "components-spinner",
      "name": "Spinner",
      "path": "./src/components/spinner/Spinner.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Spinner` to indicate ongoing work and provide an accessible label such as `aria-label=\"Loading\"`. `size` is in pixels and defaults to 40; pass `null` to size it with CSS.\n\n`FullScreenSpinner` centers a spinner while filling the available flex space.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Spinner",
        "definedInFile": "/home/runner/work/ui/ui/src/components/spinner/Spinner.tsx",
        "actualName": "Spinner",
        "exportName": "Spinner",
        "props": {
          "size": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "number | null",
              "elements": [
                {
                  "name": "number"
                },
                {
                  "name": "null"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "40",
              "computed": false
            }
          },
          "thickness": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "3.2",
              "computed": false
            }
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-spinner--default",
          "name": "Default",
          "snippet": "const Default = () => <Spinner />;"
        },
        {
          "id": "components-spinner--small",
          "name": "Small",
          "snippet": "const Small = () => <Spinner size={20} thickness={4} />;"
        },
        {
          "id": "components-spinner--large",
          "name": "Large",
          "snippet": "const Large = () => <Spinner size={80} thickness={12} />;"
        }
      ],
      "import": "import { Spinner } from '@a-type/ui';"
    },
    "components-splashscreen": {
      "id": "components-splashscreen",
      "name": "SplashScreen",
      "path": "./src/components/splashScreen/SplashScreen.stories.tsx",
      "jsDocTags": {},
      "description": "Use `SplashScreen` as a startup surface that fills its container, and place an image or logo inside `SplashScreen.Icon`. Both parts accept `render` when a different underlying element is needed.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "SlotDiv",
        "definedInFile": "/home/runner/work/ui/ui/src/components/utility/SlotDiv.tsx",
        "actualName": "SlotDiv",
        "exportName": "SlotDiv",
        "composes": [
          "UseRenderComponentProps"
        ]
      },
      "stories": [
        {
          "id": "components-splashscreen--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <SplashScreen>\n            <SplashScreen.Icon>\n                <img src=\"/android-chrome-512x512.png\" />\n            </SplashScreen.Icon>\n        </SplashScreen>\n    );\n};"
        }
      ],
      "import": "import { SplashScreen } from '@a-type/ui';"
    },
    "components-switch": {
      "id": "components-switch",
      "name": "Switch",
      "path": "./src/components/switch/Switch.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Switch` for an on/off setting, with an associated label. Control it with `checked` and `onCheckedChange`, or provide `defaultChecked`.\n\nThe default includes a thumb; use `Switch.Root` and `Switch.Thumb` for custom composition.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Switch",
        "definedInFile": "/home/runner/work/ui/ui/src/components/switch/Switch.tsx",
        "actualName": "Switch",
        "exportName": "Switch",
        "props": {
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLButtonElement>",
              "elements": [
                {
                  "name": "HTMLButtonElement"
                }
              ]
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-switch--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return <Switch />;\n};"
        }
      ],
      "import": "import { Switch } from '@a-type/ui';"
    },
    "components-tabs": {
      "id": "components-tabs",
      "name": "Tabs",
      "path": "./src/components/tabs/tabs.stories.tsx",
      "jsDocTags": {},
      "description": "Compose `Tabs` with `Tabs.List`, `Tabs.Trigger`, and matching `Tabs.Content` values. Use `value` and `onValueChange` to control the active tab.\n\nThe tab list scrolls horizontally when its triggers do not fit.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "TabsList",
        "definedInFile": "/home/runner/work/ui/ui/src/components/tabs/tabs.tsx",
        "actualName": "TabsList",
        "exportName": "TabsList",
        "props": {
          "color": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'gray' | 'primary'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'gray'"
                },
                {
                  "name": "literal",
                  "value": "'primary'"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'primary'",
              "computed": false
            }
          }
        }
      },
      "stories": [
        {
          "id": "components-tabs--default",
          "name": "Default",
          "snippet": "const Default = (args) => {\n    const [value, setValue] = useState('tab1');\n    return (\n        <TabsRoot value={value} onValueChange={setValue}>\n            <TabsList color={args.color}>\n                <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n                <TabsTrigger value=\"tab2\">Tab 2 (long)</TabsTrigger>\n                <TabsTrigger value=\"tab3\">Tab 3</TabsTrigger>\n            </TabsList>\n            <TabsContent value=\"tab1\">\n                <div>Tab 1 content</div>\n            </TabsContent>\n            <TabsContent value=\"tab2\">\n                <div>Tab 2 content</div>\n            </TabsContent>\n            <TabsContent value=\"tab3\">\n                <div>Tab 3 content</div>\n            </TabsContent>\n        </TabsRoot>\n    );\n};"
        },
        {
          "id": "components-tabs--with-many-tabs",
          "name": "With Many Tabs",
          "snippet": "const WithManyTabs = (args) => {\n    const [value, setValue] = useState('tab1');\n    return (\n        <TabsRoot value={value} onValueChange={setValue}>\n            <TabsList color={args.color}>\n                {Array.from({ length: 20 }).map((_, i) => (\n                    <TabsTrigger key={i} value={`tab${i + 1}`}>\n                        Tab {i + 1}\n                    </TabsTrigger>\n                ))}\n            </TabsList>\n            {Array.from({ length: 20 }).map((_, i) => (\n                <TabsContent key={i} value={`tab${i + 1}`}>\n                    <div>Tab {i + 1} content</div>\n                </TabsContent>\n            ))}\n        </TabsRoot>\n    );\n};"
        }
      ],
      "import": "import { Tabs, TabsContent, TabsList, TabsRoot, TabsTrigger } from '@a-type/ui';"
    },
    "components-textarea": {
      "id": "components-textarea",
      "name": "TextArea",
      "path": "./src/components/textArea/TextArea.stories.tsx",
      "jsDocTags": {},
      "description": "`TextArea` is a multiline input with the same `onValueChange` and placeholder options as `Input`. It auto-sizes by default; set `autoSize={false}` to use a fixed number of `rows`.\n\nUse `TextArea.Border` and `TextArea.Input` for custom composition, and provide an associated label.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "TextAreaDefault",
        "definedInFile": "/home/runner/work/ui/ui/src/components/textArea/TextArea.tsx",
        "actualName": "TextAreaDefault",
        "props": {
          "autoSelect": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "placeholders": {
            "required": false,
            "tsType": {
              "name": "Array",
              "elements": [
                {
                  "name": "string"
                }
              ],
              "raw": "string[]"
            },
            "description": "Shuffle between random placeholders"
          },
          "placeholdersIntervalMs": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "borderRef": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLDivElement>",
              "elements": [
                {
                  "name": "HTMLDivElement"
                }
              ]
            },
            "description": ""
          },
          "startAccessory": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "endAccessory": {
            "required": false,
            "tsType": {
              "name": "ReactReactNode",
              "raw": "React.ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<any>",
              "elements": [
                {
                  "name": "any"
                }
              ]
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "autoSize": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "padBottomPixels": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          },
          "rows": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": ""
          }
        },
        "composes": [
          "Omit"
        ]
      },
      "stories": [
        {
          "id": "components-textarea--default",
          "name": "Default",
          "snippet": "const Default = () => <TextArea autoSize />;"
        },
        {
          "id": "components-textarea--tall",
          "name": "Tall",
          "snippet": "const Tall = () => <TextArea\n    value=\"This is a tall text area\\nit has a lot\\n of content!\\nas in, quite a bit\\nI think\"\n    autoSize />;"
        },
        {
          "id": "components-textarea--controlled",
          "name": "Controlled",
          "snippet": "const Controlled = () => {\n    const [value, setValue] = useState('Initial value');\n    return <TextArea value={value} onValueChange={setValue} autoSize />;\n};"
        },
        {
          "id": "components-textarea--controlled-from-on-change",
          "name": "Controlled From On Change",
          "snippet": "const ControlledFromOnChange = () => {\n    const [value, setValue] = useState('Initial value');\n    return (\n        <TextArea\n            value={value}\n            onChange={(ev) => {\n                setValue(ev.target.value);\n            }}\n            autoSize\n        />\n    );\n};"
        },
        {
          "id": "components-textarea--sized",
          "name": "Sized",
          "snippet": "const Sized = () => <TextArea\n    style={{ height: 400 }}\n    placeholder=\"This text area has a fixed height of 400px\" />;"
        }
      ],
      "import": "import { TextArea } from '@a-type/ui';"
    },
    "components-toasts": {
      "id": "components-toasts",
      "name": "Toaster",
      "path": "./src/components/toasts/toasts.stories.tsx",
      "jsDocTags": {},
      "description": "Call `toast`, `toast.success`, or `toast.error` to show a message. `toast.promise` tracks a promise, and `toast.loading` returns a `complete` function for a later update.\n\n`Provider` mounts the toast provider and `Toaster`. Use `timeout` in milliseconds and `data.actions` for optional actions.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Toaster",
        "definedInFile": "/home/runner/work/ui/ui/src/components/toasts/toasts.tsx",
        "actualName": "Toaster",
        "exportName": "Toaster"
      },
      "stories": [
        {
          "id": "components-toasts--default",
          "name": "Default",
          "snippet": "const Default = args => {\n    return (\n        <Box col gap>\n            <Box full=\"width\" justify=\"end\">\n                <Button>Test</Button>\n            </Box>\n            <Button\n                onClick={() => {\n                    toast(\n                        'This is a default toast! With a lot of text. Enough to wrap around.',\n                        {\n                            duration: 120_000,\n                        },\n                    );\n                }}\n            >\n                Show Default Toast\n            </Button>\n            <Button\n                className=\"@mode-success\"\n                emphasis=\"light\"\n                onClick={() => {\n                    toast.success('This is a success toast!', {\n                        duration: 20_000,\n                    });\n                }}\n            >\n                Show Success Toast\n            </Button>\n            <Button\n                className=\"@mode-attention\"\n                emphasis=\"light\"\n                onClick={() => {\n                    toast.error('This is an error toast!', {\n                        duration: 20_000,\n                    });\n                }}\n            >\n                Show Error Toast\n            </Button>\n            <Button\n                onClick={() => {\n                    const { complete } = toast.loading('This is a loading toast!');\n                    setTimeout(() => {\n                        complete('Loading complete!', {\n                            duration: 5000,\n                            type: 'success',\n                        });\n                    }, 5000);\n                }}\n            >\n                Show Loading Toast\n            </Button>\n            <Button\n                onClick={() => {\n                    toast.promise(\n                        (async () => {\n                            await new Promise((resolve) => setTimeout(resolve, 3000));\n                        })(),\n                        {\n                            loading:\n                                'Promise is loading... This text is longer to test animation of transition',\n                            success: 'Promise resolved!',\n                            error: 'Promise rejected.',\n                        },\n                    );\n                }}\n            >\n                Show Promise Toast\n            </Button>\n            <Button\n                onClick={() => {\n                    toast('This is a toast with actions!', {\n                        timeout: 20_000,\n                        data: {\n                            actions: [\n                                {\n                                    label: 'Retry',\n                                    emphasis: 'primary',\n                                    onClick: () => {\n                                        alert('Retry clicked!');\n                                    },\n                                },\n                                {\n                                    label: 'Undo',\n                                    emphasis: 'light',\n                                    onClick: () => {\n                                        alert('Undo clicked!');\n                                    },\n                                },\n                            ],\n                        },\n                    });\n                }}\n            >\n                Show Toast with Actions\n            </Button>\n            <Button\n                onClick={() => {\n                    toast({\n                        title: 'Rich Toast',\n                        description: 'This toast has both a title and a description.',\n                        timeout: 20_000,\n                    });\n                }}\n            >\n                Show Rich Toast\n            </Button>\n            <Button\n                onClick={() => {\n                    toast({\n                        id: 'unique-toast-id',\n                        title: 'Unique Toast',\n                        description:\n                            \"This toast has a unique ID. If you click the button multiple times, it won't create multiple toasts, but will update the existing one.\",\n                        timeout: 20_000,\n                    });\n                }}\n            >\n                Show Unique Toast\n            </Button>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, Button, Toaster } from '@a-type/ui';"
    },
    "components-togglegroup": {
      "id": "components-togglegroup",
      "name": "ToggleGroup",
      "path": "./src/components/toggleGroup/toggleGroup.stories.tsx",
      "jsDocTags": {},
      "description": "Use `ToggleGroup` with `ToggleGroup.Item` children, each with a `value`. The controlled `value` and `onValueChange` use an array, even for single selection.\n\nSet `multiple` to allow more than one item to be selected.",
      "reactDocgen": {
        "description": "Provides a shared state to a series of toggle buttons.\n\nDocumentation: [Base UI Toggle Group](https://base-ui.com/react/components/toggle-group)",
        "methods": [],
        "displayName": "ToggleGroup",
        "definedInFile": "/home/runner/work/ui/ui/node_modules/.pnpm/@base-ui+react@1.9.0_@types+react@19.0.1_date-fns@4.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@base-ui/react/toggle-group/ToggleGroup.mjs",
        "actualName": "ToggleGroup",
        "exportName": "ToggleGroup"
      },
      "stories": [
        {
          "id": "components-togglegroup--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <ToggleGroup>\n            <ToggleGroup.Item>Option 1</ToggleGroup.Item>\n            <ToggleGroup.Item>Option 2</ToggleGroup.Item>\n            <ToggleGroup.Item>Option 3</ToggleGroup.Item>\n        </ToggleGroup>\n    );\n};"
        }
      ],
      "import": "import { ToggleGroup } from '@a-type/ui';"
    },
    "components-tooltip": {
      "id": "components-tooltip",
      "name": "Tooltip",
      "path": "./src/components/tooltip/Tooltip.stories.tsx",
      "jsDocTags": {},
      "description": "Wrap one trigger element in `Tooltip` and provide its `content`. Use `side`, `sideOffset`, or `color` to adjust the popup, and `disabled` to bypass the tooltip.\n\nTooltips need a `TooltipProvider`; the library `Provider` already supplies one.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Tooltip",
        "definedInFile": "/home/runner/work/ui/ui/src/components/tooltip/Tooltip.tsx",
        "actualName": "Tooltip",
        "exportName": "Tooltip",
        "props": {
          "content": {
            "required": true,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactElement"
            },
            "description": ""
          },
          "open": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "disabled": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "ref": {
            "required": false,
            "tsType": {
              "name": "ReactRef",
              "raw": "React.Ref<HTMLButtonElement>",
              "elements": [
                {
                  "name": "HTMLButtonElement"
                }
              ]
            },
            "description": ""
          },
          "sideOffset": {
            "defaultValue": {
              "value": "12",
              "computed": false
            },
            "required": false
          }
        },
        "composes": [
          "Omit",
          "Pick"
        ]
      },
      "stories": [
        {
          "id": "components-tooltip--default",
          "name": "Default",
          "snippet": "const Default = () => <Tooltip content=\"hello world\" color=\"contrast\">\n    <Button>Hover me</Button>\n</Tooltip>;"
        },
        {
          "id": "components-tooltip--disabled",
          "name": "Disabled",
          "snippet": "const Disabled = () => <Tooltip content=\"hello world\" color=\"contrast\" disabled>\n    <Button>Hover me</Button>\n</Tooltip>;"
        },
        {
          "id": "components-tooltip--color",
          "name": "Color",
          "snippet": "const Color = () => <Tooltip open content=\"hello world\" color=\"neutral\">\n    <Button>Hover me</Button>\n</Tooltip>;"
        },
        {
          "id": "components-tooltip--customized",
          "name": "Customized",
          "snippet": "const Customized = () => <Tooltip\n    open\n    color=\"contrast\"\n    content={\n        <Box col p>\n            Some content\n        </Box>\n    }>\n    <Button>Hover me</Button>\n</Tooltip>;"
        }
      ],
      "import": "import { Box, Button, Tooltip } from '@a-type/ui';"
    },
    "components-typography": {
      "id": "components-typography",
      "name": "Text",
      "path": "./src/components/typography/typography.stories.tsx",
      "jsDocTags": {},
      "description": "Use `Text`, `Heading`, `HeroText`, `P`, and `TextLink` for styled typography. Props such as `emphasis`, `bold`, `dim`, and `truncate` adjust presentation.\n\n`Heading` renders a span by default: use `render={<h2 />}` (or another heading level) for semantic headings. The `H1` through `H5` helpers are deprecated.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "Text",
        "definedInFile": "/home/runner/work/ui/ui/src/components/typography/typography.tsx",
        "actualName": "Text",
        "exportName": "Text",
        "props": {
          "emphasis": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'primary' | 'secondary' | 'ambient'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'primary'"
                },
                {
                  "name": "literal",
                  "value": "'secondary'"
                },
                {
                  "name": "literal",
                  "value": "'ambient'"
                }
              ]
            },
            "description": ""
          },
          "italic": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "underline": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "strikethrough": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "bold": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "normal": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "uppercase": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "truncate": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "dim": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "color": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'neutral' | 'main' | 'attention' | 'success'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'neutral'"
                },
                {
                  "name": "literal",
                  "value": "'main'"
                },
                {
                  "name": "literal",
                  "value": "'attention'"
                },
                {
                  "name": "literal",
                  "value": "'success'"
                }
              ]
            },
            "description": ""
          },
          "wrap": {
            "required": false,
            "tsType": {
              "name": "boolean"
            },
            "description": ""
          },
          "align": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'start' | 'center' | 'end'",
              "elements": [
                {
                  "name": "literal",
                  "value": "'start'"
                },
                {
                  "name": "literal",
                  "value": "'center'"
                },
                {
                  "name": "literal",
                  "value": "'end'"
                }
              ]
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-typography--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Box col gap>\n            <HeroText emphasis=\"primary\">\n                Hero Text: Lorem ipsum dolor sit amet etc etc\n            </HeroText>\n            <Heading emphasis=\"primary\">\n                Heading Primary: Lorem ipsum dolor sit amet etc etc\n            </Heading>\n            <Heading emphasis=\"secondary\">\n                Heading Secondary: Lorem ipsum dolor sit amet etc etc\n            </Heading>\n            <Heading emphasis=\"ambient\">\n                Heading Ambient: Lorem ipsum dolor sit amet etc etc\n            </Heading>\n            <Text emphasis=\"primary\">\n                Text Primary: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old. Richard McClintock, a Latin\n                professor at Hampden-Sydney College in Virginia, looked up one of the\n                more obscure Latin words, consectetur, from a Lorem Ipsum passage, and\n                going through the cites of the word in classical literature,\n                discovered the undoubtable source. Lorem Ipsum comes from sections\n                1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes\n                of Good and Evil) by Cicero, written in 45 BC. This book is a treatise\n                on the theory of ethics, very popular during the Renaissance. The\n                first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from\n                a line in section 1.10.32.\n            </Text>\n            <Text emphasis=\"secondary\">\n                Text Secondary: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old. Richard McClintock, a Latin\n                professor at Hampden-Sydney College in Virginia, looked up one of the\n                more obscure Latin words, consectetur, from a Lorem Ipsum passage, and\n                going through the cites of the word in classical literature,\n                discovered the undoubtable source. Lorem Ipsum comes from sections\n                1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes\n                of Good and Evil) by Cicero, written in 45 BC. This book is a treatise\n                on the theory of ethics, very popular during the Renaissance. The\n                first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from\n                a line in section 1.10.32.\n            </Text>\n            <Text emphasis=\"ambient\">\n                Text Ambient: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old. Richard McClintock, a Latin\n                professor at Hampden-Sydney College in Virginia, looked up one of the\n                more obscure Latin words, consectetur, from a Lorem Ipsum passage, and\n                going through the cites of the word in classical literature,\n                discovered the undoubtable source. Lorem Ipsum comes from sections\n                1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes\n                of Good and Evil) by Cicero, written in 45 BC. This book is a treatise\n                on the theory of ethics, very popular during the Renaissance. The\n                first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from\n                a line in section 1.10.32.\n            </Text>\n\n            <hr />\n\n            <Text emphasis=\"secondary\" italic underline strikethrough>\n                Text Secondary: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old. Richard McClintock, a Latin\n                professor at Hampden-Sydney College in Virginia, looked up one of the\n                more obscure Latin words, consectetur, from a Lorem Ipsum passage, and\n                going through the cites of the word in classical literature,\n                discovered the undoubtable source.\n            </Text>\n        </Box>\n    );\n};"
        },
        {
          "id": "components-typography--modes",
          "name": "Modes",
          "snippet": "const Modes = ({ mode }: any) => {\n    return (\n        <Box col gap className={`@mode-${mode}`}>\n            <Text emphasis=\"primary\">\n                Text Primary: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old.\n            </Text>\n            <Text emphasis=\"secondary\">\n                Text Secondary: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old.\n            </Text>\n            <Text emphasis=\"ambient\">\n                Text Ambient: Contrary to popular belief, Lorem Ipsum is not simply\n                random text. It has roots in a piece of classical Latin literature\n                from 45 BC, making it over 2000 years old.\n            </Text>\n        </Box>\n    );\n};"
        }
      ],
      "import": "import { Box, Heading, HeroText, Text } from '@a-type/ui';"
    },
    "components-viewport": {
      "id": "components-viewport",
      "name": "Viewport",
      "path": "./src/components/viewport/Viewport.stories.tsx",
      "jsDocTags": {},
      "description": "`Viewport` provides pan and zoom for its children. Give it a constrained size and add `Viewport.Control` with `Viewport.ZoomControls` for visible controls.\n\nConfigure `minZoom`, `maxZoom`, and the default center or zoom as needed. Use `viewportRef` outside the viewport or `useViewport()` in a descendant for programmatic control.",
      "reactDocgen": {
        "description": "",
        "methods": [],
        "displayName": "ViewportRoot",
        "definedInFile": "/home/runner/work/ui/ui/src/components/viewport/Viewport.tsx",
        "actualName": "ViewportRoot",
        "exportName": "ViewportRoot",
        "props": {
          "children": {
            "required": false,
            "tsType": {
              "name": "ReactNode"
            },
            "description": ""
          },
          "className": {
            "required": false,
            "tsType": {
              "name": "string"
            },
            "description": ""
          },
          "style": {
            "required": false,
            "tsType": {
              "name": "CSSProperties"
            },
            "description": ""
          },
          "defaultCenter": {
            "required": false,
            "tsType": {
              "name": "PositionOrPercentage"
            },
            "description": ""
          },
          "onZoomChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(zoom: number) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "number"
                    },
                    "name": "zoom"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "onCenterChange": {
            "required": false,
            "tsType": {
              "name": "signature",
              "type": "function",
              "raw": "(center: { x: number; y: number }) => void",
              "signature": {
                "arguments": [
                  {
                    "type": {
                      "name": "signature",
                      "type": "object",
                      "raw": "{ x: number; y: number }",
                      "signature": {
                        "properties": [
                          {
                            "key": "x",
                            "value": {
                              "name": "number",
                              "required": true
                            }
                          },
                          {
                            "key": "y",
                            "value": {
                              "name": "number",
                              "required": true
                            }
                          }
                        ]
                      }
                    },
                    "name": "center"
                  }
                ],
                "return": {
                  "name": "void"
                }
              }
            },
            "description": ""
          },
          "viewportRef": {
            "required": false,
            "tsType": {
              "name": "RefObject",
              "elements": [
                {
                  "name": "union",
                  "raw": "ViewportState | null",
                  "elements": [
                    {
                      "name": "ViewportState"
                    },
                    {
                      "name": "null"
                    }
                  ]
                }
              ],
              "raw": "RefObject<ViewportState | null>"
            },
            "description": "Get access to the viewport from outside this component"
          },
          "minZoom": {
            "required": false,
            "tsType": {
              "name": "union",
              "raw": "'fit' | number",
              "elements": [
                {
                  "name": "literal",
                  "value": "'fit'"
                },
                {
                  "name": "number"
                }
              ]
            },
            "description": "",
            "defaultValue": {
              "value": "'fit'",
              "computed": false
            }
          },
          "maxZoom": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "3",
              "computed": false
            }
          },
          "defaultZoom": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "0.5",
              "computed": false
            }
          },
          "panLimitBuffer": {
            "required": false,
            "tsType": {
              "name": "number"
            },
            "description": "",
            "defaultValue": {
              "value": "100",
              "computed": false
            }
          },
          "gestureOptions": {
            "required": false,
            "tsType": {
              "name": "ViewportGestureControlOptions"
            },
            "description": ""
          }
        }
      },
      "stories": [
        {
          "id": "components-viewport--default",
          "name": "Default",
          "snippet": "const Default = () => {\n    return (\n        <Viewport\n            style={{\n                height: 600,\n                width: '100%',\n            }}\n            onCenterChange={undefined}\n            onZoomChange={undefined}>\n            <img src=\"https://resources.biscuits.club/images/pashka.jpg\" />\n            <Viewport.Control>\n                <Viewport.ZoomControls />\n            </Viewport.Control>\n            <Viewport.Control position=\"bottom-right\">\n                <CenterButton />\n            </Viewport.Control>\n        </Viewport>\n    );\n};"
        },
        {
          "id": "components-viewport--high-zoom-level",
          "name": "High Zoom Level",
          "snippet": "const HighZoomLevel = () => {\n    return (\n        <Viewport\n            style={{\n                height: 600,\n                width: '100%',\n            }}\n            defaultZoom={100}\n            maxZoom={1000}\n            minZoom={10}\n            onCenterChange={undefined}\n            onZoomChange={undefined}>\n            <img src=\"https://resources.biscuits.club/images/pashka.jpg\" width={10} />\n            <Viewport.Control>\n                <Viewport.ZoomControls />\n            </Viewport.Control>\n            <Viewport.Control position=\"bottom-right\">\n                <CenterButton />\n            </Viewport.Control>\n        </Viewport>\n    );\n};"
        }
      ],
      "import": "import { Button, Icon, Viewport } from '@a-type/ui';"
    }
  },
  "meta": {
    "docgen": "react-docgen",
    "durationMs": 2134
  }
}