[
  {
    "name": "Button",
    "package": "@wizeworks/silicaui-react",
    "category": "Actions",
    "sourceFile": "silicaui-react/src/button.tsx",
    "description": "Silica Button — a thin wrapper that applies Silica's `btn` classes. It's a presentational component, so it doesn't pull in a headless primitive; the `render` prop covers polymorphism.",
    "props": [
      {
        "name": "ButtonProps",
        "extends": "extends React.ButtonHTMLAttributes<HTMLButtonElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "ButtonColor",
            "doc": "Semantic or custom color; maps to `btn-<color>`."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "ButtonVariant",
            "doc": "How the color is applied. Default `solid`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "ButtonSize",
            "doc": "Default `md`."
          },
          {
            "name": "shape",
            "optional": true,
            "type": "\"square\" | \"circle\"",
            "doc": "Icon-only button shape."
          },
          {
            "name": "block",
            "optional": true,
            "type": "boolean",
            "doc": "Full-width."
          },
          {
            "name": "wide",
            "optional": true,
            "type": "boolean",
            "doc": "Extra-wide."
          },
          {
            "name": "active",
            "optional": true,
            "type": "boolean",
            "doc": "Force the pressed look."
          },
          {
            "name": "loading",
            "optional": true,
            "type": "boolean",
            "doc": "Show a spinner, set `aria-busy`, and make the button non-interactive."
          },
          {
            "name": "iconStart",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "iconEnd",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "render",
            "optional": true,
            "type": "React.ReactElement",
            "doc": "Render as a different element (e.g. an anchor or router link) while keeping Silica's classes and behavior. Mirrors Base UI's `render` composition model. <Button render={<a href=\"/docs\" />}>Docs</Button> CLIENT COMPONENTS ONLY. This package is a `\"use client\"` module, so an element passed from a React Server Component is serialized across the boundary and arrives without its props — the link renders styled but without its `href`, or throws outright. From a Server Component, style the element directly instead of composing it: import { buttonClasses } from \"@wizeworks/silicaui-react/server\"; <a href=\"/docs\" className={buttonClasses({ color: \"brand\" })}>Docs</a>"
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row, Stack } from \"../lib/Section\";\nimport { ColorVariantSizeGrid } from \"../lib/ColorGrid\";\nimport { PlusIcon } from \"../lib/icons\";\nimport { VARIANTS } from \"../lib/data\";\n\nexport function ButtonDemo() {\n    const [loading, setLoading] = useState(false);\n\n    function fakeSave() {\n        setLoading(true);\n        setTimeout(() => setLoading(false), 1800);\n    }\n\n    return (\n        <>\n            <ColorVariantSizeGrid\n                Component={Button}\n                variants={VARIANTS.filter((v) => v !== \"solid\")}\n            />\n\n            <Section title=\"Icon buttons (square / circle)\">\n                <Row>\n                    <Button color=\"primary\" shape=\"square\" aria-label=\"Add\">\n                        <PlusIcon />\n                    </Button>\n                    <Button color=\"secondary\" shape=\"circle\" aria-label=\"Add\">\n                        <PlusIcon />\n                    </Button>\n                    <Button color=\"accent\" variant=\"outline\" shape=\"circle\" aria-label=\"Add\">\n                        <PlusIcon />\n                    </Button>\n                    <Button color=\"brand\" iconStart={<PlusIcon />}>\n                        with icon\n                    </Button>\n                </Row>\n            </Section>\n\n            <Section title=\"States\">\n                <Row>\n                    <Button color=\"primary\" loading={loading} onClick={fakeSave}>\n                        {loading ? \"Saving…\" : \"Click to load\"}\n                    </Button>\n                    <Button color=\"primary\" disabled>\n                        Disabled\n                    </Button>\n                    <Button color=\"primary\" variant=\"outline\" active>\n                        Active\n                    </Button>\n                </Row>\n            </Section>\n\n            <Section title=\"Polymorphism · render → a real <a href>\">\n                <Row>\n                    <Button\n                        color=\"brand\"\n                        variant=\"link\"\n                        render={<a href=\"https://example.com\" />}\n                    >\n                        Anchor · link style\n                    </Button>\n                    <Button color=\"brand\" render={<a href=\"https://example.com\" />}>\n                        Anchor · button style\n                    </Button>\n                </Row>\n            </Section>\n\n            <Section title=\"Layout\">\n                <Stack className=\"w-full\">\n                    <Button color=\"primary\" block>\n                        Block\n                    </Button>\n                    <Button color=\"neutral\" variant=\"outline\" wide>\n                        Wide\n                    </Button>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "DropdownMenu",
    "package": "@wizeworks/silicaui-react",
    "category": "Actions",
    "sourceFile": "silicaui-react/src/dropdown-menu.tsx",
    "description": "Silica Dropdown Menu — a command menu (Base UI: roving focus, typeahead, dismissal). Distinct from the static `Menu` nav-list. <DropdownMenu> <DropdownMenuTrigger><Button variant=\"outline\">Options</Button></DropdownMenuTrigger> <DropdownMenuContent> <DropdownMenuLabel>Actions</DropdownMenuLabel> <DropdownMenuItem onClick={…}>Edit</DropdownMenuItem> <DropdownMenuItem onClick={…}>Duplicate</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem disabled>Archive</DropdownMenuItem> </DropdownMenuContent> </DropdownMenu>",
    "props": [
      {
        "name": "DropdownMenuProps",
        "members": []
      },
      {
        "name": "DropdownMenuContentProps",
        "extends": "extends Omit<Styled<typeof BaseMenu.Popup>, \"children\">,\n    PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DropdownMenuSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "DropdownMenuAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Swap",
    "package": "@wizeworks/silicaui-react",
    "category": "Actions",
    "sourceFile": "silicaui-react/src/swap.tsx",
    "description": "Silica Swap — cross-fades (or rotates/flips) between two icons on toggle. <Swap variant=\"rotate\" on={<CloseIcon />} off={<MenuIcon />} label=\"Menu\" />",
    "props": [
      {
        "name": "SwapProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLLabelElement>, \"onChange\">",
        "members": [
          {
            "name": "on",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "Shown when active (checked)."
          },
          {
            "name": "off",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "Shown when inactive."
          },
          {
            "name": "active",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled active state."
          },
          {
            "name": "defaultActive",
            "optional": true,
            "type": "boolean",
            "doc": "Initial state when uncontrolled."
          },
          {
            "name": "onActiveChange",
            "optional": true,
            "type": "(active: boolean) => void",
            "doc": "Called when toggled."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "SwapVariant",
            "doc": "Transition style. `fade` (default), `rotate`, or `flip`."
          },
          {
            "name": "label",
            "optional": true,
            "type": "string",
            "doc": "Accessible label."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Swap } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nfunction MenuIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"28\" height=\"28\">\n            <path d=\"M4 6h16M4 12h16M4 18h16\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction CloseIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"28\" height=\"28\">\n            <path d=\"M6 6l12 12M18 6 6 18\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction SunIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"24\" height=\"24\">\n            <circle cx=\"12\" cy=\"12\" r=\"4\" />\n            <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction MoonIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"24\" height=\"24\">\n            <path d=\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z\" />\n        </svg>\n    );\n}\n\nexport function SwapDemo() {\n    const [menuOpen, setMenuOpen] = useState(false);\n\n    return (\n        <>\n            <Section title=\"Transition variants\">\n                <Row>\n                    <Swap variant=\"fade\" on={<CloseIcon />} off={<MenuIcon />} label=\"Fade\" />\n                    <Swap variant=\"rotate\" on={<CloseIcon />} off={<MenuIcon />} label=\"Rotate\" />\n                    <Swap variant=\"flip\" on={<MoonIcon />} off={<SunIcon />} label=\"Flip\" />\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · controlled mobile menu toggle\">\n                <div className=\"flex items-center gap-3\">\n                    <Swap\n                        variant=\"rotate\"\n                        active={menuOpen}\n                        onActiveChange={setMenuOpen}\n                        on={<CloseIcon />}\n                        off={<MenuIcon />}\n                        label=\"Toggle menu\"\n                    />\n                    <span className=\"text-sm opacity-70\">\n                        Menu is {menuOpen ? \"open\" : \"closed\"}\n                    </span>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Accordion",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/accordion.tsx",
    "description": "Silica Accordion — collapsible sections (Base UI behavior, animated height). <Accordion multiple={false} defaultValue={[\"a\"]}> <AccordionItem value=\"a\"> <AccordionTrigger>What is Silica?</AccordionTrigger> <AccordionPanel>A design system on one token model.</AccordionPanel> </AccordionItem> <AccordionItem value=\"b\"> <AccordionTrigger>Is it themeable?</AccordionTrigger> <AccordionPanel>Yes — every color is a token.</AccordionPanel> </AccordionItem> </Accordion>",
    "props": [
      {
        "name": "AccordionTriggerProps",
        "extends": "extends Styled<typeof BaseAccordion.Trigger>",
        "members": [
          {
            "name": "chevron",
            "optional": true,
            "type": "boolean",
            "doc": "Set false to omit the built-in chevron."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Accordion,\n    AccordionItem,\n    AccordionTrigger,\n    AccordionPanel,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function AccordionDemo() {\n    return (\n        <>\n            <Section title=\"Real use · FAQ (single-open)\">\n                <Accordion defaultValue={[\"a\"]} className=\"max-w-md\">\n                    <AccordionItem value=\"a\">\n                        <AccordionTrigger>What is Silica?</AccordionTrigger>\n                        <AccordionPanel>\n                            A component library and design system built on one CSS-first\n                            token model.\n                        </AccordionPanel>\n                    </AccordionItem>\n                    <AccordionItem value=\"b\">\n                        <AccordionTrigger>Is it themeable?</AccordionTrigger>\n                        <AccordionPanel>\n                            Yes — every color, radius, and size is a CSS variable you can\n                            override per theme.\n                        </AccordionPanel>\n                    </AccordionItem>\n                    <AccordionItem value=\"c\">\n                        <AccordionTrigger>Does it work with any framework?</AccordionTrigger>\n                        <AccordionPanel>\n                            The core is a Tailwind plugin; React components are a thin\n                            typed layer on top.\n                        </AccordionPanel>\n                    </AccordionItem>\n                </Accordion>\n            </Section>\n\n            <Section title=\"Multiple open at once\">\n                <Accordion multiple defaultValue={[\"a\", \"b\"]} className=\"max-w-md\">\n                    <AccordionItem value=\"a\">\n                        <AccordionTrigger>Section one</AccordionTrigger>\n                        <AccordionPanel>Both of these can be open together.</AccordionPanel>\n                    </AccordionItem>\n                    <AccordionItem value=\"b\">\n                        <AccordionTrigger>Section two</AccordionTrigger>\n                        <AccordionPanel>Set the `multiple` prop to allow it.</AccordionPanel>\n                    </AccordionItem>\n                </Accordion>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Avatar",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/avatar.tsx",
    "description": "Silica Avatar — a photo, or an initials/icon fallback on a colored chip. <Avatar src={url} alt=\"Jane Doe\">JD</Avatar> // photo, falls back to \"JD\" <Avatar color=\"primary\" alt=\"Ada Lovelace\">AL</Avatar> // initials chip <Avatar color=\"accent\"><UserIcon /></Avatar> // icon fallback `children` are the fallback shown when there's no `src` or the image errors. When falling back to initials with an `alt`, the container is exposed as an `img` with that label so assistive tech announces the person, not \"JD\".",
    "props": [
      {
        "name": "AvatarProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "AvatarColor",
            "doc": "Fallback-chip + ring color; maps to `avatar-<color>`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "AvatarSize",
            "doc": "Default `md`."
          },
          {
            "name": "shape",
            "optional": true,
            "type": "AvatarShape",
            "doc": "`circle` (default) or a `rounded` square."
          },
          {
            "name": "ring",
            "optional": true,
            "type": "boolean",
            "doc": "Draw an accent ring with a base-100 gap."
          },
          {
            "name": "status",
            "optional": true,
            "type": "AvatarStatus",
            "doc": "Presence dot in the corner."
          },
          {
            "name": "src",
            "optional": true,
            "type": "string",
            "doc": "Photo URL. If it fails to load, the fallback `children` show instead."
          },
          {
            "name": "alt",
            "optional": true,
            "type": "string",
            "doc": "Accessible label for the photo / the initials fallback."
          }
        ]
      }
    ],
    "usageExample": "import { Avatar, AvatarGroup } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS, SIZES } from \"../lib/data\";\n\n// A stand-in \"photo\" (data URI, always loads offline): a head-and-shoulders\n// silhouette on a gradient, so the image path — object-fit cover + rounding —\n// is demonstrated without a network request.\nconst PHOTO = `data:image/svg+xml,${encodeURIComponent(\n    `<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>` +\n        `<defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'>` +\n        `<stop offset='0' stop-color='#6366f1'/><stop offset='1' stop-color='#ec4899'/>` +\n        `</linearGradient></defs>` +\n        `<rect width='100' height='100' fill='url(#g)'/>` +\n        `<circle cx='50' cy='40' r='18' fill='rgba(255,255,255,.92)'/>` +\n        `<rect x='22' y='62' width='56' height='38' rx='19' fill='rgba(255,255,255,.92)'/>` +\n        `</svg>`,\n)}`;\n\nexport function AvatarDemo() {\n    return (\n        <>\n            <Section title=\"Colors (initials fallback)\">\n                <Row>\n                    {COLORS.map((color) => (\n                        <Avatar key={color} color={color} alt={color}>\n                            {color.slice(0, 2).toUpperCase()}\n                        </Avatar>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <Avatar key={size} color=\"primary\" size={size} alt={size}>\n                            {size.toUpperCase()}\n                        </Avatar>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · team roster with presence\">\n                <Row>\n                    <Avatar src={PHOTO} alt=\"Ada Lovelace\" ring status=\"online\" />\n                    <Avatar color=\"secondary\" alt=\"Grace Hopper\" ring status=\"online\">\n                        GH\n                    </Avatar>\n                    <Avatar color=\"neutral\" alt=\"Alan Turing\" status=\"offline\">\n                        AT\n                    </Avatar>\n                    <Avatar shape=\"rounded\" color=\"brand\" alt=\"Katherine Johnson\">\n                        KJ\n                    </Avatar>\n                </Row>\n                <Row>\n                    <span className=\"text-xs opacity-60\">Overlapping group —</span>\n                    <AvatarGroup>\n                        <Avatar src={PHOTO} alt=\"Ada Lovelace\" />\n                        <Avatar color=\"secondary\" alt=\"Grace Hopper\">\n                            GH\n                        </Avatar>\n                        <Avatar color=\"accent\" alt=\"Alan Turing\">\n                            AT\n                        </Avatar>\n                        <Avatar color=\"neutral\" alt=\"+3 more\">\n                            +3\n                        </Avatar>\n                    </AvatarGroup>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Badge",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/badge.tsx",
    "description": "Silica Badge — a small pill for labels, counts, and statuses. Presentational; `render` covers polymorphism (e.g. wrap a link).",
    "props": [
      {
        "name": "BadgeProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "BadgeColor",
            "doc": "Semantic or custom color; maps to `badge-<color>`."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "BadgeVariant",
            "doc": "How the color is applied. Default `solid`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "BadgeSize",
            "doc": "Default `md`."
          },
          {
            "name": "render",
            "optional": true,
            "type": "React.ReactElement",
            "doc": "Render as a different element while keeping Silica's classes. CLIENT COMPONENTS ONLY — from a React Server Component the element loses its props crossing the `\"use client\"` boundary. Style the element directly instead: `badgeClasses()` from `@wizeworks/silicaui-react/server`."
          }
        ]
      }
    ],
    "usageExample": "import { Badge } from \"@wizeworks/silicaui-react\";\nimport { ColorVariantSizeGrid } from \"../lib/ColorGrid\";\n\nexport function BadgeDemo() {\n    return (\n        <ColorVariantSizeGrid\n            Component={Badge}\n            variants={[\"outline\", \"soft\", \"ghost\", \"dash\"]}\n        />\n    );\n}"
  },
  {
    "name": "Card",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/card.tsx",
    "description": "Silica Card — a surface container. Compose it from parts: <Card> <figure><img src={cover} alt=\"\" /></figure> <CardBody> <CardTitle>Heading</CardTitle> <p>Body copy…</p> <CardActions> <Button color=\"primary\">Action</Button> </CardActions> </CardBody> </Card>",
    "props": [
      {
        "name": "CardProps",
        "members": []
      },
      {
        "name": "ClickableCardProps",
        "extends": "extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\">",
        "members": [
          {
            "name": "render",
            "optional": true,
            "type": "React.ReactElement",
            "doc": "Render as a different element (e.g. an anchor) while keeping Card's classes and interaction styles. Mirrors Base UI's `render` composition. <ClickableCard render={<a href=\"/projects/silica\" />}>…</ClickableCard> CLIENT COMPONENTS ONLY — from a React Server Component the element loses its props crossing the `\"use client\"` boundary. Style the element directly instead: `clickableCardClasses()` from `@wizeworks/silicaui-react/server`."
          }
        ]
      },
      {
        "name": "SelectableCardProps",
        "extends": "extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\">",
        "members": [
          {
            "name": "type",
            "optional": true,
            "type": "\"radio\" | \"checkbox\"",
            "doc": "`\"radio\"` for a single-select group (shared `name`), `\"checkbox\"` for multi-select. Default `\"radio\"`."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Card,\n    CardBody,\n    CardTitle,\n    CardActions,\n    ClickableCard,\n    SelectableCard,\n    Button,\n    Badge,\n    Input,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function CardDemo() {\n    return (\n        <>\n            <Section title=\"Surfaces\">\n                <div className=\"grid gap-6 sm:grid-cols-2\">\n                    <Card>\n                        <CardBody>\n                            <div className=\"flex items-center justify-between\">\n                                <CardTitle>Project Silica</CardTitle>\n                                <Badge color=\"success\" variant=\"soft\">\n                                    Active\n                                </Badge>\n                            </div>\n                            <p className=\"opacity-70\">\n                                A card sits on the <code>base-100</code> surface, rounds\n                                with <code>--radius-box</code>, and lifts with{\" \"}\n                                <code>--depth</code>.\n                            </p>\n                            <CardActions>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Cancel\n                                </Button>\n                                <Button color=\"primary\">Deploy</Button>\n                            </CardActions>\n                        </CardBody>\n                    </Card>\n\n                    <Card>\n                        <CardBody>\n                            <CardTitle>Newsletter</CardTitle>\n                            <p className=\"opacity-70\">\n                                Inputs and buttons share the field tier, so they line up.\n                            </p>\n                            <div className=\"flex gap-2\">\n                                <Input placeholder=\"you@example.com\" />\n                                <Button color=\"primary\">Subscribe</Button>\n                            </div>\n                        </CardBody>\n                    </Card>\n                </div>\n            </Section>\n\n            <Section title=\"ClickableCard · whole surface is a button (or render as a link)\">\n                <div className=\"grid gap-4 sm:grid-cols-3\">\n                    <ClickableCard onClick={() => console.log(\"open repo\")}>\n                        <CardBody>\n                            <CardTitle>Repository</CardTitle>\n                            <p className=\"opacity-70\">Click anywhere on this card.</p>\n                        </CardBody>\n                    </ClickableCard>\n                    <ClickableCard render={<a href=\"#card\" />}>\n                        <CardBody>\n                            <CardTitle>As a link</CardTitle>\n                            <p className=\"opacity-70\">Renders an &lt;a&gt;, same styling.</p>\n                        </CardBody>\n                    </ClickableCard>\n                    <ClickableCard disabled>\n                        <CardBody>\n                            <CardTitle>Disabled</CardTitle>\n                            <p className=\"opacity-70\">Not interactive.</p>\n                        </CardBody>\n                    </ClickableCard>\n                </div>\n            </Section>\n\n            <Section title=\"SelectableCard · radio group and independent checkboxes\">\n                <div className=\"grid gap-4 sm:grid-cols-3\">\n                    {([\"Starter\", \"Pro\", \"Enterprise\"] as const).map((plan, i) => (\n                        <SelectableCard key={plan} name=\"selectable-plan\" defaultChecked={i === 1}>\n                            <CardBody>\n                                <CardTitle>{plan}</CardTitle>\n                                <p className=\"opacity-70\">\n                                    {i === 0 ? \"For side projects.\" : i === 1 ? \"For growing teams.\" : \"For scale.\"}\n                                </p>\n                            </CardBody>\n                        </SelectableCard>\n                    ))}\n                </div>\n                <div className=\"mt-4 grid gap-4 sm:grid-cols-3\">\n                    {([\"Email alerts\", \"SMS alerts\", \"Push alerts\"] as const).map((opt) => (\n                        <SelectableCard key={opt} type=\"checkbox\" defaultChecked={opt === \"Email alerts\"}>\n                            <CardBody>\n                                <CardTitle>{opt}</CardTitle>\n                            </CardBody>\n                        </SelectableCard>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Glass · Tier-0 frosted treatment (backdrop-filter blur + saturate, no SVG refraction)\">\n                <div\n                    className=\"rounded-box p-8\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <div className=\"grid gap-6 sm:grid-cols-2\">\n                        <Card className=\"glass\">\n                            <CardBody>\n                                <CardTitle>Neutral frost</CardTitle>\n                                <p className=\"opacity-80\">\n                                    Plain <code>glass</code> — no color declared, so it\n                                    frosts the neutral <code>base-100</code> surface.\n                                </p>\n                            </CardBody>\n                        </Card>\n\n                        <Card className=\"bg-primary glass\">\n                            <CardBody>\n                                <CardTitle>Tinted frost</CardTitle>\n                                <p className=\"opacity-80\">\n                                    <code>bg-primary glass</code> — same{\" \"}\n                                    <code>--u-accent</code> hook <code>soft</code> uses,\n                                    so the frost picks up primary for colored depth.\n                                </p>\n                            </CardBody>\n                        </Card>\n                    </div>\n\n                    <div className=\"mt-6 grid gap-4 sm:grid-cols-3\">\n                        <ClickableCard\n                            className=\"glass\"\n                            onClick={() => console.log(\"open repo\")}\n                        >\n                            <CardBody>\n                                <CardTitle>Clickable + glass</CardTitle>\n                                <p className=\"opacity-80\">\n                                    Hover still lifts — the rim sheen lives on its own\n                                    pseudo-element, not the hover shadow.\n                                </p>\n                            </CardBody>\n                        </ClickableCard>\n\n                        {([\"Starter\", \"Pro\"] as const).map((plan, i) => (\n                            <SelectableCard\n                                key={plan}\n                                name=\"selectable-plan-glass\"\n                                defaultChecked={i === 0}\n                                className=\"glass\"\n                            >\n                                <CardBody>\n                                    <CardTitle>{plan}</CardTitle>\n                                    <p className=\"opacity-80\">\n                                        Checked ring still reads through the frost.\n                                    </p>\n                                </CardBody>\n                            </SelectableCard>\n                        ))}\n                    </div>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Carousel",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/carousel.tsx",
    "description": "Silica Carousel — a scroll-snap strip driven by real prev/next controls and dot indicators (with optional loop + autoplay), not just a scrollable list. <Carousel loop autoplay={4000} className=\"gap-4 rounded-box\"> <CarouselItem className=\"w-full\"><img … /></CarouselItem> <CarouselItem className=\"w-full\"><img … /></CarouselItem> </Carousel>",
    "props": [
      {
        "name": "CarouselProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">",
        "members": [
          {
            "name": "snap",
            "optional": true,
            "type": "CarouselSnap",
            "doc": "Snap alignment of items. `start` (default), `center`, or `end`."
          },
          {
            "name": "orientation",
            "optional": true,
            "type": "CarouselOrientation",
            "doc": "`horizontal` (default) or `vertical`."
          },
          {
            "name": "controls",
            "optional": true,
            "type": "boolean",
            "doc": "Show prev/next controls. Default `true`."
          },
          {
            "name": "indicators",
            "optional": true,
            "type": "boolean | \"dots\" | \"numbers\"",
            "doc": "Bottom indicators: `dots` (default), `numbers` (paged), or `false` to hide."
          },
          {
            "name": "loop",
            "optional": true,
            "type": "boolean",
            "doc": "Wrap around past the first/last slide. Default `false`."
          },
          {
            "name": "autoplay",
            "optional": true,
            "type": "number",
            "doc": "Auto-advance every N ms (pauses on hover/focus). Off by default."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(index: number) => void",
            "doc": "Called with the active slide index whenever it changes."
          },
          {
            "name": "onChange",
            "optional": true,
            "type": "(index: number) => void",
            "doc": "@deprecated Use `onValueChange`. `onChange` is reserved for the native DOM handler on components that wrap a real form element; still honored here so this isn't a breaking change."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Extra class, applied to BOTH the outer root (so e.g. a width constraint like `max-w-lg` actually shrinks the carousel — the prev/next controls are positioned relative to the root, not the scroll surface) and the scroll surface itself (so e.g. `gap-4`/`rounded-box` still style the strip/items as before). A plain single-target `className` would have to pick one, and picking the scroll surface silently breaks control positioning for the single most common use — constraining overall width."
          }
        ]
      },
      {
        "name": "CarouselItemProps",
        "members": []
      }
    ],
    "usageExample": "import type { CSSProperties } from \"react\";\nimport { Carousel, CarouselItem } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst SLIDES = [\"primary\", \"secondary\", \"accent\", \"info\", \"success\"] as const;\n\nfunction slideStyle(color: string): CSSProperties {\n    return {\n        backgroundColor: `var(--color-${color})`,\n        color: `var(--color-${color}-content, #fff)`,\n    };\n}\n\nexport function CarouselDemo() {\n    return (\n        <>\n            <Section title=\"Real use · loop + autoplay\">\n                <Carousel loop autoplay={3000} className=\"max-w-lg gap-4 rounded-box\">\n                    {SLIDES.map((color) => (\n                        <CarouselItem\n                            key={color}\n                            className=\"flex h-40 w-full shrink-0 items-center justify-center rounded-box font-semibold\"\n                            style={slideStyle(color)}\n                        >\n                            {color}\n                        </CarouselItem>\n                    ))}\n                </Carousel>\n            </Section>\n\n            <Section title=\"Numbered indicators, no loop\">\n                <Carousel indicators=\"numbers\" className=\"max-w-lg gap-4 rounded-box\">\n                    {SLIDES.slice(0, 3).map((color) => (\n                        <CarouselItem\n                            key={color}\n                            className=\"flex h-32 w-full shrink-0 items-center justify-center rounded-box font-semibold\"\n                            style={slideStyle(color)}\n                        >\n                            {color}\n                        </CarouselItem>\n                    ))}\n                </Carousel>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Chat",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat.tsx",
    "description": "Silica Chat — a message row: avatar, header, bubble, footer. <Chat side=\"start\"> <ChatImage><Avatar>OW</Avatar></ChatImage> <ChatHeader>Obi-Wan <time>12:45</time></ChatHeader> <ChatBubble>You were the chosen one!</ChatBubble> <ChatFooter>Seen</ChatFooter> </Chat> <Chat side=\"end\"> <ChatBubble color=\"primary\">I hate you!</ChatBubble> </Chat>",
    "props": [
      {
        "name": "ChatProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": "`start` (incoming, avatar left) or `end` (outgoing, avatar right)."
          }
        ]
      },
      {
        "name": "ChatImageProps",
        "members": []
      },
      {
        "name": "ChatHeaderProps",
        "members": []
      },
      {
        "name": "ChatFooterProps",
        "members": []
      },
      {
        "name": "ChatBubbleProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "ChatBubbleColor",
            "doc": "Bubble color; maps to `chat-bubble-<color>`. Default neutral base-200."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Chat,\n    ChatImage,\n    ChatHeader,\n    ChatBubble,\n    ChatFooter,\n    Avatar,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function ChatDemo() {\n    return (\n        <>\n            <Section title=\"Bubble colors\">\n                <div className=\"flex flex-col gap-3\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Chat key={color} side=\"end\">\n                            <ChatBubble color={color}>{color} bubble</ChatBubble>\n                        </Chat>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · a short conversation\">\n                <div className=\"flex max-w-md flex-col gap-1\">\n                    <Chat side=\"start\">\n                        <ChatImage>\n                            <Avatar color=\"neutral\" alt=\"Obi-Wan\">\n                                OW\n                            </Avatar>\n                        </ChatImage>\n                        <ChatHeader>\n                            Obi-Wan <time className=\"opacity-60\">12:45</time>\n                        </ChatHeader>\n                        <ChatBubble>You were the chosen one!</ChatBubble>\n                    </Chat>\n                    <Chat side=\"start\">\n                        <ChatImage>\n                            <Avatar color=\"neutral\" alt=\"Obi-Wan\">\n                                OW\n                            </Avatar>\n                        </ChatImage>\n                        <ChatBubble>\n                            It was said that you would destroy the Sith, not join them.\n                        </ChatBubble>\n                    </Chat>\n                    <Chat side=\"end\">\n                        <ChatBubble color=\"primary\">I hate you!</ChatBubble>\n                        <ChatFooter>Delivered</ChatFooter>\n                    </Chat>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "ChatComposer",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-composer.tsx",
    "description": "Silica ChatComposer — an auto-growing message input + send button. Enter submits; Shift+Enter inserts a newline. Uncontrolled by default (manages its own draft text and clears on send); pass `value`/`onValueChange` to control it (e.g. to persist an in-progress draft). <ChatComposer onSend={(text) => sendMessage(text)} placeholder=\"Message…\" />",
    "props": [
      {
        "name": "ChatComposerProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled draft text."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial draft text."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string) => void",
            "doc": ""
          },
          {
            "name": "onSend",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires with the trimmed text on submit (Enter, or the send button); the field then clears."
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "actions",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Extra leading controls (e.g. an attach button), placed before the field."
          },
          {
            "name": "sendLabel",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Override the send button's content. Default a paper-plane icon."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ChatLayout",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-layout.tsx",
    "description": "Silica ChatLayout — the outer flex column for a conversation screen: give it a height (or let it fill a flex/grid parent), put `ChatLayoutMessages` first and a `ChatComposer` (or anything) last. <ChatLayout className=\"h-[32rem]\"> <ChatLayoutMessages> {messages.map((m) => <ChatMessage key={m.id} {...m} />)} </ChatLayoutMessages> <ChatComposer onSend={sendMessage} /> </ChatLayout>",
    "props": [
      {
        "name": "ChatLayoutProps",
        "members": []
      },
      {
        "name": "ChatLayoutMessagesProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "stickToBottom",
            "optional": true,
            "type": "boolean",
            "doc": "Auto-scroll to the newest message on update — but only while the user is already near the bottom, so scrolling up to read history isn't yanked away by an incoming message. Default `true`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ChatMessage",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-message.tsx",
    "description": "Silica ChatMessage — a friendlier entry point over the `Chat`/`ChatImage`/ `ChatBubble`/`ChatFooter` primitives, for the common case of \"one message, maybe with an avatar and metadata\" without composing four parts by hand each time. Reach for the primitives directly when you need more control (e.g. a Slack-style name/time row ABOVE the bubble via `ChatHeader` — `ChatMessage` itself puts name/time in the footer, after the bubble, to match a modern messaging-app read: the message is the point, the timestamp is a quiet trailing detail). <ChatMessage side=\"start\" avatar={<Avatar>OW</Avatar>} name=\"Obi-Wan\" time=\"12:45\"> You were the chosen one! </ChatMessage> <ChatMessage side=\"end\" color=\"primary\" metadata=\"Delivered\"> I hate you! </ChatMessage>",
    "props": [
      {
        "name": "ChatMessageProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": "`\"start\"` (incoming, avatar left, default) or `\"end\"` (outgoing, avatar right)."
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "time",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "ChatBubbleColor",
            "doc": "Bubble color; maps to `chat-bubble-<color>`."
          },
          {
            "name": "metadata",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "An extra trailing line after the name/time row, e.g. \"Delivered\"."
          },
          {
            "name": "compact",
            "optional": true,
            "type": "boolean",
            "doc": "Suppress the avatar + name/time row — for a consecutive message from the same sender, grouped right under the previous one."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatMessageMetadataProps",
        "members": []
      },
      {
        "name": "ChatTypingIndicatorProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": ""
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Announced to screen readers, e.g. `\"Silica Assistant is typing\"`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatSystemMessageProps",
        "members": []
      },
      {
        "name": "ChatToolCallsProps",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The always-visible summary, e.g. \"Called search_web(query)\"."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The detail — arguments, results, etc. Rendered in a monospace block."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ChatSystemMessage",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-message.tsx",
    "description": "A centered system notice / divider within the conversation — \"Today\", \"Ada joined the conversation\", etc. Not attributed to either side.",
    "props": [
      {
        "name": "ChatMessageProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": "`\"start\"` (incoming, avatar left, default) or `\"end\"` (outgoing, avatar right)."
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "time",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "ChatBubbleColor",
            "doc": "Bubble color; maps to `chat-bubble-<color>`."
          },
          {
            "name": "metadata",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "An extra trailing line after the name/time row, e.g. \"Delivered\"."
          },
          {
            "name": "compact",
            "optional": true,
            "type": "boolean",
            "doc": "Suppress the avatar + name/time row — for a consecutive message from the same sender, grouped right under the previous one."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatMessageMetadataProps",
        "members": []
      },
      {
        "name": "ChatTypingIndicatorProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": ""
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Announced to screen readers, e.g. `\"Silica Assistant is typing\"`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatSystemMessageProps",
        "members": []
      },
      {
        "name": "ChatToolCallsProps",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The always-visible summary, e.g. \"Called search_web(query)\"."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The detail — arguments, results, etc. Rendered in a monospace block."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ChatToolCalls",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-message.tsx",
    "description": "Silica ChatToolCalls — a collapsible detail for an assistant's tool/function call (wraps the existing `Collapsible`, not a bespoke disclosure), so a long tool-call trace doesn't dominate the conversation by default. <ChatToolCalls label=\"Called search_web(&quot;silica ui&quot;)\"> {JSON.stringify(result, null, 2)} </ChatToolCalls>",
    "props": [
      {
        "name": "ChatMessageProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": "`\"start\"` (incoming, avatar left, default) or `\"end\"` (outgoing, avatar right)."
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "time",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "ChatBubbleColor",
            "doc": "Bubble color; maps to `chat-bubble-<color>`."
          },
          {
            "name": "metadata",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "An extra trailing line after the name/time row, e.g. \"Delivered\"."
          },
          {
            "name": "compact",
            "optional": true,
            "type": "boolean",
            "doc": "Suppress the avatar + name/time row — for a consecutive message from the same sender, grouped right under the previous one."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatMessageMetadataProps",
        "members": []
      },
      {
        "name": "ChatTypingIndicatorProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": ""
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Announced to screen readers, e.g. `\"Silica Assistant is typing\"`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatSystemMessageProps",
        "members": []
      },
      {
        "name": "ChatToolCallsProps",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The always-visible summary, e.g. \"Called search_web(query)\"."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The detail — arguments, results, etc. Rendered in a monospace block."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ChatTypingIndicator",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/chat-message.tsx",
    "description": "Silica ChatTypingIndicator — three animated dots inside a real `.chat-bubble`, so it sits exactly where the next message will land instead of reading as a stray line of muted text. <ChatTypingIndicator avatar={<Avatar size=\"sm\">S</Avatar>} name=\"Silica Assistant\" />",
    "props": [
      {
        "name": "ChatMessageProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": "`\"start\"` (incoming, avatar left, default) or `\"end\"` (outgoing, avatar right)."
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "time",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "ChatBubbleColor",
            "doc": "Bubble color; maps to `chat-bubble-<color>`."
          },
          {
            "name": "metadata",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "An extra trailing line after the name/time row, e.g. \"Delivered\"."
          },
          {
            "name": "compact",
            "optional": true,
            "type": "boolean",
            "doc": "Suppress the avatar + name/time row — for a consecutive message from the same sender, grouped right under the previous one."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatMessageMetadataProps",
        "members": []
      },
      {
        "name": "ChatTypingIndicatorProps",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "ChatSide",
            "doc": ""
          },
          {
            "name": "avatar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Announced to screen readers, e.g. `\"Silica Assistant is typing\"`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "ChatSystemMessageProps",
        "members": []
      },
      {
        "name": "ChatToolCallsProps",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The always-visible summary, e.g. \"Called search_web(query)\"."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The detail — arguments, results, etc. Rendered in a monospace block."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ClickableCard",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/card.tsx",
    "description": "A `Card` that's a whole clickable surface — a `<button>` by default, or any element via `render`.",
    "props": [
      {
        "name": "CardProps",
        "members": []
      },
      {
        "name": "ClickableCardProps",
        "extends": "extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\">",
        "members": [
          {
            "name": "render",
            "optional": true,
            "type": "React.ReactElement",
            "doc": "Render as a different element (e.g. an anchor) while keeping Card's classes and interaction styles. Mirrors Base UI's `render` composition. <ClickableCard render={<a href=\"/projects/silica\" />}>…</ClickableCard> CLIENT COMPONENTS ONLY — from a React Server Component the element loses its props crossing the `\"use client\"` boundary. Style the element directly instead: `clickableCardClasses()` from `@wizeworks/silicaui-react/server`."
          }
        ]
      },
      {
        "name": "SelectableCardProps",
        "extends": "extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\">",
        "members": [
          {
            "name": "type",
            "optional": true,
            "type": "\"radio\" | \"checkbox\"",
            "doc": "`\"radio\"` for a single-select group (shared `name`), `\"checkbox\"` for multi-select. Default `\"radio\"`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Collapse",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/collapse.tsx",
    "description": "Silica Collapse — a native `<details>` disclosure. Give several the same `name` for an exclusive accordion (only one open at a time). <Collapse> <CollapseTitle>Shipping</CollapseTitle> <CollapseContent>Ships in 2–3 business days.</CollapseContent> </Collapse> <Collapse name=\"faq\" open>…</Collapse> <Collapse name=\"faq\">…</Collapse>",
    "props": [
      {
        "name": "CollapseProps",
        "extends": "extends React.DetailsHTMLAttributes<HTMLDetailsElement>",
        "members": [
          {
            "name": "ghost",
            "optional": true,
            "type": "boolean",
            "doc": "Drop the surface for a flush, borderless accordion row."
          }
        ]
      }
    ],
    "usageExample": "import { Collapse, CollapseTitle, CollapseContent } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst FAQS = [\n    { q: \"Can I change plans later?\", a: \"Yes — upgrade or downgrade anytime from Settings.\" },\n    { q: \"Do you offer refunds?\", a: \"Full refund within 14 days, no questions asked.\" },\n    { q: \"Is there a free trial?\", a: \"14 days on every paid plan, no card required.\" },\n];\n\nexport function CollapseDemo() {\n    return (\n        <>\n            <Section title=\"Real use · FAQ (exclusive — one open at a time)\">\n                <div className=\"flex max-w-md flex-col gap-2\">\n                    {FAQS.map((f, i) => (\n                        <Collapse key={f.q} name=\"faq\" open={i === 0}>\n                            <CollapseTitle>{f.q}</CollapseTitle>\n                            <CollapseContent>{f.a}</CollapseContent>\n                        </Collapse>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Ghost (borderless)\">\n                <Collapse ghost className=\"max-w-md\">\n                    <CollapseTitle>Shipping details</CollapseTitle>\n                    <CollapseContent>Ships in 2–3 business days.</CollapseContent>\n                </Collapse>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Countdown",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/countdown.tsx",
    "description": "Silica Countdown — a live days/hours/minutes/seconds display. <Countdown to={launchDate} /> <Countdown to={Date.now() + 90_000} units={[\"minutes\", \"seconds\"]} plain /> Client-only (ticks every second); render under a `\"use client\"` boundary.",
    "props": [
      {
        "name": "CountdownProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "to",
            "optional": false,
            "type": "Date | number",
            "doc": "Target time (a Date or epoch-ms timestamp)."
          },
          {
            "name": "units",
            "optional": true,
            "type": "CountdownUnit[]",
            "doc": "Which units to show. Default all four."
          },
          {
            "name": "plain",
            "optional": true,
            "type": "boolean",
            "doc": "Drop the boxes for an inline number run."
          },
          {
            "name": "onComplete",
            "optional": true,
            "type": "() => void",
            "doc": "Called once when the countdown reaches zero."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Countdown } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function CountdownDemo() {\n    const [target] = useState(() => Date.now() + 90 * 1000);\n\n    return (\n        <>\n            <Section title=\"Real use · launch countdown (90s demo)\">\n                <Countdown to={target} />\n            </Section>\n\n            <Section title=\"Selected units, plain style\">\n                <Countdown to={target} units={[\"minutes\", \"seconds\"]} plain />\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Diff",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/diff.tsx",
    "description": "Silica Diff — a draggable before/after comparison. <Diff before={<img src={before} alt=\"before\" />} after={<img src={after} alt=\"after\" />} className=\"aspect-video\" /> Drag the handle (or click anywhere) to move the split; the handle is a slider, so ←/→ nudge it (Shift for larger steps), Home/End snap to the edges.",
    "props": [
      {
        "name": "DiffProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLElement>, \"children\">",
        "members": [
          {
            "name": "before",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The \"before\" layer (clipped from the split leftward)."
          },
          {
            "name": "after",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The \"after\" layer (revealed to the right of the split)."
          },
          {
            "name": "position",
            "optional": true,
            "type": "number",
            "doc": "Controlled split position, 0–100 (percent from the left edge)."
          },
          {
            "name": "defaultPosition",
            "optional": true,
            "type": "number",
            "doc": "Uncontrolled initial split position, 0–100. Default `50`."
          },
          {
            "name": "onPositionChange",
            "optional": true,
            "type": "(position: number) => void",
            "doc": "Fires with the new split position (0–100) as it changes."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Diff } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nfunction Panel({ label, color }: { label: string; color: string }) {\n    return (\n        <div\n            className=\"flex h-full w-full items-center justify-center text-lg font-semibold text-white\"\n            style={{ backgroundColor: color }}\n        >\n            {label}\n        </div>\n    );\n}\n\nexport function DiffDemo() {\n    const [pos, setPos] = useState(50);\n\n    return (\n        <Section title=\"Real use · draggable before/after comparison\">\n            <Diff\n                className=\"max-w-lg\"\n                style={{ aspectRatio: \"16 / 9\" }}\n                position={pos}\n                onPositionChange={setPos}\n                before={<Panel label=\"Before\" color=\"#64748b\" />}\n                after={<Panel label=\"After\" color=\"#6366f1\" />}\n            />\n            <p className=\"pt-2 text-xs opacity-60\">\n                Split at {Math.round(pos)}% — drag the handle or use ←/→.\n            </p>\n        </Section>\n    );\n}"
  },
  {
    "name": "Kbd",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/kbd.tsx",
    "description": "Silica Kbd — an inline keyboard-key cap. Press <Kbd>⌘</Kbd> <Kbd>K</Kbd> to search.",
    "props": [
      {
        "name": "KbdProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "size",
            "optional": true,
            "type": "KbdSize",
            "doc": "Default `md`. Scales the (em-based) keycap with the surrounding text."
          }
        ]
      }
    ],
    "usageExample": "import { Kbd } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function KbdDemo() {\n    return (\n        <>\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <Kbd key={size} size={size}>\n                            {size}\n                        </Kbd>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · shortcuts inline\">\n                <div className=\"flex flex-col gap-2 text-sm\">\n                    <p>\n                        Press <Kbd>⌘</Kbd> <Kbd>K</Kbd> to open the command palette.\n                    </p>\n                    <p>\n                        <Kbd>Ctrl</Kbd> + <Kbd>Shift</Kbd> + <Kbd>P</Kbd> on Windows.\n                    </p>\n                    <p>\n                        <Kbd>Esc</Kbd> to close any dialog.\n                    </p>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "List",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/list.tsx",
    "description": "Silica List — a vertical list of rows. <List hover> <ListTitle>Team</ListTitle> <ListRow> <Avatar size=\"sm\">AL</Avatar> <ListColGrow> <div className=\"font-medium\">Ada Lovelace</div> <div className=\"text-sm\">Owner</div> </ListColGrow> <Button size=\"sm\" variant=\"ghost\">Manage</Button> </ListRow> </List>",
    "props": [
      {
        "name": "ListProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "hover",
            "optional": true,
            "type": "boolean",
            "doc": "Add a hover highlight to rows (for interactive lists)."
          }
        ]
      },
      {
        "name": "ListRowProps",
        "members": []
      },
      {
        "name": "ListColGrowProps",
        "members": []
      },
      {
        "name": "ListTitleProps",
        "members": []
      }
    ],
    "usageExample": "import { List, ListRow, ListColGrow, ListTitle, Avatar, Button } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst MEMBERS = [\n    { initials: \"AL\", name: \"Ada Lovelace\", role: \"Owner\" },\n    { initials: \"GH\", name: \"Grace Hopper\", role: \"Admin\" },\n    { initials: \"AT\", name: \"Alan Turing\", role: \"Member\" },\n];\n\nexport function ListDemo() {\n    return (\n        <Section title=\"Real use · team member list\">\n            <List hover className=\"max-w-md\">\n                <ListTitle>Team</ListTitle>\n                {MEMBERS.map((m) => (\n                    <ListRow key={m.initials}>\n                        <Avatar color=\"primary\" size=\"sm\" alt={m.name}>\n                            {m.initials}\n                        </Avatar>\n                        <ListColGrow>\n                            <div className=\"font-medium\">{m.name}</div>\n                            <div className=\"text-sm opacity-60\">{m.role}</div>\n                        </ListColGrow>\n                        <Button size=\"sm\" variant=\"ghost\" color=\"neutral\">\n                            Manage\n                        </Button>\n                    </ListRow>\n                ))}\n            </List>\n        </Section>\n    );\n}"
  },
  {
    "name": "Marquee",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/marquee.tsx",
    "description": "Silica Marquee — an infinitely-looping ticker. <Marquee>{logos}</Marquee> <Marquee direction=\"right\" speed=\"slow\">{quotes}</Marquee> <Marquee direction=\"up\" className=\"h-80\">{cards}</Marquee> The children are rendered `repeat` times so the loop has something to hand over to at the seam; every copy after the first is `aria-hidden`, so a screen reader hears the list once. Motion is CSS-only and collapses to a plain scroller under `prefers-reduced-motion`.",
    "props": [
      {
        "name": "MarqueeProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "direction",
            "optional": true,
            "type": "MarqueeDirection",
            "doc": "Travel direction. `left` (default) and `right` are horizontal; `up`/`down` are vertical and need a height on the marquee or its parent."
          },
          {
            "name": "speed",
            "optional": true,
            "type": "MarqueeSpeed",
            "doc": "Loop speed — `slow` 80s, `normal` (default) 40s, `fast` 20s per cycle. For anything else set `--marquee-duration` via `style`."
          },
          {
            "name": "pauseOnHover",
            "optional": true,
            "type": "boolean",
            "doc": "Freeze the strip while the pointer is over it, or while something inside it has keyboard focus. Default `true`."
          },
          {
            "name": "fade",
            "optional": true,
            "type": "boolean",
            "doc": "Soften both ends so items dissolve rather than getting guillotined at the edge. Default `true`; width is `--marquee-fade` (4rem)."
          },
          {
            "name": "repeat",
            "optional": true,
            "type": "2 | 3 | 4 | 5 | 6",
            "doc": "How many times the content is repeated to build the loop, 2–6. Two is enough whenever one pass already overflows the container; raise it when it doesn't (three short logos in a wide strip) rather than padding the list by hand. Default `2`."
          }
        ]
      }
    ],
    "usageExample": "import { Badge, Card, Marquee } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst LOGOS = [\"Northwind\", \"Acme\", \"Contoso\", \"Fabrikam\", \"Globex\", \"Initech\", \"Umbrella\"];\n\nconst QUOTES = [\n    \"Shipped in a weekend.\",\n    \"Our whole design system, one dependency.\",\n    \"The theme editor alone paid for it.\",\n    \"Finally, a marquee that doesn't hitch.\",\n];\n\nexport function MarqueeDemo() {\n    return (\n        <>\n            <Section title=\"Real use · logo wall\">\n                <Marquee className=\"py-6\">\n                    {LOGOS.map((name) => (\n                        <span key={name} className=\"text-2xl font-semibold whitespace-nowrap\">\n                            {name}\n                        </span>\n                    ))}\n                </Marquee>\n            </Section>\n\n            <Section title=\"Reverse, slow, cards\">\n                <Marquee direction=\"right\" speed=\"slow\" className=\"py-4\">\n                    {QUOTES.map((quote) => (\n                        <Card key={quote} className=\"w-72 shrink-0 p-4\">\n                            <p>{quote}</p>\n                        </Card>\n                    ))}\n                </Marquee>\n            </Section>\n\n            <Section title=\"Vertical · needs a height\">\n                <Marquee direction=\"up\" speed=\"fast\" className=\"h-64 w-56 px-2\">\n                    {LOGOS.map((name) => (\n                        <Badge key={name} color=\"primary\" className=\"whitespace-nowrap\">\n                            {name}\n                        </Badge>\n                    ))}\n                </Marquee>\n            </Section>\n\n            <Section title=\"Short content · repeat fills the strip\">\n                {/* Three items can't overflow a wide strip, so two copies would\n                    leave a visible blank. More copies, not a padded list. */}\n                <Marquee repeat={5} className=\"py-4\">\n                    {[\"Design\", \"Build\", \"Ship\"].map((word) => (\n                        <span key={word} className=\"text-xl font-medium whitespace-nowrap\">\n                            {word}\n                        </span>\n                    ))}\n                </Marquee>\n            </Section>\n\n            <Section title=\"No fade, no pause on hover\">\n                <Marquee fade={false} pauseOnHover={false} className=\"py-4\">\n                    {LOGOS.map((name) => (\n                        <span key={name} className=\"text-xl whitespace-nowrap\">\n                            {name}\n                        </span>\n                    ))}\n                </Marquee>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "MetadataList",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/metadata-list.tsx",
    "description": "Silica MetadataList — a key/value property list (a real `<dl>`). Compose it from `MetadataItem`s, which each render a `<dt>`/`<dd>` pair as direct grid children of the list. <MetadataList> <MetadataItem label=\"Created\">Jan 1, 2026</MetadataItem> <MetadataItem label=\"Owner\">Ada Lovelace</MetadataItem> <MetadataItem label=\"Status\"><Badge color=\"success\">Active</Badge></MetadataItem> </MetadataList>",
    "props": [
      {
        "name": "MetadataListProps",
        "extends": "extends React.HTMLAttributes<HTMLDListElement>",
        "members": [
          {
            "name": "layout",
            "optional": true,
            "type": "MetadataListLayout",
            "doc": "`\"row\"` (default): label left, value right. `\"stack\"`: label above value."
          }
        ]
      },
      {
        "name": "MetadataItemProps",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "labelClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the `<dt>`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Class for the `<dd>`."
          }
        ]
      }
    ],
    "usageExample": "import { MetadataList, MetadataItem, Badge, Avatar } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function MetadataListDemo() {\n    return (\n        <>\n            <Section title=\"Real use · project detail panel\">\n                <div className=\"max-w-sm rounded-box border border-base-300 p-4\">\n                    <MetadataList>\n                        <MetadataItem label=\"Status\">\n                            <Badge color=\"success\" variant=\"soft\">\n                                Active\n                            </Badge>\n                        </MetadataItem>\n                        <MetadataItem label=\"Owner\">\n                            <div className=\"flex items-center justify-end gap-2\">\n                                <Avatar size=\"xs\" alt=\"Ada Lovelace\" color=\"primary\">\n                                    AL\n                                </Avatar>\n                                Ada Lovelace\n                            </div>\n                        </MetadataItem>\n                        <MetadataItem label=\"Created\">Jan 1, 2026</MetadataItem>\n                        <MetadataItem label=\"Last updated\">2 hours ago</MetadataItem>\n                        <MetadataItem label=\"Repository\">wizeworks/silicaui</MetadataItem>\n                    </MetadataList>\n                </div>\n            </Section>\n\n            <Section title=\"layout=&quot;stack&quot; · label above value, for narrow cards\">\n                <Row>\n                    <div className=\"w-56 rounded-box border border-base-300 p-4\">\n                        <MetadataList layout=\"stack\">\n                            <MetadataItem label=\"Plan\">Pro</MetadataItem>\n                            <MetadataItem label=\"Seats\">12 / 20</MetadataItem>\n                            <MetadataItem label=\"Renews\">Aug 1, 2026</MetadataItem>\n                        </MetadataList>\n                    </div>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Meter",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/meter.tsx",
    "description": "Silica Meter — a static measurement within a known range (disk usage, score, capacity). Behavior/accessibility from Base UI's Meter; look from Silica. <Meter value={72} label=\"Storage\" showValue color=\"warning\" />",
    "props": [
      {
        "name": "MeterProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "number",
            "doc": "The current reading."
          },
          {
            "name": "min",
            "optional": true,
            "type": "number",
            "doc": "Range floor. Default `0`."
          },
          {
            "name": "max",
            "optional": true,
            "type": "number",
            "doc": "Range ceiling. Default `100`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "MeterColor",
            "doc": "Fill color; maps to `meter-<color>`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "MeterSize",
            "doc": "Track height; default `md`."
          },
          {
            "name": "label",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Optional label shown in the header row."
          },
          {
            "name": "showValue",
            "optional": true,
            "type": "boolean",
            "doc": "Show the formatted value in the header row. Default `false`."
          },
          {
            "name": "format",
            "optional": true,
            "type": "Intl.NumberFormatOptions",
            "doc": "`Intl.NumberFormat` options for the displayed value."
          }
        ]
      }
    ],
    "usageExample": "import { Meter } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS, SIZES } from \"../lib/data\";\n\nexport function MeterDemo() {\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"grid max-w-md gap-4\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Meter key={color} color={color} value={65} label={color} showValue />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex max-w-md flex-col gap-3\">\n                    {SIZES.map((size) => (\n                        <Meter key={size} color=\"primary\" size={size} value={60} />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · gauges\">\n                <div className=\"grid max-w-md gap-4\">\n                    <Meter color=\"warning\" value={92} label=\"Storage used\" showValue />\n                    <Meter color=\"success\" value={78} label=\"Battery\" showValue />\n                    <Meter color=\"error\" value={12} min={0} max={100} label=\"Credit score risk\" showValue />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "MockupBrowser",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/mockup.tsx",
    "description": "Silica MockupBrowser — a browser frame with a toolbar and faux address bar. <MockupBrowser url=\"https://silica.ui\"> <div className=\"p-8 text-center\">Your page</div> </MockupBrowser> The traffic-light dots are themed (error / warning / success), so they track whatever theme is in scope. Add `mockup-plain` for neutral, colorless dots.",
    "props": [
      {
        "name": "MockupWindowProps",
        "members": []
      },
      {
        "name": "MockupBrowserProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "url",
            "optional": true,
            "type": "string",
            "doc": "Text shown in the faux address bar."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Replace the address bar with custom toolbar content."
          }
        ]
      },
      {
        "name": "MockupCodeProps",
        "members": []
      },
      {
        "name": "MockupCodeLineProps",
        "extends": "extends React.HTMLAttributes<HTMLPreElement>",
        "members": [
          {
            "name": "prefix",
            "optional": true,
            "type": "string",
            "doc": "Gutter prefix rendered before the line (e.g. `$`, `>`, a line number)."
          }
        ]
      },
      {
        "name": "MockupPhoneProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "MockupCode",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/mockup.tsx",
    "description": "Silica MockupCode — a dark terminal / code block. Compose it from `<MockupCodeLine>` rows (each renders a `<pre data-prefix>`). <MockupCode> <MockupCodeLine prefix=\"$\">npm i @wizeworks/silicaui</MockupCodeLine> <MockupCodeLine prefix=\">\" className=\"text-success\">done</MockupCodeLine> </MockupCode>",
    "props": [
      {
        "name": "MockupWindowProps",
        "members": []
      },
      {
        "name": "MockupBrowserProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "url",
            "optional": true,
            "type": "string",
            "doc": "Text shown in the faux address bar."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Replace the address bar with custom toolbar content."
          }
        ]
      },
      {
        "name": "MockupCodeProps",
        "members": []
      },
      {
        "name": "MockupCodeLineProps",
        "extends": "extends React.HTMLAttributes<HTMLPreElement>",
        "members": [
          {
            "name": "prefix",
            "optional": true,
            "type": "string",
            "doc": "Gutter prefix rendered before the line (e.g. `$`, `>`, a line number)."
          }
        ]
      },
      {
        "name": "MockupPhoneProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "MockupCodeLine",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/mockup.tsx",
    "description": "A single line inside `<MockupCode>`. Renders `<pre data-prefix>`.",
    "props": [
      {
        "name": "MockupWindowProps",
        "members": []
      },
      {
        "name": "MockupBrowserProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "url",
            "optional": true,
            "type": "string",
            "doc": "Text shown in the faux address bar."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Replace the address bar with custom toolbar content."
          }
        ]
      },
      {
        "name": "MockupCodeProps",
        "members": []
      },
      {
        "name": "MockupCodeLineProps",
        "extends": "extends React.HTMLAttributes<HTMLPreElement>",
        "members": [
          {
            "name": "prefix",
            "optional": true,
            "type": "string",
            "doc": "Gutter prefix rendered before the line (e.g. `$`, `>`, a line number)."
          }
        ]
      },
      {
        "name": "MockupPhoneProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "MockupPhone",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/mockup.tsx",
    "description": "Silica MockupPhone — a phone frame with a camera notch. <MockupPhone> <div className=\"p-6 pt-10\">Your app screen</div> </MockupPhone> Children render inside the display; the bezel and notch are supplied by the frame. Give top content some `pt` so it clears the notch.",
    "props": [
      {
        "name": "MockupWindowProps",
        "members": []
      },
      {
        "name": "MockupBrowserProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "url",
            "optional": true,
            "type": "string",
            "doc": "Text shown in the faux address bar."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Replace the address bar with custom toolbar content."
          }
        ]
      },
      {
        "name": "MockupCodeProps",
        "members": []
      },
      {
        "name": "MockupCodeLineProps",
        "extends": "extends React.HTMLAttributes<HTMLPreElement>",
        "members": [
          {
            "name": "prefix",
            "optional": true,
            "type": "string",
            "doc": "Gutter prefix rendered before the line (e.g. `$`, `>`, a line number)."
          }
        ]
      },
      {
        "name": "MockupPhoneProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "MockupWindow",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/mockup.tsx",
    "description": "Silica MockupWindow — an app window frame with faux traffic-light dots. <MockupWindow> <div className=\"p-8 text-center\">Hello!</div> </MockupWindow> The dots are themed (error / warning / success). Add `mockup-plain` for neutral, colorless dots.",
    "props": [
      {
        "name": "MockupWindowProps",
        "members": []
      },
      {
        "name": "MockupBrowserProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "url",
            "optional": true,
            "type": "string",
            "doc": "Text shown in the faux address bar."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Replace the address bar with custom toolbar content."
          }
        ]
      },
      {
        "name": "MockupCodeProps",
        "members": []
      },
      {
        "name": "MockupCodeLineProps",
        "extends": "extends React.HTMLAttributes<HTMLPreElement>",
        "members": [
          {
            "name": "prefix",
            "optional": true,
            "type": "string",
            "doc": "Gutter prefix rendered before the line (e.g. `$`, `>`, a line number)."
          }
        ]
      },
      {
        "name": "MockupPhoneProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "PreviewCard",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/preview-card.tsx",
    "description": "Silica PreviewCard — a hover/focus link preview (hovercard). Behavior from Base UI, look from Silica's `.preview-card` CSS. <PreviewCard content={<UserPreview user={u} />}> <Link href={u.url}>@{u.handle}</Link> </PreviewCard>",
    "props": [
      {
        "name": "PreviewCardProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement",
            "doc": "The trigger (usually a link). Base UI merges hover/focus behavior onto it."
          },
          {
            "name": "content",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The card body shown on hover/focus."
          },
          {
            "name": "side",
            "optional": true,
            "type": "PreviewCardSide",
            "doc": "Preferred side. Default `bottom` (flips to avoid collisions)."
          },
          {
            "name": "align",
            "optional": true,
            "type": "PreviewCardAlign",
            "doc": "Alignment along that side. Default `center`."
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": "Gap between trigger and card, in px. Default `8`."
          },
          {
            "name": "delay",
            "optional": true,
            "type": "number",
            "doc": "Hover-open delay in ms."
          },
          {
            "name": "closeDelay",
            "optional": true,
            "type": "number",
            "doc": "Close delay in ms."
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled open state."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": "Uncontrolled initial open state."
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "arrow",
            "optional": true,
            "type": "boolean",
            "doc": "Show the little arrow. Default `false`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Extra class on the card surface."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import { PreviewCard, Link, Avatar } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function PreviewCardDemo() {\n    return (\n        <Section title=\"Real use · hover a link to preview the profile\">\n            <p className=\"max-w-md text-sm\">\n                Reviewed by{\" \"}\n                <PreviewCard\n                    content={\n                        <div className=\"flex items-center gap-3\">\n                            <Avatar color=\"primary\" alt=\"Ada Lovelace\">\n                                AL\n                            </Avatar>\n                            <div>\n                                <div className=\"font-medium\">Ada Lovelace</div>\n                                <div className=\"text-xs opacity-60\">\n                                    Founding engineer · @ada\n                                </div>\n                            </div>\n                        </div>\n                    }\n                    arrow\n                >\n                    <Link href=\"#\" color=\"primary\">\n                        @ada\n                    </Link>\n                </PreviewCard>{\" \"}\n                on the pull request.\n            </p>\n        </Section>\n    );\n}"
  },
  {
    "name": "SelectableCard",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/card.tsx",
    "description": "A `Card` that's a selectable option tile — a real `<input type=\"radio\">` / `<input type=\"checkbox\">`, visually hidden, wrapped in a `<label>` so the whole card is the click target. Selection reads as a border + ring in the theme's primary color — no checkbox/radio glyph. Group several with the same `name` for single-select; use `type=\"checkbox\"` for multi-select. <SelectableCard name=\"plan\" value=\"pro\" defaultChecked> <CardTitle>Pro</CardTitle> <p>For growing teams.</p> </SelectableCard>",
    "props": [
      {
        "name": "CardProps",
        "members": []
      },
      {
        "name": "ClickableCardProps",
        "extends": "extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\">",
        "members": [
          {
            "name": "render",
            "optional": true,
            "type": "React.ReactElement",
            "doc": "Render as a different element (e.g. an anchor) while keeping Card's classes and interaction styles. Mirrors Base UI's `render` composition. <ClickableCard render={<a href=\"/projects/silica\" />}>…</ClickableCard> CLIENT COMPONENTS ONLY — from a React Server Component the element loses its props crossing the `\"use client\"` boundary. Style the element directly instead: `clickableCardClasses()` from `@wizeworks/silicaui-react/server`."
          }
        ]
      },
      {
        "name": "SelectableCardProps",
        "extends": "extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\">",
        "members": [
          {
            "name": "type",
            "optional": true,
            "type": "\"radio\" | \"checkbox\"",
            "doc": "`\"radio\"` for a single-select group (shared `name`), `\"checkbox\"` for multi-select. Default `\"radio\"`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Stat",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/stat.tsx",
    "description": "Silica Stat — a single metric block. Compose from parts: <Stats> <Stat> <StatFigure><ChartIcon /></StatFigure> <StatTitle>Revenue</StatTitle> <StatValue>$42.8k</StatValue> <StatDesc>↗︎ 12% this month</StatDesc> </Stat> </Stats>",
    "props": [
      {
        "name": "StatsProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "vertical",
            "optional": true,
            "type": "boolean",
            "doc": "Stack the blocks vertically instead of inline."
          }
        ]
      },
      {
        "name": "StatProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": []
      }
    ],
    "usageExample": "import {\n    Stats,\n    Stat,\n    StatTitle,\n    StatValue,\n    StatDesc,\n    StatFigure,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { UserIcon } from \"../lib/icons\";\n\nexport function StatDemo() {\n    return (\n        <>\n            <Section title=\"Real use · dashboard KPIs\">\n                <Stats>\n                    <Stat>\n                        <StatFigure>\n                            <UserIcon />\n                        </StatFigure>\n                        <StatTitle>New users</StatTitle>\n                        <StatValue>1,204</StatValue>\n                        <StatDesc>↗︎ 3.2% this month</StatDesc>\n                    </Stat>\n                    <Stat>\n                        <StatTitle>Revenue</StatTitle>\n                        <StatValue>$14,300</StatValue>\n                        <StatDesc>↗︎ 12.4% this month</StatDesc>\n                    </Stat>\n                    <Stat>\n                        <StatTitle>Churn</StatTitle>\n                        <StatValue>1.8%</StatValue>\n                        <StatDesc>↘︎ 0.6% this month</StatDesc>\n                    </Stat>\n                </Stats>\n            </Section>\n\n            <Section title=\"Vertical layout\">\n                <Stats vertical className=\"max-w-xs\">\n                    <Stat>\n                        <StatTitle>Storage used</StatTitle>\n                        <StatValue>72 GB</StatValue>\n                        <StatDesc>of 100 GB</StatDesc>\n                    </Stat>\n                    <Stat>\n                        <StatTitle>Bandwidth</StatTitle>\n                        <StatValue>1.2 TB</StatValue>\n                        <StatDesc>this billing cycle</StatDesc>\n                    </Stat>\n                </Stats>\n            </Section>\n\n            <Section title=\"Glass · KPI band over a colored hero\">\n                <div\n                    className=\"rounded-box p-8\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Stats className=\"glass\">\n                        <Stat>\n                            <StatFigure>\n                                <UserIcon />\n                            </StatFigure>\n                            <StatTitle>New users</StatTitle>\n                            <StatValue>1,204</StatValue>\n                            <StatDesc>↗︎ 3.2% this month</StatDesc>\n                        </Stat>\n                        <Stat>\n                            <StatTitle>Revenue</StatTitle>\n                            <StatValue>$14,300</StatValue>\n                            <StatDesc>↗︎ 12.4% this month</StatDesc>\n                        </Stat>\n                        <Stat>\n                            <StatTitle>Churn</StatTitle>\n                            <StatValue>1.8%</StatValue>\n                            <StatDesc>↘︎ 0.6% this month</StatDesc>\n                        </Stat>\n                    </Stats>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Table",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/table.tsx",
    "description": "Silica Table — a styled `<table>`. Compose it from plain semantic rows; the CSS styles the native elements, so no per-cell classes are needed: <Table zebra hover> <thead> <tr><th>Name</th><th>Role</th></tr> </thead> <tbody> <tr><td>Ada</td><td>Engineer</td></tr> </tbody> </Table> Auto-wrapped in an `overflow-x: auto` container so a wide table scrolls instead of blowing out the page; `ref`/`className` land on the `<table>`.",
    "props": [
      {
        "name": "TableProps",
        "extends": "extends React.TableHTMLAttributes<HTMLTableElement>",
        "members": [
          {
            "name": "zebra",
            "optional": true,
            "type": "boolean",
            "doc": "Striped rows."
          },
          {
            "name": "hover",
            "optional": true,
            "type": "boolean",
            "doc": "Highlight the row under the cursor."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TableSize",
            "doc": "Default `md`. Scales cell padding + type."
          },
          {
            "name": "wrapperClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the horizontal-scroll wrapper (the outer `<div>`)."
          }
        ]
      }
    ],
    "usageExample": "import { Table, Badge } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst ROWS = [\n    { name: \"Ada Lovelace\", role: \"Engineer\", status: \"Active\" as const },\n    { name: \"Grace Hopper\", role: \"Admin\", status: \"Active\" as const },\n    { name: \"Alan Turing\", role: \"Engineer\", status: \"Away\" as const },\n];\n\nexport function TableDemo() {\n    return (\n        <>\n            <Section title=\"Real use · team table\">\n                <Table zebra hover className=\"max-w-xl\">\n                    <thead>\n                        <tr>\n                            <th>Name</th>\n                            <th>Role</th>\n                            <th>Status</th>\n                        </tr>\n                    </thead>\n                    <tbody>\n                        {ROWS.map((r) => (\n                            <tr key={r.name}>\n                                <td>{r.name}</td>\n                                <td>{r.role}</td>\n                                <td>\n                                    <Badge\n                                        color={r.status === \"Active\" ? \"success\" : \"warning\"}\n                                        variant=\"soft\"\n                                    >\n                                        {r.status}\n                                    </Badge>\n                                </td>\n                            </tr>\n                        ))}\n                    </tbody>\n                </Table>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex max-w-xl flex-col gap-4\">\n                    {([\"xs\", \"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <Table key={size} size={size} zebra>\n                            <thead>\n                                <tr>\n                                    <th>Size</th>\n                                    <th>Value</th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <tr>\n                                    <td>{size}</td>\n                                    <td>Row height scales with density</td>\n                                </tr>\n                            </tbody>\n                        </Table>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Timeline",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/timeline.tsx",
    "description": "Silica Timeline — a sequence of dated events with a connecting rail. <Timeline> <TimelineItem> <TimelineStart>2021</TimelineStart> <TimelineMiddle /> <TimelineEnd box>Founded</TimelineEnd> </TimelineItem> <TimelineItem> <TimelineStart>2024</TimelineStart> <TimelineMiddle /> <TimelineEnd box>Shipped 1.0</TimelineEnd> </TimelineItem> </Timeline> Renders `<ul>` / `<li>`. Any slot is optional — omit `<TimelineStart>` for a one-sided timeline. `<TimelineMiddle>` renders a default dot when empty.",
    "props": [
      {
        "name": "TimelineProps",
        "extends": "extends React.HTMLAttributes<HTMLUListElement>",
        "members": [
          {
            "name": "orientation",
            "optional": true,
            "type": "TimelineOrientation",
            "doc": "`vertical` (default) or `horizontal`."
          }
        ]
      },
      {
        "name": "TimelineItemProps",
        "members": []
      },
      {
        "name": "TimelineStartProps",
        "members": []
      },
      {
        "name": "TimelineMiddleProps",
        "members": []
      },
      {
        "name": "TimelineEndProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "box",
            "optional": true,
            "type": "boolean",
            "doc": "Wrap the content in a bordered card."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Timeline,\n    TimelineItem,\n    TimelineStart,\n    TimelineMiddle,\n    TimelineEnd,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function TimelineDemo() {\n    return (\n        <>\n            <Section title=\"Real use · company milestones\">\n                <Timeline className=\"max-w-md\">\n                    <TimelineItem>\n                        <TimelineStart>2021</TimelineStart>\n                        <TimelineMiddle />\n                        <TimelineEnd box>Founded</TimelineEnd>\n                    </TimelineItem>\n                    <TimelineItem>\n                        <TimelineStart>2023</TimelineStart>\n                        <TimelineMiddle />\n                        <TimelineEnd box>Seed round closed</TimelineEnd>\n                    </TimelineItem>\n                    <TimelineItem>\n                        <TimelineStart>2026</TimelineStart>\n                        <TimelineMiddle />\n                        <TimelineEnd box>Shipped 1.0</TimelineEnd>\n                    </TimelineItem>\n                </Timeline>\n            </Section>\n\n            <Section title=\"Horizontal\">\n                <Timeline orientation=\"horizontal\" className=\"max-w-lg\">\n                    <TimelineItem>\n                        <TimelineStart>Cart</TimelineStart>\n                        <TimelineMiddle />\n                    </TimelineItem>\n                    <TimelineItem>\n                        <TimelineStart>Shipping</TimelineStart>\n                        <TimelineMiddle />\n                    </TimelineItem>\n                    <TimelineItem>\n                        <TimelineStart>Payment</TimelineStart>\n                        <TimelineMiddle />\n                    </TimelineItem>\n                </Timeline>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Timestamp",
    "package": "@wizeworks/silicaui-react",
    "category": "Data display",
    "sourceFile": "silicaui-react/src/timestamp.tsx",
    "description": "Silica Timestamp — dependency-free relative/absolute time formatting (`Intl.RelativeTimeFormat` / `Intl.DateTimeFormat`, no date library), so every callsite renders \"2 minutes ago\" / \"2:30 PM\" the same way instead of each hand-rolling slightly different math. <Timestamp value={message.sentAt} /> // auto <Timestamp value={message.sentAt} format=\"relative\" />",
    "props": [
      {
        "name": "TimestampProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLTimeElement>, \"children\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "Date | string | number",
            "doc": "The moment to display."
          },
          {
            "name": "format",
            "optional": true,
            "type": "TimestampFormat",
            "doc": "`\"relative\"` (\"2 minutes ago\"), `\"absolute\"` (\"2:30 PM\" / \"Jul 8\"), or `\"auto\"` (default) — relative within `relativeThreshold`, absolute beyond it."
          },
          {
            "name": "relativeThreshold",
            "optional": true,
            "type": "number",
            "doc": "`\"auto\"`'s relative/absolute cutoff, in ms. Default 24 hours."
          },
          {
            "name": "refreshInterval",
            "optional": true,
            "type": "number",
            "doc": "Refresh interval for a relative label, in ms. Default 60s; `0` disables."
          }
        ]
      }
    ],
    "usageExample": "import { Timestamp } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nconst now = Date.now();\nconst MIN = 60_000;\nconst HOUR = 60 * MIN;\nconst DAY = 24 * HOUR;\n\nexport function TimestampDemo() {\n    return (\n        <>\n            <Section title=\"Auto (relative within 24h, absolute beyond)\">\n                <Stack>\n                    <p>\n                        Just now — <Timestamp value={now - 30_000} />\n                    </p>\n                    <p>\n                        5 minutes ago — <Timestamp value={now - 5 * MIN} />\n                    </p>\n                    <p>\n                        3 hours ago — <Timestamp value={now - 3 * HOUR} />\n                    </p>\n                    <p>\n                        2 days ago — <Timestamp value={now - 2 * DAY} />\n                    </p>\n                    <p>\n                        2 months ago — <Timestamp value={now - 60 * DAY} />\n                    </p>\n                </Stack>\n            </Section>\n\n            <Section title=\"Forced format\">\n                <Stack>\n                    <p>\n                        Relative — <Timestamp value={now - 3 * DAY} format=\"relative\" />\n                    </p>\n                    <p>\n                        Absolute — <Timestamp value={now - 3 * DAY} format=\"absolute\" />\n                    </p>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Autocomplete",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/autocomplete.tsx",
    "description": "Silica Autocomplete — a free-text input with a filtered suggestion list (Base UI). Unlike `Combobox` (which selects a value from a fixed set), the value here IS the typed string; suggestions just help complete it. <Autocomplete items={[\"React\", \"React Native\", \"Redux\", \"Remix\"]} value={q} onValueChange={setQ} placeholder=\"Search the docs…\" />",
    "props": [
      {
        "name": "AutocompleteItemProps",
        "extends": "extends Omit<Styled<typeof BaseAutocomplete.Item>, \"children\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "unknown",
            "doc": ""
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          }
        ]
      },
      {
        "name": "AutocompleteProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "readonly string[]",
            "doc": "Suggestion set; filtered by the input value (in `list`/`both` modes)."
          },
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled input value."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial input value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string, eventDetails?: unknown) => void",
            "doc": "Fires with the new input string."
          },
          {
            "name": "mode",
            "optional": true,
            "type": "AutocompleteMode",
            "doc": "Suggestion behavior; `list` (default) filters the list as you type."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "emptyMessage",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown in the popup when nothing matches the query."
          },
          {
            "name": "color",
            "optional": true,
            "type": "AutocompleteColor",
            "doc": "Accent for the input border + focus ring (shares Input colors)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "AutocompleteSize",
            "doc": "Input height; matches same-size Inputs."
          },
          {
            "name": "clearable",
            "optional": true,
            "type": "boolean",
            "doc": "Show the clear (×) button (default true)."
          },
          {
            "name": "side",
            "optional": true,
            "type": "AutocompleteSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "AutocompleteAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Class for the text input."
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the popup surface."
          },
          {
            "name": "renderItem",
            "optional": true,
            "type": "(item: string, index: number) => React.ReactNode",
            "doc": "Override how each filtered suggestion renders."
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-labelledby\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Calendar",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/calendar.tsx",
    "description": "Silica Calendar — a from-scratch month-grid date picker (single date or a range), with full keyboard navigation (arrows, PageUp/Down, Home/End, Enter/Space). The primitive behind `DatePicker` / `DateRangePicker`; render it inline when you want an always-visible calendar. <Calendar value={date} onValueChange={setDate} /> <Calendar mode=\"range\" numberOfMonths={2} value={range} onValueChange={setRange} />",
    "props": [
      {
        "name": "CalendarProps",
        "members": [
          {
            "name": "mode",
            "optional": true,
            "type": "CalendarMode",
            "doc": "`single` (default) selects one date; `range` selects a start/end pair."
          },
          {
            "name": "value",
            "optional": true,
            "type": "CalendarValue",
            "doc": "Controlled selection — a `Date` in single mode, a `DateRange` in range mode."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "CalendarValue",
            "doc": "Uncontrolled initial selection."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: CalendarValue) => void",
            "doc": "Fires with the new selection."
          },
          {
            "name": "month",
            "optional": true,
            "type": "Date",
            "doc": "Controlled visible (left-most) month."
          },
          {
            "name": "defaultMonth",
            "optional": true,
            "type": "Date",
            "doc": "Uncontrolled initial visible month."
          },
          {
            "name": "onMonthChange",
            "optional": true,
            "type": "(month: Date) => void",
            "doc": ""
          },
          {
            "name": "numberOfMonths",
            "optional": true,
            "type": "number",
            "doc": "How many month grids to show side by side (default 1; 2 for range)."
          },
          {
            "name": "weekStartsOn",
            "optional": true,
            "type": "Weekday",
            "doc": "0 = Sunday (default) … 6 = Saturday."
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": "Selectable bounds (inclusive)."
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "isDateDisabled",
            "optional": true,
            "type": "(date: Date) => boolean",
            "doc": "Per-date disable predicate."
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": "BCP-47 locale for month/weekday names (default: runtime locale)."
          },
          {
            "name": "color",
            "optional": true,
            "type": "CalendarColor",
            "doc": "Accent for the selection."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Calendar,\n    DatePicker,\n    DateRangePicker,\n} from \"@wizeworks/silicaui-react\";\nimport type { DateRange } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function CalendarDemo() {\n    const [date, setDate] = useState<Date | null>(new Date(2026, 6, 14));\n    const [pickedDate, setPickedDate] = useState<Date | null>(null);\n    const [range, setRange] = useState<DateRange>({ start: null, end: null });\n\n    return (\n        <>\n            <Section title=\"Colors (inline)\">\n                <Row>\n                    {COLORS.slice(0, 3).map((color) => (\n                        <Calendar\n                            key={color}\n                            color={color}\n                            value={date}\n                            onValueChange={(v) => setDate(v as Date)}\n                        />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · date + range pickers\">\n                <Row>\n                    <DatePicker\n                        color=\"primary\"\n                        value={pickedDate}\n                        onValueChange={setPickedDate}\n                        placeholder=\"Pick a date\"\n                    />\n                    <DateRangePicker\n                        color=\"primary\"\n                        value={range}\n                        onValueChange={setRange}\n                        placeholder=\"Pick a range\"\n                    />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Checkbox",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/checkbox.tsx",
    "description": "Silica Checkbox — a restyled native `<input type=\"checkbox\">`. All native attributes (`checked`, `defaultChecked`, `onChange`, `disabled`, …) pass through. <Checkbox /> // bare; pair with your own <label htmlFor> <Checkbox>Run tests</Checkbox> // captioned; the whole row is clickable",
    "props": [
      {
        "name": "CheckboxProps",
        "extends": "extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    \"size\" | \"color\" | \"type\"\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color; maps to `checkbox-<color>` (checked fill + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default `md`."
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Caption. Wraps the control in a `<label>` so the text is a click target."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Checkbox } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { ColorVariantSizeGrid } from \"../lib/ColorGrid\";\n\nconst TASKS = [\"Write the announcement\", \"Add screenshots\", \"Ping the design team\"];\n\nexport function CheckboxDemo() {\n    const [done, setDone] = useState<Record<string, boolean>>({\n        \"Write the announcement\": true,\n    });\n\n    return (\n        <>\n            <ColorVariantSizeGrid\n                Component={Checkbox}\n                render={({ color, size }) => (\n                    <label className=\"flex items-center gap-2 text-sm\">\n                        <Checkbox color={color} size={size} defaultChecked />\n                        {color ?? size}\n                    </label>\n                )}\n            />\n\n            <Section title=\"Real use · launch checklist\">\n                <div className=\"flex flex-col gap-2\">\n                    {TASKS.map((task) => (\n                        <label key={task} className=\"flex items-center gap-2 text-sm\">\n                            <Checkbox\n                                color=\"primary\"\n                                checked={!!done[task]}\n                                onChange={(e) =>\n                                    setDone((p) => ({ ...p, [task]: e.target.checked }))\n                                }\n                            />\n                            <span className={done[task] ? \"line-through opacity-50\" : \"\"}>\n                                {task}\n                            </span>\n                        </label>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "CheckboxGroup",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/checkbox-group.tsx",
    "description": "Silica CheckboxGroup — a managed set of checkboxes whose value is the array of checked items. Pair with `CheckboxOption`s. <CheckboxGroup defaultValue={[\"email\"]}> <CheckboxOption value=\"email\">Email</CheckboxOption> <CheckboxOption value=\"sms\">SMS</CheckboxOption> </CheckboxGroup>",
    "props": [
      {
        "name": "CheckboxGroupProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string[]",
            "doc": "Controlled array of checked values."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string[]",
            "doc": "Uncontrolled initial checked values."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string[]) => void",
            "doc": "Fires with the new array of checked values."
          },
          {
            "name": "orientation",
            "optional": true,
            "type": "CheckboxGroupOrientation",
            "doc": "Stack (`vertical`, default) or row (`horizontal`)."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable every option."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Default accent color for the options."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default size for the options."
          }
        ]
      },
      {
        "name": "CheckboxOptionProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"onChange\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": "This option's value."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { CheckboxGroup, CheckboxOption } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function CheckboxGroupDemo() {\n    const [channels, setChannels] = useState<string[]>([\"email\", \"push\"]);\n\n    return (\n        <>\n            <Section title=\"Real use · notification channels\">\n                <CheckboxGroup value={channels} onValueChange={setChannels} color=\"primary\">\n                    <CheckboxOption value=\"email\">Email</CheckboxOption>\n                    <CheckboxOption value=\"push\">Push</CheckboxOption>\n                    <CheckboxOption value=\"sms\">SMS</CheckboxOption>\n                </CheckboxGroup>\n                <p className=\"pt-2 text-xs opacity-60\">\n                    Selected: {channels.join(\", \") || \"none\"}\n                </p>\n            </Section>\n\n            <Section title=\"Horizontal\">\n                <CheckboxGroup defaultValue={[\"mon\", \"wed\", \"fri\"]} orientation=\"horizontal\" color=\"primary\">\n                    <CheckboxOption value=\"mon\">Mon</CheckboxOption>\n                    <CheckboxOption value=\"wed\">Wed</CheckboxOption>\n                    <CheckboxOption value=\"fri\">Fri</CheckboxOption>\n                </CheckboxGroup>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "CheckboxOption",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/checkbox-group.tsx",
    "description": "One labeled checkbox within a CheckboxGroup.",
    "props": [
      {
        "name": "CheckboxGroupProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string[]",
            "doc": "Controlled array of checked values."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string[]",
            "doc": "Uncontrolled initial checked values."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string[]) => void",
            "doc": "Fires with the new array of checked values."
          },
          {
            "name": "orientation",
            "optional": true,
            "type": "CheckboxGroupOrientation",
            "doc": "Stack (`vertical`, default) or row (`horizontal`)."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable every option."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Default accent color for the options."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default size for the options."
          }
        ]
      },
      {
        "name": "CheckboxOptionProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"onChange\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": "This option's value."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "ColorPicker",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/color-picker.tsx",
    "description": "ColorPicker — an OKLCH-native color editor. SilicaUI's tokens are OKLCH, so the picker edits Lightness / Chroma / Hue directly (each slider's track shows the live ramp), previews the result, and reads/writes hex. Controlled via `value`/`onValueChange` or uncontrolled via `defaultValue`.",
    "props": [
      {
        "name": "ColorPickerProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"color\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled color (an `oklch(…)` or `#hex` string)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial color. Default `oklch(0.7 0.15 250)`."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string, oklch: Oklch) => void",
            "doc": "Fires with the formatted string AND the raw OKLCH on every change."
          },
          {
            "name": "format",
            "optional": true,
            "type": "ColorPickerFormat",
            "doc": "Output format handed to `onValueChange`. Default `\"oklch\"`."
          },
          {
            "name": "showHex",
            "optional": true,
            "type": "boolean",
            "doc": "Show the hex read/write field. Default `true`."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "ColorPickerVariant",
            "doc": "Default `\"panel\"`."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { ColorPicker, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function ColorPickerDemo() {\n    const [brand, setBrand] = useState(\"oklch(0.62 0.19 29)\");\n    const [accent, setAccent] = useState(\"#22c55e\");\n\n    return (\n        <>\n            <Section title=\"Real use · brand color picker\">\n                <div className=\"flex flex-col items-start gap-3\">\n                    <ColorPicker value={brand} onValueChange={(v) => setBrand(v)} />\n                    <Button style={{ backgroundColor: brand, borderColor: brand, color: \"#fff\" }}>\n                        Preview button\n                    </Button>\n                </div>\n            </Section>\n\n            <Section title=\"variant=&quot;swatch&quot; · compact chip, opens the same panel in a popover\">\n                <Row>\n                    <ColorPicker\n                        variant=\"swatch\"\n                        value={accent}\n                        format=\"hex\"\n                        onValueChange={(v) => setAccent(v)}\n                    />\n                    <span\n                        className=\"text-sm\"\n                        style={{ color: \"var(--color-base-content)\" }}\n                    >\n                        {accent}\n                    </span>\n                    <ColorPicker variant=\"swatch\" disabled defaultValue=\"oklch(0.55 0.2 280)\" />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Combobox",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/combobox.tsx",
    "description": "Silica Combobox — a searchable, filtered listbox (Base UI: typeahead filtering, roving focus, portalled popup). Type to narrow `items`; pick to select. The input matches the field tier like `Input`. <Combobox items={[\"Alabama\", \"Alaska\", \"Arizona\", \"Arkansas\"]} value={state} onValueChange={setState} placeholder=\"Search states…\" /> // object items: <Combobox items={[{ value: \"us\", label: \"United States\" }, { value: \"ca\", label: \"Canada\" }]} placeholder=\"Country\" color=\"primary\" />",
    "props": [
      {
        "name": "ComboboxItemProps",
        "extends": "extends Omit<Styled<typeof BaseCombobox.Item>, \"children\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "unknown",
            "doc": ""
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "indicator",
            "optional": true,
            "type": "boolean",
            "doc": "Show the leading selected-check (default true)."
          }
        ]
      },
      {
        "name": "ComboboxProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "readonly unknown[]",
            "doc": "The full option set (strings or `{ value, label }`); Base UI filters it."
          },
          {
            "name": "value",
            "optional": true,
            "type": "unknown",
            "doc": "Controlled selected value."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "unknown",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: unknown, eventDetails?: unknown) => void",
            "doc": "Fires with the newly-selected value."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "emptyMessage",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown in the popup when nothing matches the query."
          },
          {
            "name": "color",
            "optional": true,
            "type": "ComboboxColor",
            "doc": "Accent for the input border + focus ring (shares Input colors)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "ComboboxSize",
            "doc": "Input height; matches same-size Inputs."
          },
          {
            "name": "clearable",
            "optional": true,
            "type": "boolean",
            "doc": "Show the clear (×) button (default true)."
          },
          {
            "name": "side",
            "optional": true,
            "type": "ComboboxSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "ComboboxAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Class for the text input."
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the popup surface."
          },
          {
            "name": "popupProps",
            "optional": true,
            "type": "React.ComponentProps<typeof BaseCombobox.Popup> & {\n    \"data-theme\"?: string;\n  }",
            "doc": "Extra props spread onto the popup surface — a portaled popup renders at document.body, OUTSIDE any `[data-theme]` island it was opened from, so a host with a scoped theme (e.g. a builder chrome) should pass `popupProps={{ \"data-theme\": \"…\" }}` to re-establish the theme tokens on the popup's own root (mirrors `Select`'s `popupProps`)."
          },
          {
            "name": "itemToStringLabel",
            "optional": true,
            "type": "(item: unknown) => string",
            "doc": "For object items, map an item to its display string (default: `.label`)."
          },
          {
            "name": "renderItem",
            "optional": true,
            "type": "(item: unknown, index: number) => React.ReactNode",
            "doc": "Override how each filtered item renders."
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-labelledby\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Combobox } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst US_STATES = [\n    \"Alabama\", \"Alaska\", \"Arizona\", \"Arkansas\", \"California\", \"Colorado\",\n    \"Connecticut\", \"Delaware\", \"Florida\", \"Georgia\", \"Hawaii\", \"Idaho\",\n    \"Illinois\", \"Indiana\", \"Iowa\", \"Kansas\", \"Kentucky\", \"Louisiana\",\n];\n\nconst DOC_SUGGESTIONS = [\n    \"Getting started\", \"Installation\", \"Theming\", \"Color tokens\",\n    \"Dark mode\", \"Components\", \"Button\", \"Select\", \"Combobox\",\n    \"Form validation\", \"Accessibility\", \"Migration guide\",\n];\n\nexport function ComboboxDemo() {\n    const [usState, setUsState] = useState<string | null>(null);\n    const [docQuery, setDocQuery] = useState(\"\");\n\n    return (\n        <>\n            <Section title=\"Real use · searchable state picker\">\n                <Combobox\n                    items={US_STATES}\n                    value={usState}\n                    onValueChange={(v) => setUsState(v as string | null)}\n                    placeholder=\"Search states…\"\n                    color=\"primary\"\n                />\n            </Section>\n\n            <Section title=\"Docs search (no clear button)\">\n                <Combobox\n                    items={DOC_SUGGESTIONS}\n                    value={docQuery || null}\n                    onValueChange={(v) => setDocQuery((v as string) ?? \"\")}\n                    placeholder=\"Search docs…\"\n                    clearable={false}\n                />\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {([\"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <Combobox key={size} items={[\"A\", \"B\", \"C\"]} size={size} placeholder={size} />\n                    ))}\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "DateInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/date-input.tsx",
    "description": "Silica DateInput — a typeable, segmented date field (month/day/year cells you type digits into directly, à la native `<input type=\"date\">`), not a calendar-only picker. Digits auto-advance to the next segment; Up/Down steps the focused segment; arrow keys move between segments; pasting a full date (any common format) autofills every segment at once. Segment order and separators come from `Intl` for the given `locale` — never hardcoded to MM/DD/YYYY. <DateInput value={date} onValueChange={setDate} /> <DateInput locale=\"en-GB\" min={today} />",
    "props": [
      {
        "name": "DateInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "Date | null",
            "doc": "Controlled value. `null` clears the field."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: Date | null) => void",
            "doc": "Fires once every segment is filled with a valid date; `null` while incomplete/cleared."
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": "Selectable bounds (inclusive); an out-of-range completed date is clamped."
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": "BCP-47 locale — drives segment order (MM/DD/YYYY vs DD/MM/YYYY, …) and separators."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DateInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DateInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "DateRangeInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: DateRange) => void",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DateInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DateInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { DateInput, DateRangeInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function DateInputDemo() {\n    const [date, setDate] = useState<Date | null>(new Date(2026, 6, 8));\n    const [range, setRange] = useState<{ start: Date | null; end: Date | null }>({\n        start: null,\n        end: null,\n    });\n\n    return (\n        <>\n            <Section title=\"Real use · typeable date field (type digits or paste)\">\n                <DateInput value={date} onValueChange={setDate} color=\"primary\" />\n                <p className=\"mt-2 text-sm opacity-70\">\n                    {date ? date.toDateString() : \"No date\"}\n                </p>\n            </Section>\n\n            <Section title=\"Locale-driven segment order (en-US vs en-GB vs de-DE)\">\n                <Row>\n                    <DateInput locale=\"en-US\" defaultValue={new Date(2026, 6, 8)} />\n                    <DateInput locale=\"en-GB\" defaultValue={new Date(2026, 6, 8)} />\n                    <DateInput locale=\"de-DE\" defaultValue={new Date(2026, 6, 8)} />\n                </Row>\n            </Section>\n\n            <Section title=\"DateRangeInput\">\n                <DateRangeInput value={range} onValueChange={setRange} />\n                <p className=\"mt-2 text-sm opacity-70\">\n                    {range.start ? range.start.toDateString() : \"…\"} —{\" \"}\n                    {range.end ? range.end.toDateString() : \"…\"}\n                </p>\n            </Section>\n\n            <Section title=\"Sizes / disabled\">\n                <Row>\n                    <DateInput size=\"sm\" defaultValue={new Date(2026, 6, 8)} />\n                    <DateInput size=\"md\" defaultValue={new Date(2026, 6, 8)} />\n                    <DateInput size=\"lg\" defaultValue={new Date(2026, 6, 8)} />\n                    <DateInput disabled defaultValue={new Date(2026, 6, 8)} />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "DatePicker",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/date-picker.tsx",
    "description": "Silica DatePicker — an input that opens a `Calendar` popover to pick one date. <DatePicker value={date} onValueChange={setDate} placeholder=\"Pick a date\" />",
    "props": [
      {
        "name": "DatePickerProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: Date | null) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "weekStartsOn",
            "optional": true,
            "type": "Weekday",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "isDateDisabled",
            "optional": true,
            "type": "(date: Date) => boolean",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "formatOptions",
            "optional": true,
            "type": "Intl.DateTimeFormatOptions",
            "doc": "Intl options for the trigger label (default `{ dateStyle: \"medium\" }`)."
          },
          {
            "name": "color",
            "optional": true,
            "type": "DatePickerColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DatePickerSize",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DatePickerSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "DatePickerAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      },
      {
        "name": "DateRangePickerProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: DateRange) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "numberOfMonths",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "weekStartsOn",
            "optional": true,
            "type": "Weekday",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "isDateDisabled",
            "optional": true,
            "type": "(date: Date) => boolean",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "formatOptions",
            "optional": true,
            "type": "Intl.DateTimeFormatOptions",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DatePickerColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DatePickerSize",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DatePickerSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "DatePickerAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "DateRangeInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/date-input.tsx",
    "description": "Silica DateRangeInput — two `DateInput`s (start/end), each independently typeable. The end field's `min` follows the start value once it's set. <DateRangeInput value={range} onValueChange={setRange} />",
    "props": [
      {
        "name": "DateInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "Date | null",
            "doc": "Controlled value. `null` clears the field."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: Date | null) => void",
            "doc": "Fires once every segment is filled with a valid date; `null` while incomplete/cleared."
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": "Selectable bounds (inclusive); an out-of-range completed date is clamped."
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": "BCP-47 locale — drives segment order (MM/DD/YYYY vs DD/MM/YYYY, …) and separators."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DateInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DateInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      },
      {
        "name": "DateRangeInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: DateRange) => void",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DateInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DateInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "DateRangePicker",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/date-picker.tsx",
    "description": "Silica DateRangePicker — an input that opens a two-month `Calendar` to pick a start/end range. Closes once both ends are chosen. <DateRangePicker value={range} onValueChange={setRange} />",
    "props": [
      {
        "name": "DatePickerProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: Date | null) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "weekStartsOn",
            "optional": true,
            "type": "Weekday",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "isDateDisabled",
            "optional": true,
            "type": "(date: Date) => boolean",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "formatOptions",
            "optional": true,
            "type": "Intl.DateTimeFormatOptions",
            "doc": "Intl options for the trigger label (default `{ dateStyle: \"medium\" }`)."
          },
          {
            "name": "color",
            "optional": true,
            "type": "DatePickerColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DatePickerSize",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DatePickerSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "DatePickerAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      },
      {
        "name": "DateRangePickerProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "DateRange",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: DateRange) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "numberOfMonths",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "weekStartsOn",
            "optional": true,
            "type": "Weekday",
            "doc": ""
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "isDateDisabled",
            "optional": true,
            "type": "(date: Date) => boolean",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "formatOptions",
            "optional": true,
            "type": "Intl.DateTimeFormatOptions",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DatePickerColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DatePickerSize",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DatePickerSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "DatePickerAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "DateTimeInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/date-time-input.tsx",
    "description": "Silica DateTimeInput — `DateInput` + `TimeInput` fused into one segmented field sharing a single `Date` value, for the common \"when exactly\" case (appointments, deadlines, scheduled posts) without stitching two widgets together yourself. <DateTimeInput value={when} onValueChange={setWhen} /> <DateTimeInput hourCycle={24} showSeconds min={new Date()} />",
    "props": [
      {
        "name": "DateTimeInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "Date | null",
            "doc": "Controlled value — a full `Date` (date + time together). `null` clears the field."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "Date | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: Date | null) => void",
            "doc": "Fires once every segment (date + time, + AM/PM in 12h mode) is filled; `null` while incomplete/cleared."
          },
          {
            "name": "min",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "max",
            "optional": true,
            "type": "Date",
            "doc": ""
          },
          {
            "name": "hourCycle",
            "optional": true,
            "type": "12 | 24",
            "doc": "`12` or `24`. Default: derived from `locale`."
          },
          {
            "name": "showSeconds",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "DateTimeInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "DateTimeInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { DateTimeInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function DateTimeInputDemo() {\n    const [when, setWhen] = useState<Date | null>(new Date(2026, 6, 8, 14, 30));\n\n    return (\n        <>\n            <Section title=\"Real use · schedule a post (type or paste 'e.g. 7/8/2026 2:30 PM')\">\n                <DateTimeInput value={when} onValueChange={setWhen} color=\"primary\" />\n                <p className=\"mt-2 text-sm opacity-70\">\n                    {when ? when.toString() : \"No date/time\"}\n                </p>\n            </Section>\n\n            <Section title=\"24h + seconds, min bound to now\">\n                <DateTimeInput hourCycle={24} showSeconds min={new Date()} />\n            </Section>\n\n            <Section title=\"Sizes / disabled\">\n                <Row>\n                    <DateTimeInput size=\"sm\" defaultValue={new Date(2026, 6, 8, 9, 0)} />\n                    <DateTimeInput size=\"lg\" defaultValue={new Date(2026, 6, 8, 9, 0)} />\n                    <DateTimeInput disabled defaultValue={new Date(2026, 6, 8, 9, 0)} />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Field",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/field.tsx",
    "description": "Silica Field — an accessible form field. Base UI wires the label, control, description, and error together (ids, aria, validity tracking); Silica styles them. Wrap any Silica control. <Field name=\"email\"> <FieldLabel>Email</FieldLabel> <FieldControl type=\"email\" required placeholder=\"you@example.com\" /> <FieldDescription>We'll never share it.</FieldDescription> <FieldError /> </Field> For a non-input control, pass it via `render`: <FieldControl render={<Textarea />} /> Validation status (error/warning/success), a loading spinner, and a disabled explanation compose onto the SAME `Input`/`Select`/`Textarea` — no special \"validated input\" component: <Field status=\"error\" statusMessage=\"Please enter a valid email address.\"> <FieldLabel>Email</FieldLabel> <FieldControl type=\"email\" /> </Field>",
    "props": [
      {
        "name": "FieldProps",
        "extends": "extends Styled<typeof BaseField.Root>",
        "members": [
          {
            "name": "status",
            "optional": true,
            "type": "FieldStatusValue",
            "doc": "Validation status; drives the control's accent, trailing icon, and (with `statusMessage`) the message panel."
          },
          {
            "name": "statusMessage",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown via an auto-rendered `FieldStatus` when set (in addition to any `FieldStatus` you compose manually)."
          },
          {
            "name": "loading",
            "optional": true,
            "type": "boolean",
            "doc": "Shows a spinner in the control's trailing slot, independent of `status`."
          },
          {
            "name": "disabledMessage",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown next to a disabled control instead of a `Tooltip` (disabled elements don't fire hover events)."
          },
          {
            "name": "floating",
            "optional": true,
            "type": "boolean",
            "doc": "Floats the auto-rendered status message out of flow so it never pushes sibling fields — see `FieldStatus`'s `floating` prop."
          }
        ]
      },
      {
        "name": "FieldLabelProps",
        "extends": "extends Styled<typeof BaseField.Label>",
        "members": [
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": "Appends a required-field asterisk after the label text."
          }
        ]
      },
      {
        "name": "FieldControlProps",
        "members": []
      },
      {
        "name": "FieldDescriptionProps",
        "members": []
      },
      {
        "name": "FieldErrorProps",
        "members": []
      },
      {
        "name": "FieldStatusProps",
        "extends": "extends React.HTMLAttributes<HTMLParagraphElement>",
        "members": [
          {
            "name": "status",
            "optional": true,
            "type": "FieldStatusValue",
            "doc": "Overrides the ambient `Field status`; only needed outside a `Field` or to show a different color than the field's own."
          },
          {
            "name": "attached",
            "optional": true,
            "type": "boolean",
            "doc": "Flush, colored panel directly under a bordered control (default, when inside a `Field`). Set `false` for checkboxes/switches/custom controls where an attached panel would visually overlap — renders a plain colored text row instead. Astryx calls this split out explicitly; matches controls we already ship (`Checkbox`/`Switch`/`Radio` want `attached={false}`)."
          },
          {
            "name": "floating",
            "optional": true,
            "type": "boolean",
            "doc": "Takes the panel out of flow (`position: absolute`, anchored under the `Field`) so it never pushes sibling fields up or down as it appears, changes, or disappears — it overlays whatever's below instead. Off by default (the panel occupies normal flow space)."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Button,\n    Field,\n    FieldLabel,\n    FieldControl,\n    FieldDescription,\n    FieldError,\n    FieldStatus,\n    Textarea,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nexport function FieldDemo() {\n    const [floatingError, setFloatingError] = useState(false);\n    return (\n        <>\n            <Section title=\"Real use · required field with description\">\n                <Field className=\"max-w-sm\">\n                    <FieldLabel required>Full name</FieldLabel>\n                    <FieldControl required placeholder=\"Ada Lovelace\" />\n                    <FieldDescription>As it appears on your ID.</FieldDescription>\n                    <FieldError />\n                </Field>\n            </Section>\n\n            <Section title=\"Non-input control via render (Textarea)\">\n                <Field className=\"max-w-sm\">\n                    <FieldLabel>Bio</FieldLabel>\n                    <FieldControl render={<Textarea rows={3} />} />\n                    <FieldDescription>Shown on your public profile.</FieldDescription>\n                </Field>\n            </Section>\n\n            <Section title=\"Disabled\">\n                <Stack className=\"max-w-sm\">\n                    <Field disabled>\n                        <FieldLabel>Organization</FieldLabel>\n                        <FieldControl defaultValue=\"Silica UI\" />\n                    </Field>\n                    <Field disabled disabledMessage=\"Contact your admin to change this.\">\n                        <FieldLabel>Billing plan</FieldLabel>\n                        <FieldControl defaultValue=\"Enterprise\" />\n                    </Field>\n                </Stack>\n            </Section>\n\n            <Section title=\"FieldStatus · attached (border+icon+message panel)\">\n                <Stack className=\"max-w-sm\">\n                    <Field status=\"error\" statusMessage=\"Please enter a valid email address.\">\n                        <FieldLabel>Email</FieldLabel>\n                        <FieldControl defaultValue=\"sarah@\" />\n                    </Field>\n                    <Field status=\"warning\" statusMessage=\"This username is already taken — try adding a number.\">\n                        <FieldLabel>Username</FieldLabel>\n                        <FieldControl defaultValue=\"sarah_chen\" />\n                    </Field>\n                    <Field status=\"success\" statusMessage=\"URL is valid and reachable.\">\n                        <FieldLabel>Website</FieldLabel>\n                        <FieldControl defaultValue=\"https://sarahchen.dev\" />\n                    </Field>\n                    <Field status=\"error\">\n                        <FieldLabel>Status without message</FieldLabel>\n                        <FieldControl defaultValue=\"test\" />\n                    </Field>\n                    <Field status=\"error\" statusMessage=\"Key is required.\">\n                        <FieldLabel required>Key</FieldLabel>\n                        <FieldControl placeholder=\"case_study\" />\n                        <FieldDescription>\n                            Immutable URL-safe identifier (lowercase, underscores).\n                        </FieldDescription>\n                    </Field>\n                    <Field loading>\n                        <FieldLabel>Loading field</FieldLabel>\n                        <FieldControl defaultValue=\"sarahc\" />\n                    </Field>\n                </Stack>\n            </Section>\n\n            <Section title=\"FieldStatus · floating (overlays instead of pushing sibling fields)\">\n                <Stack className=\"max-w-sm\">\n                    <Button size=\"sm\" onClick={() => setFloatingError((v) => !v)}>\n                        Toggle error\n                    </Button>\n                    <Field\n                        floating\n                        status={floatingError ? \"error\" : undefined}\n                        statusMessage={\n                            floatingError ? \"Please enter a valid email address.\" : undefined\n                        }\n                    >\n                        <FieldLabel>Email</FieldLabel>\n                        <FieldControl defaultValue=\"sarah@\" />\n                    </Field>\n                    <Field>\n                        <FieldLabel>Next field (stays put either way)</FieldLabel>\n                        <FieldControl defaultValue=\"unaffected\" />\n                    </Field>\n                </Stack>\n            </Section>\n\n            <Section title=\"FieldStatus · detached (for checkboxes/switches/custom controls)\">\n                <Stack className=\"max-w-sm\">\n                    <FieldStatus status=\"error\" attached={false}>\n                        This field is required\n                    </FieldStatus>\n                    <FieldStatus status=\"success\" attached={false}>\n                        Your changes have been saved\n                    </FieldStatus>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Fieldset",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/fieldset.tsx",
    "description": "Silica Fieldset — a labeled, vertically-stacked group of form controls. <Fieldset> <FieldsetLegend>Profile</FieldsetLegend> <Input placeholder=\"Name\" /> <FieldsetLabel>Your full legal name.</FieldsetLabel> </Fieldset> Renders a native `<fieldset>` (chrome reset in CSS) so `disabled` cascades to every control inside it for free.",
    "props": [
      {
        "name": "FieldsetProps",
        "extends": "extends React.FieldsetHTMLAttributes<HTMLFieldSetElement>",
        "members": []
      },
      {
        "name": "FieldsetLegendProps",
        "extends": "extends React.HTMLAttributes<HTMLLegendElement>",
        "members": []
      },
      {
        "name": "FieldsetLabelProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": []
      }
    ],
    "usageExample": "import { Fieldset, FieldsetLegend, FieldsetLabel, Input } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function FieldsetDemo() {\n    return (\n        <>\n            <Section title=\"Real use · profile group\">\n                <Fieldset className=\"max-w-sm\">\n                    <FieldsetLegend>Profile</FieldsetLegend>\n                    <Input placeholder=\"Full name\" />\n                    <FieldsetLabel>Your full legal name.</FieldsetLabel>\n                </Fieldset>\n            </Section>\n\n            <Section title=\"Disabled cascades to every control\">\n                <Fieldset disabled className=\"max-w-sm\">\n                    <FieldsetLegend>Billing (locked)</FieldsetLegend>\n                    <Input placeholder=\"Card number\" />\n                    <FieldsetLabel>Contact support to change billing.</FieldsetLabel>\n                </Fieldset>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "FileInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/file-input.tsx",
    "description": "Silica FileInput — a styled `<input type=\"file\">`. <FileInput onChange={(e) => setFile(e.target.files?.[0])} /> <FileInput accept=\"image/*\" multiple size=\"lg\" />",
    "props": [
      {
        "name": "FileInputProps",
        "extends": "extends VoidElementProps<\n    Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\">\n  >",
        "members": [
          {
            "name": "size",
            "optional": true,
            "type": "FileInputSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { FileInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function FileInputDemo() {\n    const [name, setName] = useState<string | null>(null);\n\n    return (\n        <>\n            <Section title=\"Sizes\">\n                <Row>\n                    <FileInput size=\"sm\" />\n                    <FileInput />\n                    <FileInput size=\"lg\" />\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · avatar upload\">\n                <div className=\"flex flex-col gap-2\">\n                    <FileInput\n                        accept=\"image/*\"\n                        onChange={(e) => setName(e.target.files?.[0]?.name ?? null)}\n                    />\n                    <p className=\"text-xs opacity-60\">\n                        {name ? `Selected: ${name}` : \"PNG or JPG, up to 5MB.\"}\n                    </p>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "FileUpload",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/file-upload.tsx",
    "description": "FileUpload — a `Dropzone` plus a managed preview list. `Dropzone` alone is purely presentational about the *result*; this owns the accepted-file list (controlled or uncontrolled), renders image thumbnails / generic icons + name + size, and a per-file remove button. <FileUpload accept=\"image/*,.pdf\" maxSize={5 * 1024 * 1024} onFilesChange={setFiles} onReject={(r) => toast.add({ title: `${r.length} file(s) rejected` })} />",
    "props": [
      {
        "name": "FileUploadProps",
        "extends": "extends Omit<DropzoneProps, \"onFiles\" | \"onReject\" | \"children\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "File[]",
            "doc": "Controlled file list."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "File[]",
            "doc": "Uncontrolled initial file list."
          },
          {
            "name": "onFilesChange",
            "optional": true,
            "type": "(files: File[]) => void",
            "doc": "Fires with the full accepted-file list whenever it changes (add or remove)."
          },
          {
            "name": "onReject",
            "optional": true,
            "type": "(rejections: FileUploadRejection[]) => void",
            "doc": "Fires with anything filtered out by `accept`/`maxSize`."
          },
          {
            "name": "previewImages",
            "optional": true,
            "type": "boolean",
            "doc": "Render an `<img>` thumbnail for image files instead of a generic icon. Default `true`."
          },
          {
            "name": "showRejections",
            "optional": true,
            "type": "boolean",
            "doc": "Show rejected-file reasons below the dropzone. Default `true`."
          }
        ]
      }
    ],
    "usageExample": "import { FileUpload } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function FileUploadDemo() {\n    return (\n        <Section title=\"Real use · attachments with previews, accept/maxSize filtering\">\n            <div className=\"max-w-md\">\n                <FileUpload\n                    accept=\"image/*,.pdf\"\n                    maxSize={2 * 1024 * 1024}\n                    hint=\"Images or PDF, up to 2MB each\"\n                />\n            </div>\n        </Section>\n    );\n}"
  },
  {
    "name": "Filter",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/filter.tsx",
    "description": "Silica Filter — a single-select row of chips with a reset, for faceted product/category filtering. Radio semantics: one chip at a time; the reset clears the choice. Pair with `FilterItem`s. <Filter defaultValue=\"all\" color=\"primary\"> <FilterItem value=\"all\">All</FilterItem> <FilterItem value=\"apparel\">Apparel</FilterItem> <FilterItem value=\"gear\">Gear</FilterItem> </Filter>",
    "props": [
      {
        "name": "FilterProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"color\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled selected value (`undefined` = nothing selected)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string | undefined) => void",
            "doc": "Fires with the new value, or `undefined` when reset."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent for the selected chip."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable every chip + the reset."
          },
          {
            "name": "showReset",
            "optional": true,
            "type": "boolean",
            "doc": "Render the reset (×) once something is selected (default true)."
          },
          {
            "name": "resetLabel",
            "optional": true,
            "type": "string",
            "doc": "Accessible label for the reset control."
          }
        ]
      },
      {
        "name": "FilterItemProps",
        "extends": "extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"value\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": "This chip's value."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Filter, FilterItem } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nconst CATEGORIES = [\"All\", \"Apparel\", \"Footwear\", \"Accessories\", \"Sale\"];\n\nexport function FilterDemo() {\n    const [category, setCategory] = useState<string | undefined>(\"All\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"flex flex-col gap-3\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Filter key={color} color={color} defaultValue=\"all\">\n                            <FilterItem value=\"all\">All</FilterItem>\n                            <FilterItem value=\"new\">New</FilterItem>\n                            <FilterItem value=\"sale\">Sale</FilterItem>\n                        </Filter>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · category filter\">\n                <div className=\"flex flex-col gap-2\">\n                    <Filter color=\"primary\" value={category} onValueChange={setCategory}>\n                        {CATEGORIES.map((c) => (\n                            <FilterItem key={c} value={c}>\n                                {c}\n                            </FilterItem>\n                        ))}\n                    </Filter>\n                    <p className=\"text-sm opacity-60\">\n                        Showing: {category ?? \"nothing selected\"}\n                    </p>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "FloatingLabel",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/label.tsx",
    "description": "Silica FloatingLabel — a caption that rests inside the field and floats up on focus or when the field has a value. <FloatingLabel label=\"Email\"> <Input type=\"email\" /> </FloatingLabel> The \"filled\" state relies on `:placeholder-shown`, so the control needs a placeholder — one (a single space) is injected automatically if you don't set your own.",
    "props": [
      {
        "name": "LabelProps",
        "extends": "extends React.LabelHTMLAttributes<HTMLLabelElement>",
        "members": [
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": "Appends a required-field asterisk after the label text."
          }
        ]
      },
      {
        "name": "FloatingLabelProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"children\">",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "Caption text that floats onto the border when the field is focused/filled."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement<{ placeholder?: string }>",
            "doc": "The control (an `<Input>`, `<Textarea>`, `<select>`, …)."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Form",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/form.tsx",
    "description": "Silica Form — a `<form>` that coordinates its Fields' validation. Behavior from Base UI: it runs each Field's validation on submit, moves focus to the first invalid control, and accepts server-returned `errors` keyed by field `name`. Presentational only otherwise — lay it out with `Field`s and utilities. <Form errors={serverErrors} onSubmit={…}> <Field name=\"email\">…</Field> <Button type=\"submit\">Save</Button> </Form> Silica narrows the focus move, which is unconditional and un-opt-out-able upstream: it never selects the control's existing value, and never takes the caret from a text control the user is typing in when a late `errors` update arrives. Use `focusOnError` to soften it further: <Form focusOnError=\"scroll\" errors={serverErrors}>…</Form> // reveal, don't focus <Form focusOnError={false} errors={serverErrors}>…</Form> // leave focus alone",
    "props": [
      {
        "name": "FormProps",
        "extends": "extends React.ComponentPropsWithoutRef<typeof BaseForm>",
        "members": [
          {
            "name": "focusOnError",
            "optional": true,
            "type": "FormFocusOnError",
            "doc": "How an invalid submit (or a late `errors` update) treats focus. Defaults to `true`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Button,\n    Field,\n    FieldControl,\n    FieldError,\n    FieldLabel,\n    Form,\n    PasswordInput,\n    ToggleGroup,\n    ToggleGroupItem,\n} from \"@wizeworks/silicaui-react\";\nimport type { FormFocusOnError } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\ntype Errors = Record<string, string>;\n\n/**\n * `Form` runs each Field's validation on submit and moves focus to the first\n * invalid control. `focusOnError` decides how far that goes — the sign-in shape\n * below is where it matters, because the rejection arrives from a server long\n * after the user has moved on to the next field.\n */\nexport function FormDemo() {\n    const [focusOnError, setFocusOnError] = useState<FormFocusOnError>(true);\n    const [errors, setErrors] = useState<Errors>({});\n    const [pending, setPending] = useState(false);\n\n    function onSubmit(event: React.FormEvent<HTMLFormElement>) {\n        event.preventDefault();\n        setErrors({});\n        setPending(true);\n        // Stands in for a sign-in round trip. Type into the password field while\n        // it runs: the caret has to stay put when the rejection lands.\n        window.setTimeout(() => {\n            setPending(false);\n            setErrors({ email: \"That address isn't registered.\" });\n        }, 1500);\n    }\n\n    return (\n        <>\n            <Section title=\"focusOnError\">\n                <Stack className=\"max-w-sm\">\n                    <ToggleGroup\n                        size=\"sm\"\n                        value={[String(focusOnError)]}\n                        onValueChange={(v) => {\n                            const next = v[0];\n                            if (next == null) return; // clicking the active item can't clear it\n                            setFocusOnError(\n                                next === \"false\" ? false : next === \"scroll\" ? \"scroll\" : true,\n                            );\n                        }}\n                    >\n                        <ToggleGroupItem value=\"true\">true</ToggleGroupItem>\n                        <ToggleGroupItem value=\"scroll\">scroll</ToggleGroupItem>\n                        <ToggleGroupItem value=\"false\">false</ToggleGroupItem>\n                    </ToggleGroup>\n                    <p className=\"text-sm\">\n                        Submit with an invalid email to see the client-side path. For the\n                        async path, submit a <em>valid</em> address and keep typing your\n                        password during the 1.5s round trip — the rejection must not take\n                        the caret.\n                    </p>\n                </Stack>\n            </Section>\n\n            <Section title=\"Sign in\">\n                <Form\n                    errors={errors}\n                    focusOnError={focusOnError}\n                    onSubmit={onSubmit}\n                    className=\"grid max-w-sm gap-4\"\n                >\n                    <Field name=\"email\">\n                        <FieldLabel required>Email</FieldLabel>\n                        <FieldControl\n                            type=\"email\"\n                            required\n                            placeholder=\"you@example.com\"\n                            data-testid=\"demo-email\"\n                        />\n                        <FieldError />\n                    </Field>\n                    <Field\n                        name=\"password\"\n                        validate={(v) =>\n                            String(v ?? \"\").length >= 8 ? null : \"Use at least 8 characters.\"\n                        }\n                    >\n                        <FieldLabel required>Password</FieldLabel>\n                        <FieldControl\n                            required\n                            render={<PasswordInput data-testid=\"demo-password\" />}\n                        />\n                        <FieldError />\n                    </Field>\n                    <Button type=\"submit\" color=\"primary\" loading={pending}>\n                        {pending ? \"Signing in…\" : \"Sign in\"}\n                    </Button>\n                </Form>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Input",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/input.tsx",
    "description": "Silica Input — a single-line text field. Thin, presentational wrapper around a native `<input>`, so all native attributes (`type`, `value`, `onChange`, `placeholder`, `disabled`, …) pass straight through.",
    "props": [
      {
        "name": "InputProps",
        "extends": "extends VoidElementProps<\n    Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"color\">\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "InputColor",
            "doc": "Accent color; maps to `input-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "InputSize",
            "doc": "Default `md`. Matches same-size Button heights."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Input,\n    Field,\n    FieldLabel,\n    FieldControl,\n    FieldDescription,\n    FieldError,\n    FloatingLabel,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Row, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function InputDemo() {\n    const [email, setEmail] = useState(\"not-an-email\");\n    const invalid = email.length > 0 && !email.includes(\"@\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-md\">\n                    <Input placeholder=\"Default (focus for primary ring)\" />\n                    <Input color=\"primary\" placeholder=\"Primary\" />\n                    <Input color=\"success\" placeholder=\"Success\" />\n                    <Input color=\"error\" placeholder=\"Error\" defaultValue=\"not-an-email\" />\n                    <Input color=\"brand\" placeholder=\"SilicaUI\" />\n                    <Input disabled placeholder=\"Disabled\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"max-w-md\">\n                    {SIZES.map((size) => (\n                        <Input key={size} size={size} placeholder={size} />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Real form · Field + validation\">\n                <div className=\"max-w-sm rounded-box border border-base-300 bg-base-100 p-5 shadow-sm\">\n                    <div className=\"flex flex-col gap-4\">\n                        <Field\n                            validationMode=\"onChange\"\n                            validate={() => (invalid ? \"Enter a valid email address\" : null)}\n                        >\n                            <FieldLabel>Work email</FieldLabel>\n                            <FieldControl\n                                type=\"email\"\n                                value={email}\n                                onChange={(e) => setEmail(e.target.value)}\n                                placeholder=\"you@company.com\"\n                            />\n                            <FieldDescription>\n                                We'll send a magic link to sign in.\n                            </FieldDescription>\n                            <FieldError />\n                        </Field>\n                        <FloatingLabel label=\"Company name\">\n                            <Input />\n                        </FloatingLabel>\n                        <Row>\n                            <Button color=\"primary\" block>\n                                Continue\n                            </Button>\n                        </Row>\n                    </div>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "InputGroup",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/input-group.tsx",
    "description": "Positioning shell for an `Input` with a leading/trailing icon or button — search icon, password show/hide, clear button, and the like. <InputGroup> <InputGroupAddon placement=\"start\"><SearchIcon /></InputGroupAddon> <Input className=\"input-affix-start\" placeholder=\"Search…\" /> </InputGroup>",
    "props": [
      {
        "name": "InputGroupProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": []
      },
      {
        "name": "InputGroupAddonProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "placement",
            "optional": false,
            "type": "\"start\" | \"end\"",
            "doc": "Which side of the field this slot sits on."
          }
        ]
      },
      {
        "name": "InputGroupButtonProps",
        "extends": "extends React.ButtonHTMLAttributes<HTMLButtonElement>",
        "members": []
      }
    ],
    "usageExample": "import { Input, InputGroup, InputGroupAddon } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nconst AtIcon = () => (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n        <circle cx=\"12\" cy=\"12\" r=\"4\" />\n        <path d=\"M16 12v1.5a2.5 2.5 0 0 0 5 0V12a9 9 0 1 0-5.5 8.28\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </svg>\n);\n\nexport function InputGroupDemo() {\n    return (\n        <Section title=\"Custom affix composition\">\n            <p className=\"max-w-sm text-xs opacity-60\">\n                The primitive behind PasswordInput/SearchInput/PhoneInput — compose your\n                own leading/trailing icon or text around any Input.\n            </p>\n            <Stack className=\"max-w-sm\">\n                <InputGroup>\n                    <InputGroupAddon placement=\"start\">\n                        <AtIcon />\n                    </InputGroupAddon>\n                    <Input className=\"input-affix-start\" placeholder=\"username\" />\n                </InputGroup>\n            </Stack>\n        </Section>\n    );\n}"
  },
  {
    "name": "Join",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/join.tsx",
    "description": "Silica Join — merges its children into one seamless segmented group. <Join> <Button>Day</Button> <Button>Week</Button> <Button>Month</Button> </Join> <Join> <Input placeholder=\"Search…\" /> <Button color=\"primary\">Go</Button> </Join>",
    "props": [
      {
        "name": "JoinProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "orientation",
            "optional": true,
            "type": "JoinOrientation",
            "doc": "`horizontal` (default) or `vertical`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Join, Button, Input } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst RANGES = [\"Day\", \"Week\", \"Month\"];\n\nexport function JoinDemo() {\n    const [range, setRange] = useState(\"Week\");\n\n    return (\n        <>\n            <Section title=\"Real use · segmented range picker\">\n                <Join>\n                    {RANGES.map((r) => (\n                        <Button\n                            key={r}\n                            variant={r === range ? \"solid\" : \"outline\"}\n                            color={r === range ? \"primary\" : \"neutral\"}\n                            onClick={() => setRange(r)}\n                        >\n                            {r}\n                        </Button>\n                    ))}\n                </Join>\n            </Section>\n\n            <Section title=\"Input + button\">\n                <Row>\n                    <Join>\n                        <Input placeholder=\"Search…\" />\n                        <Button color=\"primary\">Go</Button>\n                    </Join>\n                </Row>\n            </Section>\n\n            <Section title=\"Vertical\">\n                <Join orientation=\"vertical\" className=\"w-32\">\n                    <Button variant=\"outline\" color=\"neutral\">\n                        Top\n                    </Button>\n                    <Button variant=\"outline\" color=\"neutral\">\n                        Middle\n                    </Button>\n                    <Button variant=\"outline\" color=\"neutral\">\n                        Bottom\n                    </Button>\n                </Join>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Label",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/label.tsx",
    "description": "Silica Label — a plain, muted caption for a control. <Label htmlFor=\"email\">Email</Label> <Input id=\"email\" /> <Label htmlFor=\"email\" required>Email</Label> // \"Email *\"",
    "props": [
      {
        "name": "LabelProps",
        "extends": "extends React.LabelHTMLAttributes<HTMLLabelElement>",
        "members": [
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": "Appends a required-field asterisk after the label text."
          }
        ]
      },
      {
        "name": "FloatingLabelProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"children\">",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "Caption text that floats onto the border when the field is focused/filled."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement<{ placeholder?: string }>",
            "doc": "The control (an `<Input>`, `<Textarea>`, `<select>`, …)."
          }
        ]
      }
    ],
    "usageExample": "import { Label, FloatingLabel, Input } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nexport function LabelDemo() {\n    return (\n        <>\n            <Section title=\"Plain label\">\n                <div className=\"flex max-w-sm flex-col gap-1.5\">\n                    <Label htmlFor=\"email-plain\">Email</Label>\n                    <Input id=\"email-plain\" placeholder=\"you@example.com\" />\n                </div>\n            </Section>\n\n            <Section title=\"Real use · floating label form\">\n                <Stack className=\"max-w-sm\">\n                    <FloatingLabel label=\"Email\">\n                        <Input type=\"email\" />\n                    </FloatingLabel>\n                    <FloatingLabel label=\"Password\">\n                        <Input type=\"password\" />\n                    </FloatingLabel>\n                </Stack>\n            </Section>\n\n            <Section title=\"Required\">\n                <div className=\"flex max-w-sm flex-col gap-1.5\">\n                    <Label htmlFor=\"email-required\" required>\n                        Email\n                    </Label>\n                    <Input id=\"email-required\" placeholder=\"you@example.com\" />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "MultiSelect",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/multi-select.tsx",
    "description": "Silica MultiSelect — a searchable listbox that picks *several* values from a fixed option set, shown as removable chips in the field (Base UI Combobox in `multiple` mode). Type to filter `items`; click or Enter to add; click a chip's × or Backspace at the start of the field to remove. <MultiSelect items={[\"React\", \"Vue\", \"Svelte\", \"Solid\"]} value={frameworks} onValueChange={setFrameworks} placeholder=\"Frameworks…\" /> // object items: <MultiSelect items={[{ value: \"us\", label: \"United States\" }, { value: \"ca\", label: \"Canada\" }]} placeholder=\"Countries\" color=\"primary\" />",
    "props": [
      {
        "name": "MultiSelectItemProps",
        "extends": "extends Omit<Styled<typeof BaseCombobox.Item>, \"children\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "unknown",
            "doc": ""
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          }
        ]
      },
      {
        "name": "MultiSelectProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "readonly unknown[]",
            "doc": "The full option set (strings or `{ value, label }`); Base UI filters it."
          },
          {
            "name": "value",
            "optional": true,
            "type": "unknown[]",
            "doc": "Controlled selected values."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "unknown[]",
            "doc": "Uncontrolled initial selected values."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: unknown[], eventDetails?: unknown) => void",
            "doc": "Fires with the newly-selected value array."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "emptyMessage",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown in the popup when nothing matches the query."
          },
          {
            "name": "color",
            "optional": true,
            "type": "MultiSelectColor",
            "doc": "Accent for the field border, focus ring, and chips."
          },
          {
            "name": "size",
            "optional": true,
            "type": "MultiSelectSize",
            "doc": "Field height; matches same-size Inputs."
          },
          {
            "name": "clearable",
            "optional": true,
            "type": "boolean",
            "doc": "Show the clear-all (×) button (default true)."
          },
          {
            "name": "side",
            "optional": true,
            "type": "MultiSelectSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "MultiSelectAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Class for the field."
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the popup surface."
          },
          {
            "name": "itemToStringLabel",
            "optional": true,
            "type": "(item: unknown) => string",
            "doc": "For object items, map an item to its display string (default: `.label`)."
          },
          {
            "name": "renderItem",
            "optional": true,
            "type": "(item: unknown, index: number) => React.ReactNode",
            "doc": "Override how each filtered dropdown item renders."
          },
          {
            "name": "renderChipLabel",
            "optional": true,
            "type": "(item: unknown) => React.ReactNode",
            "doc": "Override how each selected value's chip label renders (default: `.label`)."
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-labelledby\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { MultiSelect } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst FRAMEWORKS = [\"React\", \"Vue\", \"Svelte\", \"Solid\", \"Angular\", \"Qwik\", \"Preact\"];\n\nconst COUNTRIES = [\n    { value: \"us\", label: \"United States\" },\n    { value: \"ca\", label: \"Canada\" },\n    { value: \"mx\", label: \"Mexico\" },\n    { value: \"gb\", label: \"United Kingdom\" },\n    { value: \"fr\", label: \"France\" },\n    { value: \"de\", label: \"Germany\" },\n];\n\nexport function MultiSelectDemo() {\n    const [frameworks, setFrameworks] = useState<string[]>([\"React\", \"Svelte\"]);\n    const [countries, setCountries] = useState<{ value: string; label: string }[]>([]);\n\n    return (\n        <>\n            <Section title=\"Real use · pick several frameworks (string items)\">\n                <MultiSelect\n                    items={FRAMEWORKS}\n                    value={frameworks}\n                    onValueChange={(v) => setFrameworks(v as string[])}\n                    placeholder=\"Add a framework…\"\n                    color=\"primary\"\n                />\n            </Section>\n\n            <Section title=\"Object items · label ≠ value\">\n                <MultiSelect\n                    items={COUNTRIES}\n                    value={countries}\n                    onValueChange={(v) => setCountries(v as { value: string; label: string }[])}\n                    placeholder=\"Add countries…\"\n                />\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {([\"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <MultiSelect\n                            key={size}\n                            items={[\"A\", \"B\", \"C\"]}\n                            defaultValue={[\"A\"]}\n                            size={size}\n                            placeholder={size}\n                        />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Disabled\">\n                <MultiSelect items={FRAMEWORKS} defaultValue={[\"Vue\"]} disabled />\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "NativeSelect",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/native-select.tsx",
    "description": "Silica NativeSelect — a native `<select>` restyled to the field tier. Thin, presentational wrapper: pass `<option>`s as children and all native attributes (`value`, `defaultValue`, `onChange`, `disabled`, …) through. For a rich, searchable, fully-styled listbox (custom popup, groups, keyboard typeahead, multi-select), use `Select` (the Base UI listbox) instead.",
    "props": [
      {
        "name": "NativeSelectProps",
        "extends": "extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, \"size\" | \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "NativeSelectColor",
            "doc": "Accent color; maps to `select-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "NativeSelectSize",
            "doc": "Default `md`. Matches same-size Input/Button heights."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "NumberField",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/number-field.tsx",
    "description": "Silica NumberField — a stepper input (Base UI: clamping, keyboard, scrub). <NumberField defaultValue={1} min={0} max={10} onValueChange={setQty} />",
    "props": [
      {
        "name": "NumberFieldProps",
        "extends": "extends Styled<typeof BaseNumberField.Root>",
        "members": [
          {
            "name": "label",
            "optional": true,
            "type": "string",
            "doc": "Accessible label for the input."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { NumberField } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function NumberFieldDemo() {\n    const [qty, setQty] = useState<number | null>(2);\n\n    return (\n        <>\n            <Section title=\"Real use · cart quantity\">\n                <Row>\n                    <NumberField\n                        label=\"Quantity\"\n                        value={qty}\n                        onValueChange={setQty}\n                        min={1}\n                        max={10}\n                    />\n                    <span className=\"text-sm opacity-60\">{qty ?? 0} in cart</span>\n                </Row>\n            </Section>\n\n            <Section title=\"Step + bounds\">\n                <Row>\n                    <NumberField label=\"Percent\" defaultValue={50} min={0} max={100} step={5} />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "PasswordInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/password-input.tsx",
    "description": "Silica PasswordInput — an `Input` with a leading lock affix slot reserved and a trailing show/hide toggle. Uncontrolled visibility state; all native `<input>` attributes (`value`, `onChange`, `placeholder`, `disabled`, …) pass straight through.",
    "props": [
      {
        "name": "PasswordInputProps",
        "extends": "extends VoidElementProps<\n    Omit<\n      React.InputHTMLAttributes<HTMLInputElement>,\n      \"size\" | \"color\" | \"type\"\n    >\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "PasswordInputColor",
            "doc": "Accent color; maps to `input-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "PasswordInputSize",
            "doc": "Default `md`. Matches same-size Button/Input heights."
          },
          {
            "name": "defaultVisible",
            "optional": true,
            "type": "boolean",
            "doc": "Reveal the password on initial render. Default `false`."
          },
          {
            "name": "toggleAriaLabel",
            "optional": true,
            "type": "{ show: string; hide: string }",
            "doc": "Accessible label for the show/hide toggle. Default `\"Show password\"` / `\"Hide password\"`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { PasswordInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function PasswordInputDemo() {\n    const [value, setValue] = useState(\"hunter2\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-sm\">\n                    <PasswordInput placeholder=\"Default\" />\n                    <PasswordInput color=\"primary\" placeholder=\"Primary\" />\n                    <PasswordInput color=\"error\" placeholder=\"Error\" defaultValue=\"tooshort\" />\n                    <PasswordInput disabled placeholder=\"Disabled\" defaultValue=\"secret123\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"max-w-sm\">\n                    {SIZES.map((size) => (\n                        <PasswordInput key={size} size={size} placeholder={size} />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Controlled\">\n                <Stack className=\"max-w-sm\">\n                    <PasswordInput\n                        value={value}\n                        onChange={(e) => setValue(e.target.value)}\n                        placeholder=\"Password\"\n                    />\n                    <p className=\"text-xs opacity-60\">{value.length} characters</p>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "PhoneInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/phone-input.tsx",
    "description": "Silica PhoneInput — a country-code `Select` joined to a national-number `Input` (via `Join`), with a lightweight generic digit-grouping formatter. Not a full E.164 validation/formatting library — for that level of per-country precision, format `onValueChange`'s `e164` output yourself.",
    "props": [
      {
        "name": "PhoneInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled national number (digits, or digits with formatting — either is fine)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial national number."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(national: string, e164: string) => void",
            "doc": "Fires on every keystroke with the raw national digits and the full E.164 string."
          },
          {
            "name": "country",
            "optional": true,
            "type": "string",
            "doc": "Controlled selected country (ISO 3166-1 alpha-2)."
          },
          {
            "name": "defaultCountry",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial country. Default `\"US\"`."
          },
          {
            "name": "onCountryChange",
            "optional": true,
            "type": "(iso2: string) => void",
            "doc": "Fires when the country picker selection changes."
          },
          {
            "name": "countries",
            "optional": true,
            "type": "Country[]",
            "doc": "Override/extend the built-in country list."
          },
          {
            "name": "color",
            "optional": true,
            "type": "PhoneInputColor",
            "doc": "Accent color; maps to `input-<color>`/`select-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "PhoneInputSize",
            "doc": "Default `md`. Matches same-size Input/Select heights."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": "Field name for form submission (submits the national digits)."
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { PhoneInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function PhoneInputDemo() {\n    const [national, setNational] = useState(\"\");\n    const [e164, setE164] = useState(\"\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-sm\">\n                    <PhoneInput />\n                    <PhoneInput color=\"primary\" defaultCountry=\"GB\" defaultValue=\"7911123456\" />\n                    <PhoneInput disabled defaultCountry=\"DE\" defaultValue=\"15123456789\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"max-w-sm\">\n                    {SIZES.map((size) => (\n                        <PhoneInput key={size} size={size} />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Controlled\">\n                <Stack className=\"max-w-sm\">\n                    <PhoneInput\n                        value={national}\n                        onValueChange={(nat, e164) => {\n                            setNational(nat);\n                            setE164(e164);\n                        }}\n                    />\n                    <p className=\"text-xs opacity-60\">E.164: {e164 || \"(empty)\"}</p>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "PinInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/pin-input.tsx",
    "description": "Silica PinInput — a row of single-character cells for OTP / verification codes. Typing a character auto-advances to the next cell; Backspace on an empty cell steps back; arrow keys move focus; pasting a full code distributes it across the cells.",
    "props": [
      {
        "name": "PinInputProps",
        "extends": "extends Omit<\n    React.HTMLAttributes<HTMLDivElement>,\n    \"onChange\" | \"onPaste\" | \"color\"\n  >",
        "members": [
          {
            "name": "length",
            "optional": true,
            "type": "number",
            "doc": "Number of cells. Default `6`."
          },
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled value (a string up to `length` chars)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires with the next value on every keystroke, paste, or deletion."
          },
          {
            "name": "onComplete",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires once the value reaches `length` characters."
          },
          {
            "name": "mode",
            "optional": true,
            "type": "\"numeric\" | \"text\"",
            "doc": "Restrict input to digits (`\"numeric\"`, default) or any single character (`\"text\"`)."
          },
          {
            "name": "mask",
            "optional": true,
            "type": "boolean",
            "doc": "Render each cell's character as a dot, like a password field. Default `false`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "PinInputColor",
            "doc": "Accent color; maps to `pin-input-cell-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "PinInputSize",
            "doc": "Default `md`. Matches same-size Input heights."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "autoFocus",
            "optional": true,
            "type": "boolean",
            "doc": "Focus the first cell on mount."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": "Field name for form submission (submits the joined value as one field)."
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { PinInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack, Row } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function PinInputDemo() {\n    const [code, setCode] = useState(\"\");\n    const [completed, setCompleted] = useState(\"\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack>\n                    <PinInput length={4} />\n                    <PinInput length={4} color=\"primary\" />\n                    <PinInput length={4} color=\"error\" defaultValue=\"12\" />\n                    <PinInput length={4} disabled defaultValue=\"1234\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack>\n                    {SIZES.map((size) => (\n                        <PinInput key={size} length={4} size={size} />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Masked (text mode)\">\n                <Row>\n                    <PinInput length={4} mode=\"text\" mask />\n                </Row>\n            </Section>\n\n            <Section title=\"Controlled + onComplete\">\n                <Stack>\n                    <PinInput\n                        length={6}\n                        value={code}\n                        onValueChange={setCode}\n                        onComplete={setCompleted}\n                    />\n                    <p className=\"text-xs opacity-60\">\n                        Value: {code || \"(empty)\"}\n                        {completed && ` — completed: ${completed}`}\n                    </p>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Radio",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/radio.tsx",
    "description": "Silica Radio — a restyled native `<input type=\"radio\">`. Group them by giving several the same `name`. All native attributes pass through. <Radio name=\"plan\" value=\"pro\">Pro</Radio>",
    "props": [
      {
        "name": "RadioProps",
        "extends": "extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    \"size\" | \"color\" | \"type\"\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color; maps to `radio-<color>` (checked dot + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default `md`."
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Caption. Wraps the control in a `<label>` so the text is a click target."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Radio } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { ColorVariantSizeGrid } from \"../lib/ColorGrid\";\n\nconst PLANS = [\n    { id: \"starter\", label: \"Starter — $9/mo\" },\n    { id: \"pro\", label: \"Pro — $29/mo\" },\n    { id: \"enterprise\", label: \"Enterprise — custom\" },\n];\n\nexport function RadioDemo() {\n    const [plan, setPlan] = useState(\"pro\");\n\n    return (\n        <>\n            <ColorVariantSizeGrid\n                Component={Radio}\n                render={({ color, size }) => (\n                    <label className=\"flex items-center gap-2 text-sm\">\n                        <Radio name={`radio-${color ?? size}`} color={color} size={size} defaultChecked />\n                        {color ?? size}\n                    </label>\n                )}\n            />\n\n            <Section title=\"Real use · pick a plan\">\n                <div className=\"flex flex-col gap-2\">\n                    {PLANS.map((p) => (\n                        <label key={p.id} className=\"flex items-center gap-2 text-sm\">\n                            <Radio\n                                name=\"plan\"\n                                color=\"primary\"\n                                checked={plan === p.id}\n                                onChange={() => setPlan(p.id)}\n                            />\n                            {p.label}\n                        </label>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "RadioGroup",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/radio-group.tsx",
    "description": "Silica RadioGroup — a managed set of radios (native inputs, so arrow-key navigation comes free). Pair with `RadioOption`s. <RadioGroup defaultValue=\"card\" name=\"pay\"> <RadioOption value=\"card\">Card</RadioOption> <RadioOption value=\"ach\">Bank transfer</RadioOption> </RadioGroup>",
    "props": [
      {
        "name": "RadioGroupProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled selected value."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires with the newly-selected value."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": "Shared radio `name` (auto-generated if omitted)."
          },
          {
            "name": "orientation",
            "optional": true,
            "type": "RadioGroupOrientation",
            "doc": "Stack (`vertical`, default) or row (`horizontal`)."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable every option."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Default accent color for the options."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default size for the options."
          }
        ]
      },
      {
        "name": "RadioOptionProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"onChange\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": "This option's value."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { RadioGroup, RadioOption } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function RadioGroupDemo() {\n    const [plan, setPlan] = useState(\"pro\");\n\n    return (\n        <>\n            <Section title=\"Real use · billing plan\">\n                <RadioGroup value={plan} onValueChange={setPlan} color=\"primary\">\n                    <RadioOption value=\"starter\">Starter — $9/mo</RadioOption>\n                    <RadioOption value=\"pro\">Pro — $29/mo</RadioOption>\n                    <RadioOption value=\"enterprise\">Enterprise — custom</RadioOption>\n                </RadioGroup>\n            </Section>\n\n            <Section title=\"Horizontal\">\n                <RadioGroup defaultValue=\"md\" orientation=\"horizontal\" color=\"primary\">\n                    <RadioOption value=\"sm\">Small</RadioOption>\n                    <RadioOption value=\"md\">Medium</RadioOption>\n                    <RadioOption value=\"lg\">Large</RadioOption>\n                </RadioGroup>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "RadioOption",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/radio-group.tsx",
    "description": "One labeled radio within a RadioGroup.",
    "props": [
      {
        "name": "RadioGroupProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled selected value."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires with the newly-selected value."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": "Shared radio `name` (auto-generated if omitted)."
          },
          {
            "name": "orientation",
            "optional": true,
            "type": "RadioGroupOrientation",
            "doc": "Stack (`vertical`, default) or row (`horizontal`)."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable every option."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Default accent color for the options."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default size for the options."
          }
        ]
      },
      {
        "name": "RadioOptionProps",
        "extends": "extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"onChange\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": "This option's value."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Range",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/range.tsx",
    "description": "Silica Range — a slider (Base UI behavior). <Range defaultValue={40} onValueChange={setV} /> <Range defaultValue={[20, 60]} color=\"success\" /> // two thumbs Pass an array value/defaultValue for a multi-thumb range.",
    "props": [
      {
        "name": "RangeProps",
        "extends": "extends Styled<typeof BaseSlider.Root>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "RangeColor",
            "doc": "Accent color for the filled track + thumb. Default primary."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Range } from \"@wizeworks/silicaui-react\";\nimport { Section, LabeledRow } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function RangeDemo() {\n    const [volume, setVolume] = useState(40);\n    const [priceRange, setPriceRange] = useState<number[]>([20, 70]);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"flex max-w-md flex-col gap-4\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Range key={color} color={color} defaultValue={55} />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · volume + price range\">\n                <div className=\"flex max-w-md flex-col gap-5\">\n                    <LabeledRow label={`Volume · ${volume}%`}>\n                        <Range\n                            color=\"brand\"\n                            value={volume}\n                            onValueChange={(v) => setVolume(v as number)}\n                        />\n                    </LabeledRow>\n                    <LabeledRow label={`Price range · $${priceRange[0]} – $${priceRange[1]}`}>\n                        <Range\n                            color=\"success\"\n                            value={priceRange}\n                            onValueChange={(v) => setPriceRange(v as number[])}\n                        />\n                    </LabeledRow>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Rating",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/rating.tsx",
    "description": "Silica Rating — a row of star buttons. <Rating defaultValue={3} onValueChange={setStars} /> <Rating value={4.5 | 4} color=\"warning\" readOnly /> Keyboard: arrow keys change the value; Home/End jump to 1/max.",
    "props": [
      {
        "name": "RatingProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "number",
            "doc": "Controlled value (number of filled stars)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "number",
            "doc": "Initial value when uncontrolled."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: number) => void",
            "doc": "Called with the new rating whenever it changes."
          },
          {
            "name": "onChange",
            "optional": true,
            "type": "(value: number) => void",
            "doc": "@deprecated Use `onValueChange`. `onChange` is reserved for the native DOM handler on components that wrap a real form element; still honored here so this isn't a breaking change."
          },
          {
            "name": "max",
            "optional": true,
            "type": "number",
            "doc": "Number of stars. Default 5."
          },
          {
            "name": "color",
            "optional": true,
            "type": "RatingColor",
            "doc": "Accent color for filled stars. Default warning (gold)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "RatingSize",
            "doc": "Star size."
          },
          {
            "name": "readOnly",
            "optional": true,
            "type": "boolean",
            "doc": "Render non-interactive."
          },
          {
            "name": "icon",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Custom star icon (defaults to a filled star)."
          },
          {
            "name": "label",
            "optional": true,
            "type": "string",
            "doc": "Accessible label for the group."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Rating } from \"@wizeworks/silicaui-react\";\nimport { Section, Row, LabeledRow } from \"../lib/Section\";\nimport { COLORS, SIZES } from \"../lib/data\";\n\nexport function RatingDemo() {\n    const [stars, setStars] = useState(3);\n\n    return (\n        <>\n            <Section title=\"Colors (read-only)\">\n                <Row>\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Rating key={color} color={color} defaultValue={4} readOnly />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex flex-col gap-2\">\n                    {SIZES.map((size) => (\n                        <Rating key={size} color=\"warning\" size={size} defaultValue={3} readOnly />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · rate this product\">\n                <LabeledRow label={`You rated this ${stars} of 5 stars`}>\n                    <Rating color=\"warning\" value={stars} onValueChange={setStars} />\n                </LabeledRow>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "SearchInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/search-input.tsx",
    "description": "Silica SearchInput — an `Input` with a leading search icon and a trailing clear button that appears once there's a value. Controlled via `value`/`onChange` (or `onValueChange`) like a native input, or uncontrolled via `defaultValue`.",
    "props": [
      {
        "name": "SearchInputProps",
        "extends": "extends VoidElementProps<\n    Omit<\n      React.InputHTMLAttributes<HTMLInputElement>,\n      \"size\" | \"color\" | \"type\"\n    >\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SearchInputColor",
            "doc": "Accent color; maps to `input-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SearchInputSize",
            "doc": "Default `md`. Matches same-size Button/Input heights."
          },
          {
            "name": "clearable",
            "optional": true,
            "type": "boolean",
            "doc": "Show the trailing clear (×) button once there's a value. Default `true`."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string) => void",
            "doc": "Fires with the next string on every keystroke and on clear."
          },
          {
            "name": "onClear",
            "optional": true,
            "type": "() => void",
            "doc": "Fires when the clear (×) button is pressed."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { SearchInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function SearchInputDemo() {\n    const [query, setQuery] = useState(\"\");\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-sm\">\n                    <SearchInput placeholder=\"Search…\" />\n                    <SearchInput color=\"primary\" placeholder=\"Search…\" defaultValue=\"silica\" />\n                    <SearchInput disabled placeholder=\"Search…\" defaultValue=\"disabled\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"max-w-sm\">\n                    {SIZES.map((size) => (\n                        <SearchInput key={size} size={size} placeholder={size} defaultValue={size} />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Controlled\">\n                <Stack className=\"max-w-sm\">\n                    <SearchInput\n                        value={query}\n                        onValueChange={setQuery}\n                        placeholder=\"Search components…\"\n                    />\n                    <p className=\"text-xs opacity-60\">\n                        {query ? `Searching for \"${query}\"` : \"Type to search, × to clear\"}\n                    </p>\n                </Stack>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Select",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/select.tsx",
    "description": "Silica Select — a fully-styled, keyboard-driven listbox (Base UI: typeahead, roving focus, portalled popup, optional multi-select). The trigger matches `NativeSelect` pixel-for-pixel; reach for `NativeSelect` only when you need a bare platform `<select>`. // items-driven (auto-renders options, powers the trigger label): <Select items={{ react: \"React\", vue: \"Vue\", svelte: \"Svelte\" }} value={fw} onValueChange={setFw} placeholder=\"Framework\" color=\"primary\" /> // composable: <Select value={fw} onValueChange={setFw} items={labels} placeholder=\"Framework\"> <SelectGroup> <SelectGroupLabel>Frontend</SelectGroupLabel> <SelectItem value=\"react\">React</SelectItem> <SelectItem value=\"vue\">Vue</SelectItem> </SelectGroup> </Select>",
    "props": [
      {
        "name": "SelectItemProps",
        "extends": "extends Omit<Styled<typeof BaseSelect.Item>, \"children\">",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "unknown",
            "doc": "The value stored when this item is chosen."
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          }
        ]
      },
      {
        "name": "SelectProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "unknown",
            "doc": "Controlled value (array when `multiple`)."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "unknown",
            "doc": "Uncontrolled initial value."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: unknown, eventDetails?: unknown) => void",
            "doc": "Fires with the newly-selected value."
          },
          {
            "name": "multiple",
            "optional": true,
            "type": "boolean",
            "doc": "Allow selecting multiple items (value becomes an array)."
          },
          {
            "name": "items",
            "optional": true,
            "type": "SelectItems",
            "doc": "Value→label map used to render the trigger's selected label (and, if no children are given, to auto-render the options). A record (`{value: label}`) or an array (`[{ value, label }]`)."
          },
          {
            "name": "name",
            "optional": true,
            "type": "string",
            "doc": "Field name for form submission."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "required",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "readOnly",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Shown on the trigger while nothing is selected."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SelectColor",
            "doc": "Accent for the trigger border + focus ring (shares NativeSelect colors)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SelectSize",
            "doc": "Trigger height; matches same-size Inputs/Buttons."
          },
          {
            "name": "side",
            "optional": true,
            "type": "SelectSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "SelectAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "alignItemWithTrigger",
            "optional": true,
            "type": "boolean",
            "doc": "Overlay the selected item on the trigger (native-select style). Default false."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Class for the trigger button."
          },
          {
            "name": "popupClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the popup surface."
          },
          {
            "name": "popupProps",
            "optional": true,
            "type": "React.ComponentProps<typeof BaseSelect.Popup> & {\n    [key: `data-${string}`]: string;\n  }",
            "doc": "Extra props spread onto the popup surface. The popup renders in a PORTAL at document.body, so when the Select lives inside a scoped `[data-theme]` island pass `popupProps={{ \"data-theme\": \"…\" }}` to re-establish the theme tokens (custom props inherit through the DOM, not the portal boundary)."
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": "Accessible name when there's no associated visible label."
          },
          {
            "name": "\"aria-labelledby\"",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "`SelectItem`/`SelectGroup`/`SelectSeparator`s. Omit to auto-render `items`."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import { NativeSelect } from \"@wizeworks/silicaui-react\";\nimport { Section, Row, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function SelectDemo() {\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-md\">\n                    <NativeSelect defaultValue=\"\">\n                        <option value=\"\" disabled>\n                            Pick a framework…\n                        </option>\n                        <option>React</option>\n                        <option>Svelte</option>\n                        <option>Vue</option>\n                        <option>Solid</option>\n                    </NativeSelect>\n                    <NativeSelect color=\"primary\" defaultValue=\"React\">\n                        <option>React</option>\n                        <option>Svelte</option>\n                        <option>Vue</option>\n                    </NativeSelect>\n                    <NativeSelect color=\"success\" defaultValue=\"React\">\n                        <option>React</option>\n                        <option>Svelte</option>\n                    </NativeSelect>\n                    <NativeSelect color=\"error\" defaultValue=\"React\">\n                        <option>React</option>\n                        <option>Svelte</option>\n                    </NativeSelect>\n                    <NativeSelect disabled defaultValue=\"React\">\n                        <option>React</option>\n                    </NativeSelect>\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <NativeSelect key={size} size={size} defaultValue={size}>\n                            <option>{size}</option>\n                        </NativeSelect>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · shipping region\">\n                <div className=\"grid max-w-sm gap-3 rounded-box border border-base-300 bg-base-100 p-5 shadow-sm\">\n                    <label className=\"flex flex-col gap-1.5 text-sm\">\n                        Country\n                        <NativeSelect color=\"primary\" defaultValue=\"US\">\n                            <option value=\"US\">United States</option>\n                            <option value=\"CA\">Canada</option>\n                            <option value=\"MX\">Mexico</option>\n                            <option value=\"UK\">United Kingdom</option>\n                        </NativeSelect>\n                    </label>\n                    <label className=\"flex flex-col gap-1.5 text-sm\">\n                        Shipping speed\n                        <NativeSelect defaultValue=\"standard\">\n                            <option value=\"standard\">Standard (5–7 days)</option>\n                            <option value=\"express\">Express (2–3 days)</option>\n                            <option value=\"overnight\">Overnight</option>\n                        </NativeSelect>\n                    </label>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "SelectionList",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/selection-list.tsx",
    "description": "Silica SelectionList — a selectable list of rows (single- or multi-select), each with a leading `Checkbox`/`Radio` indicator that mirrors row state. Full keyboard support: ↑/↓ move focus, Home/End jump, Enter/Space toggles the focused row (roving tabindex, ARIA `listbox`/`option` pattern). <SelectionList items={[{ id: \"a\", label: \"Alpha\" }, { id: \"b\", label: \"Beta\" }]} multiple defaultValue={[\"a\"]} onValueChange={setSelected} />",
    "props": [
      {
        "name": "SelectionListProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLUListElement>, \"onSelect\" | \"defaultValue\">",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "SelectionListItem[]",
            "doc": "The row data."
          },
          {
            "name": "multiple",
            "optional": true,
            "type": "boolean",
            "doc": "Allow more than one row selected at once. Default `false` (single-select)."
          },
          {
            "name": "value",
            "optional": true,
            "type": "string[]",
            "doc": "Controlled array of selected ids."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string[]",
            "doc": "Uncontrolled initial selected ids."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: string[]) => void",
            "doc": "Fires with the new array of selected ids."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { SelectionList } from \"@wizeworks/silicaui-react\";\nimport type { SelectionListItem } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst PlanIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n        <path d=\"M3 9h18\" />\n    </svg>\n);\n\nconst PLANS: SelectionListItem[] = [\n    { id: \"free\", label: \"Free\", description: \"For trying things out\", icon: PlanIcon },\n    { id: \"pro\", label: \"Pro\", description: \"For growing teams\", icon: PlanIcon },\n    { id: \"enterprise\", label: \"Enterprise\", description: \"Custom limits & support\", icon: PlanIcon },\n];\n\nconst NOTIFICATIONS: SelectionListItem[] = [\n    { id: \"email\", label: \"Email\", description: \"Order + shipping updates\" },\n    { id: \"sms\", label: \"SMS\", description: \"Delivery alerts only\" },\n    { id: \"push\", label: \"Push\", description: \"Real-time on this device\" },\n    { id: \"digest\", label: \"Weekly digest\", description: \"Coming soon\", disabled: true },\n];\n\nexport function SelectionListDemo() {\n    const [plan, setPlan] = useState<string[]>([\"pro\"]);\n    const [channels, setChannels] = useState<string[]>([\"email\", \"push\"]);\n\n    return (\n        <>\n            <Section title=\"Real use · single-select plan picker\">\n                <Row>\n                    <SelectionList\n                        items={PLANS}\n                        value={plan}\n                        onValueChange={setPlan}\n                        className=\"w-72\"\n                    />\n                </Row>\n            </Section>\n\n            <Section title=\"Multi-select · notification channels\">\n                <Row>\n                    <SelectionList\n                        items={NOTIFICATIONS}\n                        multiple\n                        value={channels}\n                        onValueChange={setChannels}\n                        className=\"w-72\"\n                    />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Slider",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/slider.tsx",
    "description": "Silica Slider — a rich range input (Base UI behavior). Pass a number for a single thumb, or a tuple for a two-thumb range selection; the number of thumbs follows the shape of `value`/`defaultValue`. <Slider defaultValue={40} color=\"primary\" showValue /> <Slider defaultValue={[20, 60]} min={0} max={100} step={5} /> <Slider orientation=\"vertical\" defaultValue={50} />",
    "props": [
      {
        "name": "SliderProps",
        "extends": "extends Omit<Styled<typeof BaseSlider.Root>, \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent for the filled track + thumb(s)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SliderSize",
            "doc": "Rail thickness + thumb diameter."
          },
          {
            "name": "showValue",
            "optional": true,
            "type": "boolean",
            "doc": "Show a live numeric readout beside the track."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Slider } from \"@wizeworks/silicaui-react\";\nimport { Section, LabeledRow } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function SliderDemo() {\n    const [brightness, setBrightness] = useState(65);\n    const [range, setRange] = useState<number[]>([25, 75]);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"flex max-w-md flex-col gap-5\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Slider key={color} color={color} defaultValue={55} />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex max-w-md flex-col gap-5\">\n                    {([\"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <Slider key={size} color=\"primary\" size={size} defaultValue={55} />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · brightness + a two-thumb range\">\n                <div className=\"flex max-w-md flex-col gap-6\">\n                    <LabeledRow label={`Brightness · ${brightness}%`}>\n                        <Slider\n                            color=\"brand\"\n                            value={brightness}\n                            onValueChange={(v) => setBrightness(v as number)}\n                            showValue={false}\n                        />\n                    </LabeledRow>\n                    <LabeledRow label={`Budget · $${range[0]} – $${range[1]}`}>\n                        <Slider\n                            color=\"success\"\n                            value={range}\n                            onValueChange={(v) => setRange(v as number[])}\n                        />\n                    </LabeledRow>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Switch",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/switch.tsx",
    "description": "Silica Switch — an accessible on/off toggle (Base UI: `role=\"switch\"` with a hidden real input, so it submits in a form and pairs with `Field`). The CSS cousin `Toggle` is a bare restyled checkbox; reach for `Switch` when you want proper switch semantics or form integration. <Switch defaultChecked color=\"success\" /> <Switch checked={on} onCheckedChange={setOn} />",
    "props": [
      {
        "name": "SwitchProps",
        "extends": "extends Omit<Styled<typeof BaseSwitch.Root>, \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent for the checked track."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Track height (width follows at 1.75×)."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Switch } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nconst SETTINGS = [\n    { key: \"push\", label: \"Push notifications\", defaultOn: true },\n    { key: \"email\", label: \"Email digest\", defaultOn: true },\n    { key: \"sms\", label: \"SMS alerts\", defaultOn: false },\n];\n\nexport function SwitchDemo() {\n    const [on, setOn] = useState<Record<string, boolean>>({\n        push: true,\n        email: true,\n        sms: false,\n    });\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Row>\n                    <Switch defaultChecked />\n                    <Switch color=\"primary\" defaultChecked />\n                    <Switch color=\"success\" defaultChecked />\n                    <Switch color=\"warning\" defaultChecked />\n                    <Switch color=\"error\" defaultChecked />\n                    <Switch color=\"brand\" defaultChecked />\n                    <Switch disabled />\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.filter((s) => s !== \"xl\").map((size) => (\n                        <Switch key={size} color=\"primary\" size={size} defaultChecked />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · notification settings\">\n                <div className=\"flex max-w-sm flex-col gap-3 rounded-box border border-base-300 bg-base-100 p-4\">\n                    {SETTINGS.map((s) => (\n                        <label key={s.key} className=\"flex items-center justify-between gap-4 text-sm\">\n                            {s.label}\n                            <Switch\n                                color=\"primary\"\n                                checked={on[s.key]}\n                                onCheckedChange={(v) => setOn((p) => ({ ...p, [s.key]: v }))}\n                            />\n                        </label>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "TagInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/tag-input.tsx",
    "description": "A chip-based multi-value text field — tags for segments, recipients, categories, and the like. Type and press Enter (or comma) to add; Backspace on an empty field removes the last tag. Controlled via `value`/`onValueChange` or uncontrolled via `defaultValue`.",
    "props": [
      {
        "name": "TagInputProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"color\">",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string[]",
            "doc": "Controlled tag list."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string[]",
            "doc": "Uncontrolled initial tags."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(tags: string[]) => void",
            "doc": "Called with the next tag list whenever it changes."
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": "Placeholder shown in the text field when there are no tags."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable the whole control."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Chip + focus-ring accent color."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TagInputSize",
            "doc": "Height/type scale. Default `\"md\"`."
          },
          {
            "name": "separators",
            "optional": true,
            "type": "string[]",
            "doc": "Keys that commit the current text as a tag. Default `[\"Enter\", \",\"]`."
          },
          {
            "name": "dedupe",
            "optional": true,
            "type": "boolean",
            "doc": "Reject duplicate tags. Default `true`."
          },
          {
            "name": "max",
            "optional": true,
            "type": "number",
            "doc": "Maximum number of tags."
          },
          {
            "name": "addOnBlur",
            "optional": true,
            "type": "boolean",
            "doc": "Commit any pending text when the field loses focus. Default `true`."
          },
          {
            "name": "inputProps",
            "optional": true,
            "type": "React.InputHTMLAttributes<HTMLInputElement>",
            "doc": "Extra props for the inner `<input>`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { TagInput } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function TagInputDemo() {\n    const [tags, setTags] = useState<string[]>([\"design\", \"ui\", \"tokens\"]);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-md\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <TagInput\n                            key={color}\n                            color={color}\n                            defaultValue={[color]}\n                            placeholder=\"Add a tag…\"\n                        />\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Real use · post tags (max 6, dedupe on)\">\n                <div className=\"flex max-w-md flex-col gap-2\">\n                    <TagInput\n                        color=\"primary\"\n                        value={tags}\n                        onValueChange={setTags}\n                        placeholder=\"Press Enter or , to add\"\n                        max={6}\n                    />\n                    <p className=\"text-xs opacity-60\">\n                        {tags.length} / 6 tags — {tags.join(\", \") || \"none yet\"}\n                    </p>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Textarea",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/textarea.tsx",
    "description": "Silica Textarea — a multi-line text field. Thin, presentational wrapper around a native `<textarea>`, so all native attributes (`value`, `rows`, `onChange`, `placeholder`, `disabled`, …) pass straight through.",
    "props": [
      {
        "name": "TextareaProps",
        "extends": "extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "TextareaColor",
            "doc": "Accent color; maps to `textarea-<color>` (border + focus ring)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TextareaSize",
            "doc": "Default `md`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Textarea } from \"@wizeworks/silicaui-react\";\nimport { Section, Row, Stack } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function TextareaDemo() {\n    const [note, setNote] = useState(\n        \"Shipping was fast and the packaging held up well.\",\n    );\n    const max = 200;\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Stack className=\"max-w-md\">\n                    <Textarea placeholder=\"Default textarea — drag the corner to resize\" />\n                    <Textarea\n                        color=\"primary\"\n                        defaultValue=\"Primary accent — border and focus ring.\"\n                    />\n                    <Textarea color=\"success\" placeholder=\"Success\" />\n                    <Textarea color=\"error\" placeholder=\"Error\" />\n                    <Textarea color=\"brand\" placeholder=\"Brand accent\" rows={2} />\n                    <Textarea disabled defaultValue=\"Disabled\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <Textarea key={size} size={size} placeholder={size} rows={2} />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · review with a live character count\">\n                <div className=\"max-w-sm rounded-box border border-base-300 bg-base-100 p-5 shadow-sm\">\n                    <div className=\"flex flex-col gap-1.5\">\n                        <label className=\"text-sm font-medium\">Your review</label>\n                        <Textarea\n                            color={note.length > max ? \"error\" : \"primary\"}\n                            value={note}\n                            onChange={(e) => setNote(e.target.value)}\n                            rows={3}\n                        />\n                        <span\n                            className={`self-end text-xs ${\n                                note.length > max ? \"text-error\" : \"opacity-60\"\n                            }`}\n                        >\n                            {note.length} / {max}\n                        </span>\n                    </div>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "TimeInput",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/time-input.tsx",
    "description": "Silica TimeInput — a typeable, segmented time field (hour : minute [: second] [AM/PM]). Digits auto-advance; Up/Down steps the focused segment (and cycles AM/PM); pasting \"14:30\", \"2:30 PM\", or \"2:30:15 pm\" autofills every segment — converting AM/PM to the field's own `hourCycle` as needed. <TimeInput value={time} onValueChange={setTime} /> <TimeInput hourCycle={24} showSeconds />",
    "props": [
      {
        "name": "TimeInputProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "TimeValue | null",
            "doc": "Controlled value. `null` clears the field."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "TimeValue | null",
            "doc": ""
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(value: TimeValue | null) => void",
            "doc": "Fires once hour+minute (+AM/PM, in 12h mode) are filled; `null` while incomplete/cleared."
          },
          {
            "name": "hourCycle",
            "optional": true,
            "type": "12 | 24",
            "doc": "`12` or `24`. Default: derived from `locale`."
          },
          {
            "name": "showSeconds",
            "optional": true,
            "type": "boolean",
            "doc": "Add a seconds segment. Default `false`."
          },
          {
            "name": "locale",
            "optional": true,
            "type": "string",
            "doc": "BCP-47 locale — drives the default `hourCycle` when not set explicitly."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "TimeInputColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "TimeInputSize",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "id",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { TimeInput, type TimeValue } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function TimeInputDemo() {\n    const [time, setTime] = useState<TimeValue | null>({ hour: 14, minute: 30 });\n\n    return (\n        <>\n            <Section title=\"Real use · 12h field (type digits, arrows, or paste 'e.g. 2:30 PM')\">\n                <TimeInput value={time} onValueChange={setTime} color=\"primary\" />\n                <p className=\"mt-2 text-sm opacity-70\">\n                    {time ? `${String(time.hour).padStart(2, \"0\")}:${String(time.minute).padStart(2, \"0\")} (24h)` : \"No time\"}\n                </p>\n            </Section>\n\n            <Section title=\"24h + seconds\">\n                <TimeInput hourCycle={24} showSeconds defaultValue={{ hour: 14, minute: 30, second: 45 }} />\n            </Section>\n\n            <Section title=\"Sizes / disabled\">\n                <Row>\n                    <TimeInput size=\"sm\" defaultValue={{ hour: 9, minute: 0 }} />\n                    <TimeInput size=\"md\" defaultValue={{ hour: 9, minute: 0 }} />\n                    <TimeInput size=\"lg\" defaultValue={{ hour: 9, minute: 0 }} />\n                    <TimeInput disabled defaultValue={{ hour: 9, minute: 0 }} />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Toggle",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/toggle.tsx",
    "description": "Silica Toggle — a restyled native `<input type=\"checkbox\">` presented as a switch. Adds `role=\"switch\"` for assistive tech; all native attributes (`checked`, `onChange`, `disabled`, …) pass through. <Toggle defaultChecked>Email notifications</Toggle>",
    "props": [
      {
        "name": "ToggleProps",
        "extends": "extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    \"size\" | \"color\" | \"type\"\n  >",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color; maps to `toggle-<color>` (checked track fill)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default `md`."
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Caption. Wraps the control in a `<label>` so the text is a click target."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Toggle } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { ColorVariantSizeGrid } from \"../lib/ColorGrid\";\n\nexport function ToggleDemo() {\n    const [wifi, setWifi] = useState(true);\n\n    return (\n        <>\n            <ColorVariantSizeGrid\n                Component={Toggle}\n                render={({ color, size }) => (\n                    <label className=\"flex items-center gap-2 text-sm\">\n                        <Toggle color={color} size={size} defaultChecked />\n                        {color ?? size}\n                    </label>\n                )}\n            />\n\n            <Section title=\"Real use · Wi-Fi setting\">\n                <label className=\"flex items-center gap-2 text-sm\">\n                    <Toggle\n                        color=\"primary\"\n                        checked={wifi}\n                        onChange={(e) => setWifi(e.target.checked)}\n                    />\n                    Wi-Fi is {wifi ? \"on\" : \"off\"}\n                </label>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "ToggleGroup",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/toggle-group.tsx",
    "description": "Silica ToggleGroup — a segmented control (single- or multi-select). Behavior from Base UI (roving focus, pressed state); look from Silica. This is the button-based control — for an on/off switch use `Toggle`. <ToggleGroup defaultValue={[\"list\"]}> <ToggleGroupItem value=\"list\">List</ToggleGroupItem> <ToggleGroupItem value=\"grid\">Grid</ToggleGroupItem> </ToggleGroup>",
    "props": [
      {
        "name": "ToggleGroupProps",
        "members": []
      },
      {
        "name": "ToggleGroupItemProps",
        "members": []
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { ToggleGroup, ToggleGroupItem } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function ToggleGroupDemo() {\n    const [view, setView] = useState<string[]>([\"grid\"]);\n    const [format, setFormat] = useState<string[]>([\"bold\"]);\n\n    return (\n        <>\n            <Section title=\"Real use · single-select view switcher\">\n                <ToggleGroup value={view} onValueChange={setView}>\n                    <ToggleGroupItem value=\"list\">List</ToggleGroupItem>\n                    <ToggleGroupItem value=\"grid\">Grid</ToggleGroupItem>\n                    <ToggleGroupItem value=\"board\">Board</ToggleGroupItem>\n                </ToggleGroup>\n            </Section>\n\n            <Section title=\"Multi-select text formatting\">\n                <ToggleGroup multiple value={format} onValueChange={setFormat}>\n                    <ToggleGroupItem value=\"bold\">B</ToggleGroupItem>\n                    <ToggleGroupItem value=\"italic\">I</ToggleGroupItem>\n                    <ToggleGroupItem value=\"underline\">U</ToggleGroupItem>\n                </ToggleGroup>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex flex-wrap items-center gap-4\">\n                    {([\"xs\", \"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <ToggleGroup key={size} size={size} defaultValue={[\"grid\"]}>\n                            <ToggleGroupItem value=\"list\">List</ToggleGroupItem>\n                            <ToggleGroupItem value=\"grid\">Grid</ToggleGroupItem>\n                        </ToggleGroup>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Colored active pill\">\n                <div className=\"flex flex-wrap items-center gap-4\">\n                    {([\"primary\", \"secondary\", \"accent\", \"success\"] as const).map((color) => (\n                        <ToggleGroup key={color} color={color} defaultValue={[\"grid\"]}>\n                            <ToggleGroupItem value=\"list\">List</ToggleGroupItem>\n                            <ToggleGroupItem value=\"grid\">Grid</ToggleGroupItem>\n                        </ToggleGroup>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Validator",
    "package": "@wizeworks/silicaui-react",
    "category": "Data input",
    "sourceFile": "silicaui-react/src/validator.tsx",
    "description": "Silica Validator — recolors its child control by validity. <Validator><Input required type=\"email\" /></Validator> <ValidatorHint>Enter a valid email address.</ValidatorHint> Adds the `validator` class to the child so the field flips to error/success on `:user-invalid` / `:user-valid` (after the user interacts) or on an explicit `aria-invalid`. For the hint to reveal itself, render `<ValidatorHint>` as the immediate next sibling of the control.",
    "props": [
      {
        "name": "ValidatorProps",
        "members": [
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement<{ className?: string }>",
            "doc": "A single form control to apply validity-driven coloring to."
          }
        ]
      },
      {
        "name": "ValidatorHintProps",
        "extends": "extends React.HTMLAttributes<HTMLParagraphElement>",
        "members": []
      }
    ],
    "usageExample": "import { Validator, ValidatorHint, Input } from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nexport function ValidatorDemo() {\n    return (\n        <Section title=\"Real use · native validity styling (type to see it flip)\">\n            <Stack className=\"max-w-sm\">\n                <Validator>\n                    <Input required type=\"email\" placeholder=\"you@example.com\" />\n                </Validator>\n                <ValidatorHint>Enter a valid email address.</ValidatorHint>\n\n                <Validator>\n                    <Input required minLength={8} type=\"password\" placeholder=\"Password (min 8 chars)\" />\n                </Validator>\n                <ValidatorHint>Must be at least 8 characters.</ValidatorHint>\n            </Stack>\n        </Section>\n    );\n}"
  },
  {
    "name": "Breadcrumb",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/breadcrumb.tsx",
    "description": "Silica Breadcrumb — a navigation trail. Pass `<li>` items as children; the chevron separators are drawn by CSS, so no separator markup is needed. <Breadcrumb> <li><a href=\"/\">Home</a></li> <li><a href=\"/projects\">Projects</a></li> <li><span aria-current=\"page\">Silica</span></li> </Breadcrumb>",
    "props": [
      {
        "name": "BreadcrumbProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": []
      }
    ],
    "usageExample": "import { Breadcrumb } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function BreadcrumbDemo() {\n    return (\n        <Section title=\"Real use · navigation trail\">\n            <Breadcrumb>\n                <li>\n                    <a href=\"#\">Home</a>\n                </li>\n                <li>\n                    <a href=\"#\">Projects</a>\n                </li>\n                <li>\n                    <a href=\"#\">Silica UI</a>\n                </li>\n                <li>\n                    <span aria-current=\"page\">Breadcrumb</span>\n                </li>\n            </Breadcrumb>\n        </Section>\n    );\n}"
  },
  {
    "name": "Dock",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/dock.tsx",
    "description": "Silica Dock — a bottom navigation bar of icon+label items. <Dock className=\"fixed inset-x-0 bottom-0\"> <DockItem active><HomeIcon /><DockLabel>Home</DockLabel></DockItem> <DockItem><SearchIcon /><DockLabel>Search</DockLabel></DockItem> <DockItem><UserIcon /><DockLabel>Profile</DockLabel></DockItem> </Dock>",
    "props": [
      {
        "name": "DockProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "DockColor",
            "doc": "Accent color for the active item. Default primary."
          }
        ]
      },
      {
        "name": "DockItemProps",
        "extends": "extends React.ButtonHTMLAttributes<HTMLButtonElement>",
        "members": [
          {
            "name": "active",
            "optional": true,
            "type": "boolean",
            "doc": "Highlight this item as the current destination."
          }
        ]
      },
      {
        "name": "DockLabelProps",
        "members": []
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Dock, DockItem, DockLabel } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nfunction HomeIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"m3 11 9-8 9 8M5 10v10h5v-6h4v6h5V10\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n        </svg>\n    );\n}\nfunction SearchIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <circle cx=\"11\" cy=\"11\" r=\"7\" />\n            <path d=\"m21 21-4.3-4.3\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction UserIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n            <circle cx=\"12\" cy=\"8\" r=\"4\" />\n            <path d=\"M4 20c0-4.4 3.6-7 8-7s8 2.6 8 7Z\" />\n        </svg>\n    );\n}\n\nexport function DockDemo() {\n    const [tab, setTab] = useState(\"home\");\n\n    return (\n        <>\n            <Section title=\"Colors (active item accent)\">\n                <div className=\"flex flex-col gap-4\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Dock key={color} color={color} className=\"max-w-xs rounded-box\">\n                            <DockItem active>\n                                <HomeIcon />\n                                <DockLabel>Home</DockLabel>\n                            </DockItem>\n                            <DockItem>\n                                <SearchIcon />\n                                <DockLabel>Search</DockLabel>\n                            </DockItem>\n                            <DockItem>\n                                <UserIcon />\n                                <DockLabel>Profile</DockLabel>\n                            </DockItem>\n                        </Dock>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · interactive bottom nav\">\n                <Dock color=\"primary\" className=\"max-w-xs rounded-box\">\n                    <DockItem active={tab === \"home\"} onClick={() => setTab(\"home\")}>\n                        <HomeIcon />\n                        <DockLabel>Home</DockLabel>\n                    </DockItem>\n                    <DockItem active={tab === \"search\"} onClick={() => setTab(\"search\")}>\n                        <SearchIcon />\n                        <DockLabel>Search</DockLabel>\n                    </DockItem>\n                    <DockItem active={tab === \"profile\"} onClick={() => setTab(\"profile\")}>\n                        <UserIcon />\n                        <DockLabel>Profile</DockLabel>\n                    </DockItem>\n                </Dock>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Link",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/link.tsx",
    "description": "Silica Link — a styled inline anchor. <Link href=\"/docs\">Docs</Link> <Link href=\"/pricing\" color=\"primary\">Pricing</Link> <Link href=\"#\" hover>Underlines on hover</Link>",
    "props": [
      {
        "name": "LinkProps",
        "extends": "extends React.AnchorHTMLAttributes<HTMLAnchorElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "LinkColor",
            "doc": "Accent color; maps to `link-<color>`. Defaults to the surrounding text color."
          },
          {
            "name": "hover",
            "optional": true,
            "type": "boolean",
            "doc": "Show the underline only on hover / focus."
          }
        ]
      }
    ],
    "usageExample": "import { Link } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function LinkDemo() {\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Row>\n                    {COLORS.map((color) => (\n                        <Link key={color} href=\"#\" color={color}>\n                            {color}\n                        </Link>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Hover-only underline\">\n                <Row>\n                    <Link href=\"#\" color=\"primary\" hover>\n                        Underlines on hover\n                    </Link>\n                    <Link href=\"#\" color=\"brand\" hover>\n                        Also brand\n                    </Link>\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · inline in a sentence\">\n                <p className=\"max-w-md opacity-80\">\n                    By continuing you agree to our{\" \"}\n                    <Link href=\"#\" color=\"primary\">\n                        Terms of Service\n                    </Link>{\" \"}\n                    and{\" \"}\n                    <Link href=\"#\" color=\"primary\" hover>\n                        Privacy Policy\n                    </Link>\n                    .\n                </p>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Menu",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/menu.tsx",
    "description": "Silica Menu — a styled list of links/actions. <Menu> <MenuTitle>Workspace</MenuTitle> <MenuItem><a href=\"/\" aria-current=\"page\">Overview</a></MenuItem> <MenuItem><a href=\"/team\">Team</a></MenuItem> <MenuItem><button type=\"button\">Sign out</button></MenuItem> </Menu>",
    "props": [
      {
        "name": "MenuProps",
        "extends": "extends React.HTMLAttributes<HTMLUListElement>",
        "members": []
      }
    ],
    "usageExample": "import { Menu, MenuItem, MenuTitle } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function MenuDemo() {\n    return (\n        <Section title=\"Real use · sidebar navigation\">\n            <Menu className=\"max-w-xs\">\n                <MenuTitle>Workspace</MenuTitle>\n                <MenuItem>\n                    <a href=\"#\" aria-current=\"page\">\n                        Overview\n                    </a>\n                </MenuItem>\n                <MenuItem>\n                    <a href=\"#\">Projects</a>\n                </MenuItem>\n                <MenuItem>\n                    <a href=\"#\">Team</a>\n                </MenuItem>\n                <MenuTitle>Account</MenuTitle>\n                <MenuItem>\n                    <a href=\"#\">Settings</a>\n                </MenuItem>\n                <MenuItem>\n                    <button type=\"button\">Sign out</button>\n                </MenuItem>\n            </Menu>\n        </Section>\n    );\n}"
  },
  {
    "name": "Menubar",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/menubar.tsx",
    "description": "Silica Menubar — a bar of menus (File / Edit / View …). Behavior from Base UI (arrow between menus, hover to switch once open, roving focus). Each menu is a `MenubarMenu`; its popup reuses the shared `.dropdown*` surface. <Menubar> <MenubarMenu> <MenubarTrigger>File</MenubarTrigger> <MenubarContent> <MenubarItem>New</MenubarItem> <MenubarSeparator /> <MenubarItem>Exit</MenubarItem> </MenubarContent> </MenubarMenu> </Menubar>",
    "props": [
      {
        "name": "MenubarProps",
        "members": []
      },
      {
        "name": "MenubarTriggerProps",
        "members": []
      },
      {
        "name": "MenubarContentProps",
        "extends": "extends Omit<Styled<typeof BaseMenu.Popup>, \"children\">,\n    PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "MenubarSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "MenubarAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import {\n    Menubar,\n    MenubarMenu,\n    MenubarTrigger,\n    MenubarContent,\n    MenubarItem,\n    MenubarSeparator,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function MenubarDemo() {\n    return (\n        <Section title=\"Real use · desktop-app style menu bar\">\n            <Menubar>\n                <MenubarMenu>\n                    <MenubarTrigger>File</MenubarTrigger>\n                    <MenubarContent>\n                        <MenubarItem>New</MenubarItem>\n                        <MenubarItem>Open…</MenubarItem>\n                        <MenubarSeparator />\n                        <MenubarItem>Exit</MenubarItem>\n                    </MenubarContent>\n                </MenubarMenu>\n                <MenubarMenu>\n                    <MenubarTrigger>Edit</MenubarTrigger>\n                    <MenubarContent>\n                        <MenubarItem>Undo</MenubarItem>\n                        <MenubarItem>Redo</MenubarItem>\n                        <MenubarSeparator />\n                        <MenubarItem>Cut</MenubarItem>\n                        <MenubarItem>Copy</MenubarItem>\n                        <MenubarItem>Paste</MenubarItem>\n                    </MenubarContent>\n                </MenubarMenu>\n                <MenubarMenu>\n                    <MenubarTrigger>View</MenubarTrigger>\n                    <MenubarContent>\n                        <MenubarItem>Zoom in</MenubarItem>\n                        <MenubarItem>Zoom out</MenubarItem>\n                    </MenubarContent>\n                </MenubarMenu>\n            </Menubar>\n        </Section>\n    );\n}"
  },
  {
    "name": "Navbar",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/navbar.tsx",
    "description": "Silica Navbar — a top bar with optional start / center / end slots. <Navbar> <NavbarStart><a className=\"text-lg font-bold\">Silica</a></NavbarStart> <NavbarCenter>…nav links…</NavbarCenter> <NavbarEnd><Button>Sign in</Button></NavbarEnd> </Navbar>",
    "props": [
      {
        "name": "NavbarProps",
        "members": []
      }
    ],
    "usageExample": "import { Navbar, NavbarStart, NavbarCenter, NavbarEnd, Button } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function NavbarDemo() {\n    return (\n        <>\n            <Section title=\"Real use · site header\">\n                <Navbar className=\"rounded-box border border-base-300\">\n                    <NavbarStart>\n                        <span className=\"text-lg font-bold\">◆ Silica</span>\n                    </NavbarStart>\n                    <NavbarCenter className=\"hidden gap-4 text-sm sm:flex\">\n                        <a href=\"#\">Docs</a>\n                        <a href=\"#\">Components</a>\n                        <a href=\"#\">Pricing</a>\n                    </NavbarCenter>\n                    <NavbarEnd>\n                        <Button variant=\"ghost\" color=\"neutral\">\n                            Sign in\n                        </Button>\n                        <Button color=\"primary\">Get started</Button>\n                    </NavbarEnd>\n                </Navbar>\n            </Section>\n\n            <Section title=\"Glass · floating over a hero\">\n                <div\n                    className=\"flex flex-col gap-24 rounded-box p-4\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Navbar className=\"glass\">\n                        <NavbarStart>\n                            <span className=\"text-lg font-bold\">◆ Silica</span>\n                        </NavbarStart>\n                        <NavbarCenter className=\"hidden gap-4 text-sm sm:flex\">\n                            <a href=\"#\">Docs</a>\n                            <a href=\"#\">Components</a>\n                            <a href=\"#\">Pricing</a>\n                        </NavbarCenter>\n                        <NavbarEnd>\n                            <Button variant=\"ghost\" color=\"neutral\">\n                                Sign in\n                            </Button>\n                            <Button color=\"primary\">Get started</Button>\n                        </NavbarEnd>\n                    </Navbar>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "NavigationMenu",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/navigation-menu.tsx",
    "description": "Silica NavigationMenu — a site-nav bar with rich dropdown panels (mega menu). Behavior from Base UI (shared animated viewport that resizes between panels); look from Silica. <NavigationMenu> <NavigationMenuItem> <NavigationMenuTrigger>Products</NavigationMenuTrigger> <NavigationMenuContent> <ul className=\"grid gap-1\">…</ul> </NavigationMenuContent> </NavigationMenuItem> <NavigationMenuItem> <NavigationMenuLink href=\"/pricing\">Pricing</NavigationMenuLink> </NavigationMenuItem> </NavigationMenu>",
    "props": [
      {
        "name": "NavigationMenuProps",
        "extends": "extends Omit<Styled<typeof BaseNav.Root>, \"children\">,\n    PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "NavigationMenuSide",
            "doc": "Preferred side for the dropdown panel. Default `bottom`."
          },
          {
            "name": "align",
            "optional": true,
            "type": "NavigationMenuAlign",
            "doc": "Alignment. Default `center`."
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": "Gap between the bar and the panel, in px. Default `8`."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      },
      {
        "name": "NavigationMenuItemProps",
        "members": []
      },
      {
        "name": "NavigationMenuTriggerProps",
        "members": []
      },
      {
        "name": "NavigationMenuContentProps",
        "members": []
      },
      {
        "name": "NavigationMenuLinkProps",
        "members": []
      }
    ],
    "usageExample": "import {\n    NavigationMenu,\n    NavigationMenuItem,\n    NavigationMenuTrigger,\n    NavigationMenuContent,\n    NavigationMenuLink,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function NavigationMenuDemo() {\n    return (\n        <Section title=\"Real use · site nav with a mega-menu panel\">\n            <NavigationMenu>\n                <NavigationMenuItem>\n                    <NavigationMenuTrigger>Products</NavigationMenuTrigger>\n                    <NavigationMenuContent>\n                        <ul className=\"grid w-80 gap-1 p-2\">\n                            <li>\n                                <a href=\"#\" className=\"block rounded-field p-2 hover:bg-base-200\">\n                                    <div className=\"font-medium\">Components</div>\n                                    <div className=\"text-xs opacity-60\">\n                                        95+ primitives on one token system.\n                                    </div>\n                                </a>\n                            </li>\n                            <li>\n                                <a href=\"#\" className=\"block rounded-field p-2 hover:bg-base-200\">\n                                    <div className=\"font-medium\">Builder</div>\n                                    <div className=\"text-xs opacity-60\">\n                                        Drag-and-drop pages, no code.\n                                    </div>\n                                </a>\n                            </li>\n                        </ul>\n                    </NavigationMenuContent>\n                </NavigationMenuItem>\n                <NavigationMenuItem>\n                    <NavigationMenuLink href=\"#\">Pricing</NavigationMenuLink>\n                </NavigationMenuItem>\n                <NavigationMenuItem>\n                    <NavigationMenuLink href=\"#\">Docs</NavigationMenuLink>\n                </NavigationMenuItem>\n            </NavigationMenu>\n        </Section>\n    );\n}"
  },
  {
    "name": "Outline",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/outline.tsx",
    "description": "Silica Outline — a scroll-spy table of contents, built from scratch (no IntersectionObserver ambiguity — a heading is \"active\" once its top has scrolled past `offset`, the last such heading in document order wins). <Outline items={[{ id: \"install\", label: \"Installation\" }, { id: \"usage\", label: \"Usage\", depth: 1 }]} />",
    "props": [
      {
        "name": "OutlineProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLElement>, \"children\">",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "OutlineItem[]",
            "doc": ""
          },
          {
            "name": "offset",
            "optional": true,
            "type": "number",
            "doc": "Distance in px from the scroll container's top edge that counts as the \"active\" boundary — a heading is current once it's scrolled to here. Default 96 (roughly a sticky header's height)."
          },
          {
            "name": "container",
            "optional": true,
            "type": "React.RefObject<HTMLElement | null>",
            "doc": "Scrollable ancestor to track. Default: the window (a real full-page TOC)."
          },
          {
            "name": "onActiveChange",
            "optional": true,
            "type": "(id: string | null) => void",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useRef } from \"react\";\nimport { Outline } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst SECTIONS = [\n    { id: \"outline-install\", label: \"Installation\", depth: 0 },\n    { id: \"outline-npm\", label: \"Via npm\", depth: 1 },\n    { id: \"outline-cdn\", label: \"Via CDN\", depth: 1 },\n    { id: \"outline-usage\", label: \"Usage\", depth: 0 },\n    { id: \"outline-theming\", label: \"Theming\", depth: 0 },\n    { id: \"outline-tokens\", label: \"Color tokens\", depth: 1 },\n    { id: \"outline-dark\", label: \"Dark mode\", depth: 1 },\n    { id: \"outline-faq\", label: \"FAQ\", depth: 0 },\n];\n\nexport function OutlineDemo() {\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    return (\n        <Section title=\"Real use · scroll-spy docs page (scroll the panel below)\">\n            <div className=\"grid grid-cols-[1fr_12rem] gap-6\">\n                <div\n                    ref={containerRef}\n                    className=\"h-80 overflow-y-auto rounded-box border border-base-300 p-6\"\n                >\n                    {SECTIONS.map((s) => (\n                        <section key={s.id} id={s.id} className=\"mb-10 scroll-mt-4\">\n                            <h3 className=\"mb-2 text-base font-semibold\">{s.label}</h3>\n                            <p className=\"text-sm opacity-70\">\n                                Placeholder copy for the “{s.label}” section — long enough to\n                                make the panel actually scroll so the active link updates as\n                                you go.\n                            </p>\n                        </section>\n                    ))}\n                </div>\n\n                <Outline items={SECTIONS} container={containerRef} offset={24} />\n            </div>\n        </Section>\n    );\n}"
  },
  {
    "name": "OverflowList",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/overflow-list.tsx",
    "description": "Silica OverflowList — a single-row list (avatars, tags, breadcrumbs-like items) that measures the available width and folds whatever doesn't fit into a \"+N\" indicator, instead of wrapping or clipping. Recomputes on resize (`ResizeObserver`), so it adapts as the container's width changes. <OverflowList items={assignees} renderItem={(person) => <Avatar key={person.id} src={person.photo} alt={person.name} />} />",
    "props": [
      {
        "name": "OverflowListProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "T[]",
            "doc": ""
          },
          {
            "name": "renderItem",
            "optional": false,
            "type": "(item: T, index: number) => React.ReactNode",
            "doc": ""
          },
          {
            "name": "renderOverflow",
            "optional": true,
            "type": "(hiddenItems: T[]) => React.ReactNode",
            "doc": "Render the trailing overflow indicator given the items that didn't fit. Default: a \"+N\" badge that opens a popover listing them (via `renderItem`)."
          },
          {
            "name": "gap",
            "optional": true,
            "type": "number",
            "doc": "Gap between items, in px. Default `8`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { OverflowList, Avatar, Badge } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst PEOPLE = [\n    \"Ada Lovelace\",\n    \"Grace Hopper\",\n    \"Alan Turing\",\n    \"Katherine Johnson\",\n    \"Margaret Hamilton\",\n    \"Radia Perlman\",\n    \"Barbara Liskov\",\n    \"Tim Berners-Lee\",\n];\n\nconst TAGS = [\"design-system\", \"accessibility\", \"performance\", \"dark-mode\", \"tokens\", \"typography\", \"motion\"];\n\nexport function OverflowListDemo() {\n    const [width, setWidth] = useState(420);\n\n    return (\n        <>\n            <Section title=\"Real use · assignee avatars, resizable to see the fold point\">\n                <div className=\"flex flex-col gap-3\">\n                    <input\n                        type=\"range\"\n                        min={120}\n                        max={640}\n                        value={width}\n                        onChange={(e) => setWidth(Number(e.target.value))}\n                        className=\"max-w-md\"\n                    />\n                    <div style={{ width }} className=\"rounded-box border border-base-300 p-3\">\n                        <OverflowList\n                            items={PEOPLE}\n                            renderItem={(name) => (\n                                <Avatar key={name} alt={name} color=\"primary\" size=\"sm\">\n                                    {name\n                                        .split(\" \")\n                                        .map((w) => w[0])\n                                        .join(\"\")}\n                                </Avatar>\n                            )}\n                        />\n                    </div>\n                </div>\n            </Section>\n\n            <Section title=\"Tags with custom overflow renderer\">\n                <div className=\"w-80 rounded-box border border-base-300 p-3\">\n                    <OverflowList\n                        items={TAGS}\n                        gap={6}\n                        renderItem={(tag) => (\n                            <Badge key={tag} color=\"neutral\" variant=\"soft\">\n                                {tag}\n                            </Badge>\n                        )}\n                        renderOverflow={(hidden) => (\n                            <Badge color=\"primary\" variant=\"soft\" title={hidden.join(\", \")}>\n                                +{hidden.length} more\n                            </Badge>\n                        )}\n                    />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Pagination",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/pagination.tsx",
    "description": "Silica Pagination — page controls with prev/next and ellipsis. <Pagination page={page} count={12} onValueChange={setPage} color=\"primary\" />",
    "props": [
      {
        "name": "PaginationProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\">",
        "members": [
          {
            "name": "page",
            "optional": false,
            "type": "number",
            "doc": "Current page (1-based)."
          },
          {
            "name": "count",
            "optional": false,
            "type": "number",
            "doc": "Total number of pages."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(page: number) => void",
            "doc": "Called with the new page."
          },
          {
            "name": "onChange",
            "optional": true,
            "type": "(page: number) => void",
            "doc": "@deprecated Use `onValueChange`. `onChange` is reserved for the native DOM handler on components that wrap a real form element; still honored here so this isn't a breaking change."
          },
          {
            "name": "siblingCount",
            "optional": true,
            "type": "number",
            "doc": "Pages shown on each side of the current page. Default 1."
          },
          {
            "name": "boundaryCount",
            "optional": true,
            "type": "number",
            "doc": "Pages shown at the start/end. Default 1."
          },
          {
            "name": "controls",
            "optional": true,
            "type": "boolean",
            "doc": "Show prev/next arrows. Default `true`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "PaginationColor",
            "doc": ""
          },
          {
            "name": "size",
            "optional": true,
            "type": "PaginationSize",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Pagination } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function PaginationDemo() {\n    const [page, setPage] = useState(4);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"flex flex-col gap-3\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Pagination\n                            key={color}\n                            color={color}\n                            page={3}\n                            count={10}\n                            onValueChange={() => {}}\n                        />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex flex-col gap-3\">\n                    {([\"xs\", \"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <Pagination\n                            key={size}\n                            size={size}\n                            color=\"primary\"\n                            page={3}\n                            count={10}\n                            onValueChange={() => {}}\n                        />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · interactive search results\">\n                <div className=\"flex max-w-lg flex-col gap-3\">\n                    <p className=\"text-sm opacity-70\">\n                        Showing page {page} of 12 — 118 results\n                    </p>\n                    <Pagination\n                        color=\"primary\"\n                        page={page}\n                        count={12}\n                        onValueChange={setPage}\n                    />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Sidebar",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/sidebar.tsx",
    "description": "Silica Sidebar — a persistent layout nav panel, distinct from `Drawer` (which overlays content and dismisses). A Sidebar never overlays: it collapses IN PLACE to a narrow icon rail. <Sidebar> <SidebarHeader> <SidebarHeaderBrand><Wordmark>Acme</Wordmark></SidebarHeaderBrand> <SidebarTrigger /> </SidebarHeader> <SidebarContent> <SidebarGroup> <SidebarGroupLabel>Workspace</SidebarGroupLabel> <SidebarItem icon={<HomeIcon />} active>Dashboard</SidebarItem> <SidebarItem icon={<SettingsIcon />}>Settings</SidebarItem> </SidebarGroup> </SidebarContent> </Sidebar>",
    "props": [
      {
        "name": "SidebarProviderProps",
        "members": [
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "collapsed",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled collapsed state."
          },
          {
            "name": "defaultCollapsed",
            "optional": true,
            "type": "boolean",
            "doc": "Uncontrolled initial collapsed state. Default `false`."
          },
          {
            "name": "onCollapsedChange",
            "optional": true,
            "type": "(collapsed: boolean) => void",
            "doc": ""
          }
        ]
      },
      {
        "name": "SidebarProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "side",
            "optional": true,
            "type": "SidebarSide",
            "doc": "Which edge the panel sits on. Default `left`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color for the active `SidebarItem`; maps to `sidebar-<color>`."
          },
          {
            "name": "collapsed",
            "optional": true,
            "type": "boolean",
            "doc": "Explicit collapsed override. When omitted, reads the ancestor `SidebarProvider` (defaults to expanded if neither is present)."
          }
        ]
      },
      {
        "name": "SidebarHeaderProps",
        "members": []
      },
      {
        "name": "SidebarHeaderBrandProps",
        "members": []
      },
      {
        "name": "SidebarContentProps",
        "members": []
      },
      {
        "name": "SidebarFooterProps",
        "members": []
      },
      {
        "name": "SidebarGroupProps",
        "members": []
      },
      {
        "name": "SidebarGroupLabelProps",
        "members": []
      },
      {
        "name": "SidebarItemProps",
        "extends": "extends Omit<React.AllHTMLAttributes<HTMLElement>, \"color\" | \"as\">",
        "members": [
          {
            "name": "icon",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Leading icon."
          },
          {
            "name": "trailing",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Trailing content (badge, chevron); hidden when collapsed."
          },
          {
            "name": "active",
            "optional": true,
            "type": "boolean",
            "doc": "Highlights the row with the sidebar's accent color."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Render as a different element, typically `\"a\"` (or a router's `Link`) for real navigation — `AllHTMLAttributes` (not the plain `HTMLAttributes` most components here use) is deliberate so `href`/`target`/etc. type-check when doing so."
          }
        ]
      },
      {
        "name": "SidebarTriggerProps",
        "extends": "extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\">",
        "members": []
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    SidebarProvider,\n    Sidebar,\n    SidebarHeader,\n    SidebarHeaderBrand,\n    SidebarContent,\n    SidebarFooter,\n    SidebarGroup,\n    SidebarGroupLabel,\n    SidebarItem,\n    SidebarTrigger,\n    Wordmark,\n    Avatar,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst HomeIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M3 12 12 3l9 9\" /> <path d=\"M5 10v10h14V10\" />\n    </svg>\n);\nconst SearchIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <circle cx=\"11\" cy=\"11\" r=\"8\" /> <path d=\"m21 21-4.3-4.3\" />\n    </svg>\n);\nconst UsersIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" /> <circle cx=\"9\" cy=\"7\" r=\"4\" />\n        <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" /> <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n    </svg>\n);\nconst SettingsIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M14 17H5\" /> <path d=\"M19 7h-9\" /> <circle cx=\"17\" cy=\"17\" r=\"3\" /> <circle cx=\"7\" cy=\"7\" r=\"3\" />\n    </svg>\n);\n\nfunction AppShell() {\n    const [active, setActive] = useState(\"dashboard\");\n\n    return (\n        <div className=\"flex h-[26rem] w-full max-w-2xl overflow-hidden rounded-box border border-base-200\">\n            <Sidebar>\n                <SidebarHeader>\n                    <SidebarHeaderBrand>\n                        <Wordmark size=\"sm\" color=\"primary\">Acme</Wordmark>\n                    </SidebarHeaderBrand>\n                    <SidebarTrigger />\n                </SidebarHeader>\n                <SidebarContent>\n                    <SidebarGroup>\n                        <SidebarGroupLabel>Workspace</SidebarGroupLabel>\n                        <SidebarItem\n                            icon={HomeIcon}\n                            active={active === \"dashboard\"}\n                            onClick={() => setActive(\"dashboard\")}\n                        >\n                            Dashboard\n                        </SidebarItem>\n                        <SidebarItem\n                            icon={SearchIcon}\n                            active={active === \"search\"}\n                            onClick={() => setActive(\"search\")}\n                        >\n                            Search\n                        </SidebarItem>\n                        <SidebarItem\n                            icon={UsersIcon}\n                            active={active === \"team\"}\n                            onClick={() => setActive(\"team\")}\n                            trailing={<span className=\"badge badge-primary badge-xs\">4</span>}\n                        >\n                            Team\n                        </SidebarItem>\n                    </SidebarGroup>\n                    <SidebarGroup>\n                        <SidebarGroupLabel>Account</SidebarGroupLabel>\n                        <SidebarItem\n                            icon={SettingsIcon}\n                            active={active === \"settings\"}\n                            onClick={() => setActive(\"settings\")}\n                        >\n                            Settings\n                        </SidebarItem>\n                    </SidebarGroup>\n                </SidebarContent>\n                <SidebarFooter>\n                    <SidebarItem icon={<Avatar size=\"xs\">AL</Avatar>}>Ada Lovelace</SidebarItem>\n                </SidebarFooter>\n            </Sidebar>\n\n            <div className=\"flex flex-1 flex-col gap-3 overflow-y-auto p-6\">\n                <div className=\"flex items-center gap-2\">\n                    <SidebarTrigger />\n                    <h4 className=\"text-sm font-semibold capitalize\">{active}</h4>\n                </div>\n                <p className=\"text-sm opacity-70\">\n                    The trigger above lives OUTSIDE the sidebar (in this main content\n                    area) yet still toggles it — both triggers share one\n                    SidebarProvider.\n                </p>\n            </div>\n        </div>\n    );\n}\n\nexport function SidebarDemo() {\n    return (\n        <Section title=\"Real use · app shell (collapsible, cross-tree trigger)\">\n            <SidebarProvider>\n                <AppShell />\n            </SidebarProvider>\n        </Section>\n    );\n}"
  },
  {
    "name": "Steps",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/steps.tsx",
    "description": "Silica Steps — a horizontal progress tracker. Children are `<Step>`s; color the ones up to (and including) the current step to show completion. <Steps> <Step color=\"primary\" data-content=\"✓\">Cart</Step> <Step color=\"primary\">Shipping</Step> <Step>Payment</Step> <Step>Done</Step> </Steps>",
    "props": [
      {
        "name": "StepsProps",
        "extends": "extends React.OlHTMLAttributes<HTMLOListElement>",
        "members": []
      },
      {
        "name": "StepProps",
        "extends": "extends React.LiHTMLAttributes<HTMLLIElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "StepColor",
            "doc": "Paints the node + incoming connector; maps to `step-<color>`."
          },
          {
            "name": "\"data-content\"",
            "optional": true,
            "type": "string",
            "doc": "Glyph shown in the node instead of its number (e.g. a check)."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Steps, Step, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nconst CHECKOUT = [\"Cart\", \"Shipping\", \"Payment\", \"Done\"];\n\nexport function StepsDemo() {\n    const [current, setCurrent] = useState(1);\n\n    return (\n        <>\n            <Section title=\"Colors (completed steps)\">\n                <div className=\"flex flex-col gap-6\">\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Steps key={color}>\n                            <Step color={color} data-content=\"✓\">\n                                Cart\n                            </Step>\n                            <Step color={color} data-content=\"✓\">\n                                Shipping\n                            </Step>\n                            <Step color={color}>Payment</Step>\n                            <Step>Done</Step>\n                        </Steps>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · interactive checkout\">\n                <div className=\"flex max-w-lg flex-col gap-4\">\n                    <Steps>\n                        {CHECKOUT.map((label, i) => (\n                            <Step\n                                key={label}\n                                color={i <= current ? \"primary\" : undefined}\n                                data-content={i < current ? \"✓\" : undefined}\n                            >\n                                {label}\n                            </Step>\n                        ))}\n                    </Steps>\n                    <Row>\n                        <Button\n                            variant=\"outline\"\n                            color=\"neutral\"\n                            disabled={current === 0}\n                            onClick={() => setCurrent((c) => Math.max(0, c - 1))}\n                        >\n                            Back\n                        </Button>\n                        <Button\n                            color=\"primary\"\n                            disabled={current === CHECKOUT.length - 1}\n                            onClick={() =>\n                                setCurrent((c) => Math.min(CHECKOUT.length - 1, c + 1))\n                            }\n                        >\n                            {current === CHECKOUT.length - 2 ? \"Place order\" : \"Next\"}\n                        </Button>\n                    </Row>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Tabs",
    "package": "@wizeworks/silicaui-react",
    "category": "Navigation",
    "sourceFile": "silicaui-react/src/tabs.tsx",
    "description": "Silica Tabs — Base UI selection state + roving focus + a moving indicator. <Tabs defaultValue=\"account\" variant=\"boxed\"> <TabsList> <TabsTab value=\"account\">Account</TabsTab> <TabsTab value=\"password\">Password</TabsTab> </TabsList> <TabsPanel value=\"account\">…</TabsPanel> <TabsPanel value=\"password\">…</TabsPanel> </Tabs> The same sliding indicator styles per variant — an underline, or a full pill.",
    "props": [
      {
        "name": "TabsProps",
        "extends": "extends Styled<typeof BaseTabs.Root>",
        "members": [
          {
            "name": "variant",
            "optional": true,
            "type": "TabsVariant",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "TabsColor",
            "doc": "Accent color (underline + pills fill); maps to `tabs-<color>`. Default primary."
          }
        ]
      },
      {
        "name": "TabsListProps",
        "extends": "extends Omit<Styled<typeof BaseTabs.List>, \"children\">",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "indicator",
            "optional": true,
            "type": "boolean",
            "doc": "Render the moving underline indicator. Default `true`."
          },
          {
            "name": "scrollable",
            "optional": true,
            "type": "boolean",
            "doc": "Say so when tabs don't fit, instead of letting them fall off the edge. Default `true`. A tab strip is the canonical case for this: `overflow-x` alone leaves the last tabs reachable but unannounced, and on an overlay-scrollbar platform nothing at all is drawn — so from the operator's side those tabs simply do not exist. When on, the list is wrapped in a `ScrollStrip` and gains in-flow prev/next controls the moment a tab is clipped. Note the layout consequence, which is inherent rather than incidental: an `inline-flex` list shrink-wraps its content and therefore can NEVER detect that it overflows. A scrollable list must be constrained by its parent, so the wrapper is block-level and fills the available width. The tabs themselves still shrink-wrap and stay left-aligned. Pass `false` for a strip that must shrink-wrap its own box (e.g. sitting inline beside other controls) and accept that overflowing tabs go unannounced."
          },
          {
            "name": "scrollLabel",
            "optional": true,
            "type": "string",
            "doc": "Plural noun naming the scroll controls. Default `tabs`."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Tabs,\n    TabsList,\n    TabsTab,\n    TabsPanel,\n    Input,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function TabsDemo() {\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Row>\n                    {COLORS.slice(0, 6).map((color) => (\n                        <Tabs key={color} color={color} defaultValue=\"a\" className=\"w-40\">\n                            <TabsList>\n                                <TabsTab value=\"a\">One</TabsTab>\n                                <TabsTab value=\"b\">Two</TabsTab>\n                            </TabsList>\n                        </Tabs>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"More tabs than fit — the strip says so on its own\">\n                <div className=\"flex flex-col gap-4\">\n                    {([\"underline\", \"boxed\", \"pills\"] as const).map((variant) => (\n                        <div key={variant} className=\"w-72\" data-demo={`overflow-${variant}`}>\n                            <Tabs variant={variant} color=\"primary\" defaultValue=\"overview\">\n                                <TabsList>\n                                    {[\"Overview\", \"Timeline\", \"Messages\", \"Activity\", \"Documents\"].map(\n                                        (t) => (\n                                            <TabsTab key={t} value={t.toLowerCase()}>\n                                                {t}\n                                            </TabsTab>\n                                        ),\n                                    )}\n                                </TabsList>\n                            </Tabs>\n                        </div>\n                    ))}\n                    <p className=\"max-w-md text-sm\">\n                        No wrapper at the call site: <code>TabsList</code> carries this\n                        itself, because a tab nobody can see is a tab that does not exist.\n                    </p>\n                </div>\n            </Section>\n\n            <Section title=\"Variants\">\n                {([\"underline\", \"boxed\", \"pills\"] as const).map((variant) => (\n                    <Tabs key={variant} variant={variant} color=\"primary\" defaultValue=\"a\">\n                        <TabsList>\n                            <TabsTab value=\"a\">Account</TabsTab>\n                            <TabsTab value=\"b\">Password</TabsTab>\n                            <TabsTab value=\"c\">Team</TabsTab>\n                        </TabsList>\n                    </Tabs>\n                ))}\n            </Section>\n\n            <Section title=\"Real use · settings panels\">\n                <Tabs variant=\"boxed\" color=\"primary\" defaultValue=\"account\" className=\"max-w-md\">\n                    <TabsList>\n                        <TabsTab value=\"account\">Account</TabsTab>\n                        <TabsTab value=\"password\">Password</TabsTab>\n                        <TabsTab value=\"team\">Team</TabsTab>\n                    </TabsList>\n                    <TabsPanel value=\"account\">\n                        <div className=\"flex flex-col gap-3 pt-4\">\n                            <Input placeholder=\"Full name\" defaultValue=\"Ada Lovelace\" />\n                            <Input placeholder=\"Email\" defaultValue=\"ada@silica.dev\" />\n                            <Button color=\"primary\" className=\"w-fit\">\n                                Save\n                            </Button>\n                        </div>\n                    </TabsPanel>\n                    <TabsPanel value=\"password\">\n                        <div className=\"flex flex-col gap-3 pt-4\">\n                            <Input placeholder=\"Current password\" type=\"password\" />\n                            <Input placeholder=\"New password\" type=\"password\" />\n                            <Button color=\"primary\" className=\"w-fit\">\n                                Update password\n                            </Button>\n                        </div>\n                    </TabsPanel>\n                    <TabsPanel value=\"team\">\n                        <p className=\"pt-4 opacity-70\">4 members — 1 seat available.</p>\n                    </TabsPanel>\n                </Tabs>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Alert",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/alert.tsx",
    "description": "Silica Alert — a feedback surface, from an inline notice to a page banner. Compose it from parts, like Card: // One-liner: icon + message <Alert color=\"success\"><CheckIcon /> Your changes were saved.</Alert> // Structured: title + description + trailing actions <Alert color=\"error\"> <XIcon /> <AlertContent> <AlertTitle>Upload failed</AlertTitle> <AlertDescription>The file exceeds the 5 MB limit.</AlertDescription> </AlertContent> <AlertActions> <Button size=\"sm\" color=\"error\" variant=\"soft\">Retry</Button> </AlertActions> </Alert> // Dismissible, full-bleed page banner <Alert color=\"warning\" banner dismissible onDismiss={() => setShown(false)}> Scheduled maintenance tonight at 10pm PT. </Alert> A leading `<svg>` child is sized automatically. Defaults to `role=\"alert\"` (assertive); pass `role=\"status\"` for a quieter, non-interrupting announcement. For progressively-disclosed detail (e.g. \"3 files failed ▾\"), nest the existing `Collapsible`/`CollapsibleTrigger`/`CollapsiblePanel` inside `AlertContent` — Alert doesn't need its own bespoke disclosure.",
    "props": [
      {
        "name": "AlertProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "AlertColor",
            "doc": "Semantic color; maps to `alert-<color>`. Omit for a neutral surface."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "AlertVariant",
            "doc": "Visual style. Default `solid`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "AlertSize",
            "doc": "Default `md`."
          },
          {
            "name": "banner",
            "optional": true,
            "type": "boolean",
            "doc": "Full-bleed \"page banner\" placement — edge to edge, no rounding."
          },
          {
            "name": "dismissible",
            "optional": true,
            "type": "boolean",
            "doc": "Show a dismiss (×) button and animate the alert away on close."
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled open state (only meaningful with `dismissible`)."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": "Uncontrolled initial open state. Default `true`."
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "onDismiss",
            "optional": true,
            "type": "() => void",
            "doc": "Fires when the dismiss button is clicked (before `onOpenChange`)."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Alert,\n    AlertContent,\n    AlertTitle,\n    AlertDescription,\n    AlertActions,\n    Collapsible,\n    CollapsibleTrigger,\n    CollapsiblePanel,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\nimport { InfoIcon, CheckIcon, WarnIcon, XIcon } from \"../lib/icons\";\nimport { SIZES } from \"../lib/data\";\n\nexport function AlertDemo() {\n    const [dismissed, setDismissed] = useState(false);\n\n    return (\n        <>\n            <Section title=\"dismissible · animates away, then unmounts\">\n                <Stack>\n                    {!dismissed && (\n                        <Alert color=\"info\" dismissible onDismiss={() => setDismissed(true)}>\n                            <InfoIcon />A new software update is available.\n                        </Alert>\n                    )}\n                    {dismissed && (\n                        <Button size=\"sm\" variant=\"outline\" onClick={() => setDismissed(false)}>\n                            Reset\n                        </Button>\n                    )}\n                </Stack>\n            </Section>\n\n            <Section title=\"banner · full-bleed, edge to edge (no rounding)\">\n                <Alert color=\"warning\" banner dismissible variant=\"soft\">\n                    <WarnIcon />\n                    Scheduled maintenance tonight at 10pm PT — expect brief downtime.\n                </Alert>\n            </Section>\n\n            <Section title=\"collapsible detail · nests the existing Collapsible, not a bespoke prop\">\n                <Alert color=\"error\" variant=\"soft\">\n                    <XIcon />\n                    {/* `className=\"contents\"` (a utility, so it wins over the component's\n                        own flex-column) keeps AlertContent + AlertActions as direct row\n                        children of Alert — the Collapsible only supplies shared open-state\n                        context here, not a layout box. That's what lets the icon trigger\n                        sit top-right while the label trigger stays under the title, both\n                        toggling the one panel. */}\n                    <Collapsible className=\"contents\">\n                        <AlertContent>\n                            <AlertTitle>3 files failed to upload</AlertTitle>\n                            <CollapsibleTrigger chevron={false}>Show details</CollapsibleTrigger>\n                            <CollapsiblePanel>\n                                <ul className=\"list-disc pl-4 text-xs\">\n                                    <li>report-q3.pdf — exceeds 5 MB limit</li>\n                                    <li>archive.zip — unsupported type</li>\n                                    <li>notes.docx — network error</li>\n                                </ul>\n                            </CollapsiblePanel>\n                        </AlertContent>\n                        <AlertActions>\n                            <CollapsibleTrigger variant=\"icon\" aria-label=\"Toggle details\" />\n                        </AlertActions>\n                    </Collapsible>\n                </Alert>\n            </Section>\n\n            <Section title=\"Colors & structure\">\n                <Stack>\n                    {/* One-liner: leading icon + message */}\n                    <Alert color=\"info\">\n                        <InfoIcon />A new software update is available.\n                    </Alert>\n                    <Alert color=\"success\" variant=\"soft\">\n                        <CheckIcon />\n                        Your changes have been saved.\n                    </Alert>\n                    {/* Structured: title + description */}\n                    <Alert color=\"warning\" variant=\"soft\">\n                        <WarnIcon />\n                        <AlertContent>\n                            <AlertTitle>Storage almost full</AlertTitle>\n                            <AlertDescription>\n                                You've used 92% of your quota. Consider upgrading.\n                            </AlertDescription>\n                        </AlertContent>\n                    </Alert>\n                    {/* Structured + trailing actions (far right, centered) */}\n                    <Alert color=\"error\">\n                        <XIcon />\n                        <AlertContent>\n                            <AlertTitle>Upload failed</AlertTitle>\n                            <AlertDescription>\n                                The file exceeds the 5 MB limit.\n                            </AlertDescription>\n                        </AlertContent>\n                        <AlertActions>\n                            <Button size=\"sm\" color=\"error\" variant=\"soft\">\n                                Retry\n                            </Button>\n                        </AlertActions>\n                    </Alert>\n                    <Alert color=\"brand\" variant=\"outline\">\n                        <InfoIcon />\n                        The <code>brand</code> color flows through Alerts too.\n                    </Alert>\n                    <Alert>\n                        <InfoIcon />\n                        Neutral alert — no color prop, just the base surface.\n                    </Alert>\n                </Stack>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"gap-2\">\n                    {SIZES.slice(0, 4).map((size) => (\n                        <Alert key={size} color=\"info\" size={size}>\n                            <InfoIcon />\n                            {size}\n                        </Alert>\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Glass · notice floating over a colored background\">\n                <div\n                    className=\"rounded-box p-8\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Stack className=\"gap-3\">\n                        <Alert className=\"glass\">\n                            <InfoIcon />A new software update is available.\n                        </Alert>\n                        <Alert color=\"success\" className=\"glass\">\n                            <CheckIcon />\n                            Your changes have been saved.\n                        </Alert>\n                        <Alert color=\"error\" className=\"glass\">\n                            <XIcon />\n                            <AlertContent>\n                                <AlertTitle>Upload failed</AlertTitle>\n                                <AlertDescription>\n                                    The file exceeds the 5 MB limit — glass still reads clearly\n                                    at error severity.\n                                </AlertDescription>\n                            </AlertContent>\n                            <AlertActions>\n                                <Button size=\"sm\" color=\"error\" variant=\"soft\">\n                                    Retry\n                                </Button>\n                            </AlertActions>\n                        </Alert>\n                    </Stack>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "AlertDialog",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/alert-dialog.tsx",
    "description": "Silica AlertDialog — a confirmation modal from Base UI. Unlike `Dialog`, its backdrop is inert: clicking outside will NOT dismiss it, so the user can't lose the decision by tapping away (Escape still cancels, per the ARIA alert dialog pattern). Reach for it on destructive or consequential actions; reuses the Dialog surface styling. <AlertDialog> <AlertDialogTrigger><Button color=\"error\">Delete account</Button></AlertDialogTrigger> <AlertDialogContent> <AlertDialogTitle>Delete account?</AlertDialogTitle> <AlertDialogDescription>This permanently removes your data.</AlertDialogDescription> <div className=\"mt-4 flex justify-end gap-2\"> <AlertDialogClose><Button variant=\"ghost\">Cancel</Button></AlertDialogClose> <AlertDialogClose><Button color=\"error\" onClick={destroy}>Delete</Button></AlertDialogClose> </div> </AlertDialogContent> </AlertDialog>",
    "props": [
      {
        "name": "AlertDialogProps",
        "members": []
      },
      {
        "name": "AlertDialogActionProps",
        "extends": "extends ButtonProps",
        "members": []
      },
      {
        "name": "AlertDialogContentProps",
        "extends": "extends Omit<Styled<typeof BaseAlertDialog.Popup>, \"children\">",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "backdropClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the backdrop layer."
          }
        ]
      }
    ],
    "usageExample": "import {\n    AlertDialog,\n    AlertDialogTrigger,\n    AlertDialogContent,\n    AlertDialogTitle,\n    AlertDialogDescription,\n    AlertDialogHeader,\n    AlertDialogFooter,\n    AlertDialogCancel,\n    AlertDialogAction,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function AlertDialogDemo() {\n    return (\n        <Section title=\"Real use · Cancel/Action, header + footer\">\n            <Row>\n                <AlertDialog>\n                    <AlertDialogTrigger>\n                        <Button color=\"error\" variant=\"outline\">\n                            Delete account…\n                        </Button>\n                    </AlertDialogTrigger>\n                    <AlertDialogContent>\n                        <AlertDialogTitle>Delete account?</AlertDialogTitle>\n                        <AlertDialogDescription>\n                            This permanently removes your data. This can't be undone.\n                        </AlertDialogDescription>\n                        <div className=\"mt-4 flex justify-end gap-2\">\n                            <AlertDialogCancel>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Cancel\n                                </Button>\n                            </AlertDialogCancel>\n                            <AlertDialogAction\n                                color=\"error\"\n                                onClick={() => console.log(\"account deleted\")}\n                            >\n                                Delete\n                            </AlertDialogAction>\n                        </div>\n                    </AlertDialogContent>\n                </AlertDialog>\n\n                <AlertDialog>\n                    <AlertDialogTrigger>\n                        <Button variant=\"outline\">Header/Footer variant</Button>\n                    </AlertDialogTrigger>\n                    <AlertDialogContent>\n                        <AlertDialogHeader>\n                            <AlertDialogTitle>Discard changes?</AlertDialogTitle>\n                        </AlertDialogHeader>\n                        <AlertDialogDescription>\n                            You have unsaved changes that will be lost.\n                        </AlertDialogDescription>\n                        <AlertDialogFooter>\n                            <AlertDialogCancel>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Keep editing\n                                </Button>\n                            </AlertDialogCancel>\n                            <AlertDialogAction color=\"error\">Discard</AlertDialogAction>\n                        </AlertDialogFooter>\n                    </AlertDialogContent>\n                </AlertDialog>\n            </Row>\n        </Section>\n    );\n}"
  },
  {
    "name": "ContextMenu",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/context-menu.tsx",
    "description": "Silica ContextMenu — a right-click menu. Behavior from Base UI (opens at the pointer, roving focus, typeahead, dismissal); its popup reuses the shared `.dropdown*` surface. <ContextMenu> <ContextMenuTrigger className=\"grid h-40 place-items-center rounded-box border border-dashed\"> Right-click here </ContextMenuTrigger> <ContextMenuContent> <ContextMenuGroup> <ContextMenuLabel>Actions</ContextMenuLabel> <ContextMenuItem>Cut</ContextMenuItem> <ContextMenuItem>Copy</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuItem disabled>Paste</ContextMenuItem> </ContextMenuContent> </ContextMenu>",
    "props": [
      {
        "name": "ContextMenuProps",
        "members": []
      },
      {
        "name": "ContextMenuTriggerProps",
        "members": []
      },
      {
        "name": "ContextMenuContentProps",
        "extends": "extends Omit<Styled<typeof BaseContextMenu.Popup>, \"children\">,\n    PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "ContextMenuSide",
            "doc": "Preferred side of the pointer anchor. Base UI's default when omitted."
          },
          {
            "name": "align",
            "optional": true,
            "type": "ContextMenuAlign",
            "doc": "Alignment along that side. Base UI's default when omitted."
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": "Gap from the pointer anchor, in px."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Dialog",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/dialog.tsx",
    "description": "Silica Dialog — a modal, from Base UI (focus trap + scroll lock + dismissal). <Dialog> <DialogTrigger><Button>Delete…</Button></DialogTrigger> <DialogContent> <DialogTitle>Delete project?</DialogTitle> <DialogDescription>This can't be undone.</DialogDescription> <div className=\"mt-4 flex justify-end gap-2\"> <DialogClose><Button variant=\"ghost\">Cancel</Button></DialogClose> <DialogClose><Button color=\"error\">Delete</Button></DialogClose> </div> </DialogContent> </Dialog> Pass `modal=\"trap-focus\"` for a non-scroll-locking dialog, or control it with `open`/`onOpenChange`.",
    "props": [
      {
        "name": "DialogProps",
        "members": []
      },
      {
        "name": "DialogTriggerProps",
        "members": [
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement",
            "doc": ""
          },
          {
            "name": "nativeButton",
            "optional": true,
            "type": "boolean",
            "doc": "Whether `children` is a real `<button>`. Base UI assumes it is and logs an error on every render when it isn't — pass `false` when the child is legitimately something else, e.g. a `<span>` wrapping a DISABLED button so a tooltip explaining why it's disabled can still be hovered."
          }
        ]
      },
      {
        "name": "DialogContentProps",
        "extends": "extends Omit<Styled<typeof BaseDialog.Popup>, \"children\">",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "backdropClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the backdrop layer."
          }
        ]
      },
      {
        "name": "DialogHeaderProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "sticky",
            "optional": true,
            "type": "boolean",
            "doc": "Pin this bar in place while the rest of the content scrolls."
          }
        ]
      },
      {
        "name": "DialogFooterProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "sticky",
            "optional": true,
            "type": "boolean",
            "doc": "Pin this bar in place while the rest of the content scrolls."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Dialog,\n    DialogTrigger,\n    DialogClose,\n    DialogContent,\n    DialogTitle,\n    DialogDescription,\n    DialogHeader,\n    DialogFooter,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function DialogDemo() {\n    return (\n        <>\n            <Section title=\"Real use · destructive-action confirmation\">\n                <Dialog>\n                    <DialogTrigger>\n                        <Button color=\"error\" variant=\"outline\">\n                            Delete project…\n                        </Button>\n                    </DialogTrigger>\n                    <DialogContent>\n                        <DialogTitle>Delete project?</DialogTitle>\n                        <DialogDescription>\n                            This will permanently delete the project and all its data. This\n                            can't be undone.\n                        </DialogDescription>\n                        <div className=\"mt-4 flex justify-end gap-2\">\n                            <DialogClose>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Cancel\n                                </Button>\n                            </DialogClose>\n                            <DialogClose>\n                                <Button color=\"error\">Delete</Button>\n                            </DialogClose>\n                        </div>\n                    </DialogContent>\n                </Dialog>\n            </Section>\n\n            <Section title=\"Header + Footer · placeable docking bars, sticky footer\">\n                <Row>\n                    <Dialog>\n                        <DialogTrigger>\n                            <Button variant=\"outline\">Header/Footer</Button>\n                        </DialogTrigger>\n                        <DialogContent>\n                            <DialogHeader>\n                                <DialogTitle>Invite teammates</DialogTitle>\n                                <DialogClose>\n                                    <Button variant=\"ghost\" shape=\"circle\" size=\"sm\">\n                                        ✕\n                                    </Button>\n                                </DialogClose>\n                            </DialogHeader>\n                            <DialogDescription>\n                                Send an invite by email — they'll get access once they accept.\n                            </DialogDescription>\n                            <DialogFooter>\n                                <DialogClose>\n                                    <Button variant=\"ghost\" color=\"neutral\">\n                                        Cancel\n                                    </Button>\n                                </DialogClose>\n                                <DialogClose>\n                                    <Button>Send invite</Button>\n                                </DialogClose>\n                            </DialogFooter>\n                        </DialogContent>\n                    </Dialog>\n\n                    <Dialog>\n                        <DialogTrigger>\n                            <Button variant=\"outline\">Sticky footer (scrolling content)</Button>\n                        </DialogTrigger>\n                        <DialogContent className=\"max-h-[70dvh]\">\n                            <DialogHeader sticky>\n                                <DialogTitle>Terms of service</DialogTitle>\n                            </DialogHeader>\n                            <div>\n                                {Array.from({ length: 12 }, (_, i) => (\n                                    <p key={i} className=\"mb-3\">\n                                        Section {i + 1} — placeholder legal text to force this\n                                        dialog to scroll so the sticky footer below stays pinned.\n                                    </p>\n                                ))}\n                            </div>\n                            <DialogFooter sticky>\n                                <DialogClose>\n                                    <Button variant=\"ghost\" color=\"neutral\">\n                                        Decline\n                                    </Button>\n                                </DialogClose>\n                                <DialogClose>\n                                    <Button>Accept</Button>\n                                </DialogClose>\n                            </DialogFooter>\n                        </DialogContent>\n                    </Dialog>\n                </Row>\n            </Section>\n\n            <Section title=\"Glass · frosted popup over the dimmed backdrop\">\n                <Dialog>\n                    <DialogTrigger>\n                        <Button variant=\"outline\">Glass dialog</Button>\n                    </DialogTrigger>\n                    <DialogContent className=\"glass\">\n                        <DialogTitle>Restart required</DialogTitle>\n                        <DialogDescription>\n                            <code>DialogContent className=&quot;glass&quot;</code> frosts the\n                            popup over the existing dimmed backdrop — same class, no new prop.\n                        </DialogDescription>\n                        <div className=\"mt-4 flex justify-end gap-2\">\n                            <DialogClose>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Later\n                                </Button>\n                            </DialogClose>\n                            <DialogClose>\n                                <Button>Restart now</Button>\n                            </DialogClose>\n                        </div>\n                    </DialogContent>\n                </Dialog>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Drawer",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/drawer.tsx",
    "description": "Silica Drawer — a panel that slides in from an edge (Base UI Dialog behavior). <Drawer> <DrawerTrigger><Button>Menu</Button></DrawerTrigger> <DrawerContent side=\"left\"> <DrawerTitle>Navigation</DrawerTitle> <nav>…</nav> <DrawerClose><Button variant=\"ghost\">Close</Button></DrawerClose> </DrawerContent> </Drawer>",
    "props": [
      {
        "name": "DrawerProps",
        "members": []
      },
      {
        "name": "DrawerContentProps",
        "extends": "extends Omit<Styled<typeof BaseDialog.Popup>, \"children\">",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "DrawerSide",
            "doc": "Edge the drawer slides from. Default `left`."
          },
          {
            "name": "backdropClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the backdrop layer."
          }
        ]
      },
      {
        "name": "DrawerHeaderProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "sticky",
            "optional": true,
            "type": "boolean",
            "doc": "Pin this bar in place while the rest of the content scrolls."
          }
        ]
      },
      {
        "name": "DrawerFooterProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "sticky",
            "optional": true,
            "type": "boolean",
            "doc": "Pin this bar in place while the rest of the content scrolls."
          }
        ]
      }
    ],
    "usageExample": "import {\n    Drawer,\n    DrawerTrigger,\n    DrawerClose,\n    DrawerContent,\n    DrawerTitle,\n    DrawerDescription,\n    DrawerHeader,\n    DrawerFooter,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function DrawerDemo() {\n    return (\n        <>\n            <Section title=\"Real use · navigation drawer\">\n                <Row>\n                    {([\"left\", \"right\", \"top\", \"bottom\"] as const).map((side) => (\n                        <Drawer key={side}>\n                            <DrawerTrigger>\n                                <Button variant=\"outline\" color=\"neutral\">\n                                    {side}\n                                </Button>\n                            </DrawerTrigger>\n                            <DrawerContent side={side}>\n                                <DrawerTitle>Navigation</DrawerTitle>\n                                <DrawerDescription>\n                                    Slides in from the {side} edge.\n                                </DrawerDescription>\n                                <nav className=\"flex flex-col gap-2 py-4 text-sm\">\n                                    <a href=\"#\">Dashboard</a>\n                                    <a href=\"#\">Projects</a>\n                                    <a href=\"#\">Settings</a>\n                                </nav>\n                                <DrawerClose>\n                                    <Button variant=\"ghost\" color=\"neutral\">\n                                        Close\n                                    </Button>\n                                </DrawerClose>\n                            </DrawerContent>\n                        </Drawer>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Header + Footer · sticky, scrolling content\">\n                <Drawer>\n                    <DrawerTrigger>\n                        <Button variant=\"outline\">Filters (sticky header/footer)</Button>\n                    </DrawerTrigger>\n                    <DrawerContent side=\"right\">\n                        <DrawerHeader sticky>\n                            <DrawerTitle>Filters</DrawerTitle>\n                            <DrawerClose>\n                                <Button variant=\"ghost\" shape=\"circle\" size=\"sm\">\n                                    ✕\n                                </Button>\n                            </DrawerClose>\n                        </DrawerHeader>\n                        <div className=\"flex flex-col gap-3 text-sm\">\n                            {Array.from({ length: 14 }, (_, i) => (\n                                <label key={i} className=\"flex items-center gap-2\">\n                                    <input type=\"checkbox\" /> Filter option {i + 1}\n                                </label>\n                            ))}\n                        </div>\n                        <DrawerFooter sticky>\n                            <DrawerClose>\n                                <Button variant=\"ghost\" color=\"neutral\">\n                                    Reset\n                                </Button>\n                            </DrawerClose>\n                            <DrawerClose>\n                                <Button>Apply</Button>\n                            </DrawerClose>\n                        </DrawerFooter>\n                    </DrawerContent>\n                </Drawer>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "ImperativeAlertDialogProvider",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/imperative-alert-dialog.tsx",
    "description": "Mounts the singleton confirm dialog `useImperativeAlertDialog` talks to. Wrap your app once, near the root (alongside `SilicaProvider`/`ToastProvider`). <ImperativeAlertDialogProvider> <App /> </ImperativeAlertDialogProvider>",
    "props": [
      {
        "name": "ImperativeAlertDialogProviderProps",
        "members": [
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "popupProps",
            "optional": true,
            "type": "Omit<AlertDialogContentProps, \"children\"> & {\n    [key: `data-${string}`]: unknown;\n  }",
            "doc": "Props for the portalled `AlertDialogContent` — chiefly `data-theme`. The popup portals to `document.body`, which is OUTSIDE any `[data-theme]` island the provider sits in, so a confirm raised from inside a themed region (an editor shell, a pane, a dark section) would otherwise resolve its tokens against the page instead of that region: <ImperativeAlertDialogProvider popupProps={{ \"data-theme\": \"studio\" }}> `data-*` keys are spelled out in the type because this is an object literal, not a JSX attribute list — TypeScript waives excess-property checks for hyphenated names only in JSX position."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Indicator",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/indicator.tsx",
    "description": "Silica Indicator — pins an overlay to a corner of its content. <Indicator> <IndicatorItem><Badge color=\"error\" size=\"xs\">3</Badge></IndicatorItem> <Button variant=\"outline\">Inbox</Button> </Indicator> The item comes first; the element it decorates follows.",
    "props": [
      {
        "name": "IndicatorProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": []
      },
      {
        "name": "IndicatorItemProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": [
          {
            "name": "placement",
            "optional": true,
            "type": "IndicatorPlacement",
            "doc": "Which corner. Default `top-end`."
          }
        ]
      }
    ],
    "usageExample": "import { Indicator, IndicatorItem, Badge, Button, Status } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function IndicatorDemo() {\n    return (\n        <>\n            <Section title=\"Placements\">\n                <Row>\n                    {([\"top-end\", \"top-start\", \"bottom-end\", \"bottom-start\"] as const).map(\n                        (placement) => (\n                            <Indicator key={placement}>\n                                <IndicatorItem placement={placement}>\n                                    <Badge color=\"error\" size=\"xs\">\n                                        3\n                                    </Badge>\n                                </IndicatorItem>\n                                <Button variant=\"outline\" color=\"neutral\">\n                                    {placement}\n                                </Button>\n                            </Indicator>\n                        ),\n                    )}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · notification badge + presence dot\">\n                <Row>\n                    <Indicator>\n                        <IndicatorItem>\n                            <Badge color=\"error\" size=\"xs\">\n                                5\n                            </Badge>\n                        </IndicatorItem>\n                        <Button variant=\"outline\" color=\"neutral\">\n                            Inbox\n                        </Button>\n                    </Indicator>\n                    <Indicator>\n                        <IndicatorItem>\n                            <Status color=\"success\" ping />\n                        </IndicatorItem>\n                        <Button variant=\"outline\" color=\"neutral\">\n                            Ada Lovelace\n                        </Button>\n                    </Indicator>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Lightbox",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/lightbox.tsx",
    "description": "Silica Lightbox — a full-viewport image viewer for a gallery. Not a trigger itself: render your own thumbnails and drive `index` (controlled or uncontrolled) from their click handlers. Left/Right arrow keys navigate; Escape and the backdrop close it (Base UI Dialog underneath). const [index, setIndex] = useState<number | null>(null); <div className=\"grid grid-cols-4 gap-2\"> {photos.map((p, i) => ( <button key={p.src} onClick={() => setIndex(i)}><img src={p.src} /></button> ))} </div> <Lightbox items={photos} index={index} onIndexChange={setIndex} />",
    "props": [
      {
        "name": "LightboxProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "LightboxItem[]",
            "doc": ""
          },
          {
            "name": "index",
            "optional": true,
            "type": "number | null",
            "doc": "Controlled open index; `null` (or `undefined` while uncontrolled) is closed."
          },
          {
            "name": "defaultIndex",
            "optional": true,
            "type": "number | null",
            "doc": ""
          },
          {
            "name": "onIndexChange",
            "optional": true,
            "type": "(index: number | null) => void",
            "doc": ""
          },
          {
            "name": "loop",
            "optional": true,
            "type": "boolean",
            "doc": "Wrap past the first/last item with the nav arrows. Default `true`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Lightbox, type LightboxItem } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\n// Stand-in \"photos\" (data URIs, always load offline): a gradient tile with a\n// number, so the viewer/nav path is demonstrated without a network request.\nfunction placeholder(n: number, from: string, to: string): string {\n    return `data:image/svg+xml,${encodeURIComponent(\n        `<svg xmlns='http://www.w3.org/2000/svg' width='800' height='600'>` +\n            `<defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'>` +\n            `<stop offset='0' stop-color='${from}'/><stop offset='1' stop-color='${to}'/>` +\n            `</linearGradient></defs>` +\n            `<rect width='800' height='600' fill='url(#g)'/>` +\n            `<text x='400' y='330' font-size='180' font-family='sans-serif' font-weight='700' fill='rgba(255,255,255,.85)' text-anchor='middle'>${n}</text>` +\n            `</svg>`,\n    )}`;\n}\n\nconst PHOTOS: LightboxItem[] = [\n    { src: placeholder(1, \"#6366f1\", \"#ec4899\"), caption: \"Photo 1\" },\n    { src: placeholder(2, \"#f97316\", \"#eab308\"), caption: \"Photo 2\" },\n    { src: placeholder(3, \"#10b981\", \"#06b6d4\"), caption: \"Photo 3\" },\n    { src: placeholder(4, \"#8b5cf6\", \"#ec4899\"), caption: \"Photo 4\" },\n];\n\nexport function LightboxDemo() {\n    const [index, setIndex] = useState<number | null>(null);\n\n    return (\n        <Section title=\"Real use · thumbnail grid opens a full-viewport viewer\">\n            <div className=\"grid grid-cols-4 gap-2\">\n                {PHOTOS.map((p, i) => (\n                    <button\n                        key={p.src}\n                        type=\"button\"\n                        className=\"overflow-hidden rounded-field\"\n                        onClick={() => setIndex(i)}\n                    >\n                        <img src={p.src} alt=\"\" className=\"block h-24 w-full object-cover\" />\n                    </button>\n                ))}\n            </div>\n            <Lightbox items={PHOTOS} index={index} onIndexChange={setIndex} />\n        </Section>\n    );\n}"
  },
  {
    "name": "Loading",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/loading.tsx",
    "description": "Silica Loading — a spinner. Inherits `currentColor`, so color it with a `text-*` utility or let it match the surrounding text. <Loading /> <Loading size=\"sm\" className=\"text-primary\" /> <Button loading>Saving…</Button> // Button has its own built-in spinner",
    "props": [
      {
        "name": "LoadingProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": [
          {
            "name": "size",
            "optional": true,
            "type": "LoadingSize",
            "doc": "Default `md`."
          },
          {
            "name": "label",
            "optional": true,
            "type": "string",
            "doc": "Accessible label announced to assistive tech. Default \"Loading\"."
          }
        ]
      }
    ],
    "usageExample": "import { Loading, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { SIZES } from \"../lib/data\";\n\nexport function LoadingDemo() {\n    return (\n        <>\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <Loading key={size} size={size} />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · inline with text, and colored\">\n                <div className=\"flex flex-col gap-2 text-sm\">\n                    <span className=\"flex items-center gap-2\">\n                        <Loading size=\"sm\" />\n                        Loading your dashboard…\n                    </span>\n                    <span className=\"flex items-center gap-2 text-primary\">\n                        <Loading size=\"sm\" />\n                        Syncing changes…\n                    </span>\n                </div>\n            </Section>\n\n            <Section title=\"Button's built-in spinner (for comparison)\">\n                <Row>\n                    <Button color=\"primary\" loading>\n                        Saving…\n                    </Button>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Overlay",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/overlay.tsx",
    "description": "Silica Overlay — a contextual scrim anchored to a media element, for presenting info/actions specific to what's behind it (a caption on a photo, a \"Play\" button on a video thumbnail, hover actions on a gallery grid item). Not a page-level interruption like `Dialog`/`Lightbox`. <Overlay overlay={<h3>Mountain sunrise</h3>}> <img src={photo} alt=\"\" /> </Overlay> <Overlay reveal=\"hover\" placement=\"full\" overlay={<Button>View</Button>}> <img src={thumbnail} alt=\"\" /> </Overlay>",
    "props": [
      {
        "name": "OverlayProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "placement",
            "optional": true,
            "type": "OverlayPlacement",
            "doc": "Where the scrim sits over the media. Default `\"bottom\"`."
          },
          {
            "name": "reveal",
            "optional": true,
            "type": "OverlayReveal",
            "doc": "`\"always\"` (default) shows the scrim outright; `\"hover\"` fades it in on hover/focus."
          },
          {
            "name": "overlay",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The scrim's content — a caption, badges, action buttons, …"
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The underlying media — an `<img>`, `<video>`, or any element to scrim over."
          }
        ]
      }
    ],
    "usageExample": "import { Overlay, Badge, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nfunction placeholder(label: string, from: string, to: string): string {\n    return `data:image/svg+xml,${encodeURIComponent(\n        `<svg xmlns='http://www.w3.org/2000/svg' width='400' height='260'>` +\n            `<defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'>` +\n            `<stop offset='0' stop-color='${from}'/><stop offset='1' stop-color='${to}'/>` +\n            `</linearGradient></defs>` +\n            `<rect width='400' height='260' fill='url(#g)'/>` +\n            `</svg>`,\n    )}`;\n}\n\nexport function OverlayDemo() {\n    return (\n        <>\n            <Section title=\"Real use · caption scrim, always visible\">\n                <div className=\"max-w-sm\">\n                    <Overlay\n                        className=\"rounded-box\"\n                        overlay={\n                            <div>\n                                <h3 className=\"text-base font-semibold\">Mountain sunrise</h3>\n                                <p className=\"text-sm opacity-80\">Banff National Park</p>\n                            </div>\n                        }\n                    >\n                        <img src={placeholder(\"1\", \"#0ea5e9\", \"#1e3a8a\")} alt=\"\" />\n                    </Overlay>\n                </div>\n            </Section>\n\n            <Section title=\"Placement · top / bottom / full\">\n                <Row>\n                    {([\"top\", \"bottom\", \"full\"] as const).map((placement) => (\n                        <div key={placement} className=\"w-48\">\n                            <Overlay\n                                className=\"rounded-box\"\n                                placement={placement}\n                                overlay={<Badge color=\"primary\">{placement}</Badge>}\n                            >\n                                <img src={placeholder(placement, \"#f97316\", \"#7c2d12\")} alt=\"\" />\n                            </Overlay>\n                        </div>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"reveal=&quot;hover&quot; · gallery grid, scrim fades in on hover/focus\">\n                <div className=\"grid max-w-md grid-cols-3 gap-2\">\n                    {[\"10b981-06b6d4\", \"8b5cf6-ec4899\", \"f59e0b-ef4444\"].map((pair, i) => {\n                        const [from, to] = pair.split(\"-\").map((c) => `#${c}`);\n                        return (\n                            <Overlay\n                                key={pair}\n                                className=\"rounded-field\"\n                                reveal=\"hover\"\n                                placement=\"full\"\n                                overlay={\n                                    <Button size=\"sm\" color=\"primary\">\n                                        View\n                                    </Button>\n                                }\n                            >\n                                <img src={placeholder(`g${i}`, from!, to!)} alt=\"\" />\n                            </Overlay>\n                        );\n                    })}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Popover",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/popover.tsx",
    "description": "Silica Popover — a click-triggered floating panel (Base UI). <Popover> <PopoverTrigger><Button variant=\"outline\">Details</Button></PopoverTrigger> <PopoverContent> <PopoverTitle>Storage</PopoverTitle> <PopoverDescription>92% of your quota is used.</PopoverDescription> </PopoverContent> </Popover>",
    "props": [
      {
        "name": "PopoverProps",
        "members": []
      },
      {
        "name": "PopoverContentProps",
        "extends": "extends Omit<Styled<typeof BasePopover.Popup>, \"children\">,\n    PositioningProps",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          },
          {
            "name": "side",
            "optional": true,
            "type": "PopoverSide",
            "doc": ""
          },
          {
            "name": "align",
            "optional": true,
            "type": "PopoverAlign",
            "doc": ""
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": ""
          },
          {
            "name": "arrow",
            "optional": true,
            "type": "boolean",
            "doc": "Show the little arrow. Default `false`."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      }
    ],
    "usageExample": "import { useRef, useState } from \"react\";\nimport {\n    Popover,\n    PopoverTrigger,\n    PopoverContent,\n    PopoverTitle,\n    PopoverDescription,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function PopoverDemo() {\n    return (\n        <>\n            <Section title=\"Real use · click-triggered info panel\">\n                <Popover>\n                    <PopoverTrigger>\n                        <Button variant=\"outline\" color=\"neutral\">\n                            Storage details\n                        </Button>\n                    </PopoverTrigger>\n                    <PopoverContent arrow>\n                        <PopoverTitle>Storage</PopoverTitle>\n                        <PopoverDescription>\n                            92% of your 100 GB quota is used. Upgrade your plan for more\n                            space.\n                        </PopoverDescription>\n                    </PopoverContent>\n                </Popover>\n            </Section>\n\n            <Section title=\"Glass · frosted panel\">\n                <div\n                    className=\"flex justify-center rounded-box p-16\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Popover>\n                        <PopoverTrigger>\n                            <Button variant=\"outline\" color=\"neutral\">\n                                Storage details\n                            </Button>\n                        </PopoverTrigger>\n                        <PopoverContent className=\"glass\" arrow>\n                            <PopoverTitle>Storage</PopoverTitle>\n                            <PopoverDescription>\n                                <code>PopoverContent className=&quot;glass&quot;</code> — the\n                                gradient behind it shows through the blur.\n                            </PopoverDescription>\n                        </PopoverContent>\n                    </Popover>\n                </div>\n            </Section>\n\n            <ElementAnchor />\n            <PointerAnchor />\n        </>\n    );\n}\n\n/**\n * `anchor` — position against something OTHER than the trigger. Without it a\n * popup can only ever sit against the element that opened it, which breaks the\n * common case of a toolbar button that annotates a row, a cell, or a chart mark.\n */\nfunction ElementAnchor() {\n    const target = useRef<HTMLDivElement>(null);\n\n    return (\n        <Section title=\"anchor · position against another element\">\n            <div className=\"flex items-start gap-8\">\n                <Popover>\n                    <PopoverTrigger>\n                        <Button variant=\"outline\" color=\"neutral\" data-demo=\"anchor-trigger\">\n                            Explain the total\n                        </Button>\n                    </PopoverTrigger>\n                    <PopoverContent\n                        anchor={target}\n                        side=\"right\"\n                        arrow\n                        data-demo=\"anchor-popup\"\n                    >\n                        <PopoverTitle>Order total</PopoverTitle>\n                        <PopoverDescription>\n                            The panel is anchored to the figure, not to the button that\n                            opened it.\n                        </PopoverDescription>\n                    </PopoverContent>\n                </Popover>\n\n                <div\n                    ref={target}\n                    data-demo=\"anchor-target\"\n                    className=\"rounded-box border border-base-300 px-6 py-4 text-2xl font-bold\"\n                >\n                    $1,284.00\n                </div>\n            </div>\n        </Section>\n    );\n}\n\n/**\n * A virtual element is just `{ getBoundingClientRect() }` — enough to pin a\n * popup to a caret, a pointer, or a spot on a canvas that has no DOM node.\n */\nfunction PointerAnchor() {\n    const [point, setPoint] = useState<{ x: number; y: number } | null>(null);\n\n    return (\n        <Section title=\"anchor · a virtual element at the pointer\">\n            <div\n                data-demo=\"pointer-surface\"\n                className=\"grid h-40 place-items-center rounded-box border border-dashed border-base-300\"\n                onClick={(e) => setPoint({ x: e.clientX, y: e.clientY })}\n            >\n                Click anywhere in this box\n            </div>\n\n            <Popover open={point !== null} onOpenChange={() => setPoint(null)}>\n                <PopoverContent\n                    data-demo=\"pointer-popup\"\n                    side=\"bottom\"\n                    align=\"start\"\n                    anchor={\n                        point && {\n                            getBoundingClientRect: () =>\n                                new DOMRect(point.x, point.y, 0, 0),\n                        }\n                    }\n                >\n                    <PopoverDescription>\n                        Anchored at {point?.x}, {point?.y}\n                    </PopoverDescription>\n                </PopoverContent>\n            </Popover>\n        </Section>\n    );\n}"
  },
  {
    "name": "Progress",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/progress.tsx",
    "description": "Silica Progress — a task-completion bar (div-based, so it renders identically across engines; see the CSS component for why not native `<progress>`). <Progress value={60} /> // 60% <Progress color=\"success\" value={3} max={4} /> <Progress /> // indeterminate Exposes the ARIA `progressbar` role with the right value bounds; an indeterminate bar omits `aria-valuenow` so assistive tech announces it as busy rather than a fixed percentage.",
    "props": [
      {
        "name": "ProgressProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\" | \"children\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "ProgressColor",
            "doc": "Fill color; maps to `progress-<color>`. Omit for a neutral bar."
          },
          {
            "name": "size",
            "optional": true,
            "type": "ProgressSize",
            "doc": "Default `md`. Height lines up with same-size fields."
          },
          {
            "name": "value",
            "optional": true,
            "type": "number",
            "doc": "Current value, from 0 to `max`. Omit entirely for an indeterminate (unknown-duration) loading bar."
          },
          {
            "name": "max",
            "optional": true,
            "type": "number",
            "doc": "Upper bound of `value`. Default `100`."
          },
          {
            "name": "showValue",
            "optional": true,
            "type": "boolean",
            "doc": "Show a value label above the bar (skipped while indeterminate). Default `false`."
          },
          {
            "name": "formatValue",
            "optional": true,
            "type": "(value: number, max: number) => React.ReactNode",
            "doc": "Format the label. Default: rounded percentage, e.g. `\"60%\"`."
          },
          {
            "name": "label",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Optional leading label shown beside the value, e.g. `\"Uploading\"`."
          }
        ]
      }
    ],
    "usageExample": "import { useState, useEffect } from \"react\";\nimport { Progress, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row, LabeledRow } from \"../lib/Section\";\nimport { COLORS, SIZES } from \"../lib/data\";\n\nexport function ProgressDemo() {\n    const [pct, setPct] = useState(40);\n    const [upload, setUpload] = useState(0);\n\n    useEffect(() => {\n        const id = setInterval(\n            () => setUpload((p) => (p >= 100 ? 0 : p + 4)),\n            180,\n        );\n        return () => clearInterval(id);\n    }, []);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <div className=\"grid max-w-md gap-4\">\n                    {COLORS.map((color) => (\n                        <LabeledRow key={color} label={color}>\n                            <Progress color={color} value={65} />\n                        </LabeledRow>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex max-w-md flex-col gap-2\">\n                    {SIZES.map((size) => (\n                        <Progress key={size} color=\"primary\" size={size} value={60} />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"showValue · built-in label row (replaces hand-rolled LabeledRow)\">\n                <div className=\"grid max-w-md gap-4\">\n                    <Progress color=\"brand\" value={upload} showValue label=\"Uploading photo.png\" />\n                    <Progress color=\"success\" value={3} max={4} showValue formatValue={(v, max) => `${v} of ${max} steps`} label=\"Onboarding\" />\n                    <Progress color=\"warning\" value={pct} showValue />\n                </div>\n            </Section>\n\n            <Section title=\"Real use · task + upload progress\">\n                <div className=\"grid max-w-md gap-4\">\n                    <LabeledRow label=\"Onboarding · 3 of 4 steps\">\n                        <Progress color=\"success\" value={3} max={4} />\n                    </LabeledRow>\n                    <LabeledRow label={`Uploading photo.png · ${upload}%`}>\n                        <Progress color=\"brand\" value={upload} />\n                    </LabeledRow>\n                    <LabeledRow label=\"Indeterminate (duration unknown)\">\n                        <Progress color=\"primary\" />\n                    </LabeledRow>\n                    <LabeledRow label={`Interactive · ${pct}%`}>\n                        <Progress color=\"warning\" value={pct} />\n                    </LabeledRow>\n                    <Row>\n                        <Button\n                            size=\"sm\"\n                            variant=\"outline\"\n                            color=\"neutral\"\n                            onClick={() => setPct((p) => Math.max(0, p - 10))}\n                        >\n                            −10\n                        </Button>\n                        <Button\n                            size=\"sm\"\n                            variant=\"outline\"\n                            color=\"neutral\"\n                            onClick={() => setPct((p) => Math.min(100, p + 10))}\n                        >\n                            +10\n                        </Button>\n                    </Row>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "RadialProgress",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/radial-progress.tsx",
    "description": "Silica RadialProgress — a circular progress ring with a centered label. <RadialProgress value={70} color=\"success\" /> <RadialProgress value={40} diameter=\"7rem\" thickness=\"0.75rem\">40%</RadialProgress> Defaults the label to `{value}%`; pass children to override.",
    "props": [
      {
        "name": "RadialProgressProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "number",
            "doc": "Progress percentage, 0–100."
          },
          {
            "name": "diameter",
            "optional": true,
            "type": "string",
            "doc": "Overall diameter (any CSS length). Default `5rem`. Named `diameter`, not `size`, on purpose: everywhere else in Silica `size` is the `xs`–`xl` scale, so `size=\"lg\"` used to type-check here and emit `--size: lg` — an invalid length that silently collapsed the ring. Pairs with `thickness`, which is also a CSS length."
          },
          {
            "name": "thickness",
            "optional": true,
            "type": "string",
            "doc": "Ring thickness (any CSS length). Default `0.5rem`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "RadialProgressColor",
            "doc": "Accent color. Default primary."
          }
        ]
      }
    ],
    "usageExample": "import { useState, useEffect } from \"react\";\nimport { RadialProgress } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nexport function RadialProgressDemo() {\n    const [pct, setPct] = useState(0);\n\n    useEffect(() => {\n        const id = setInterval(() => setPct((p) => (p >= 100 ? 0 : p + 5)), 200);\n        return () => clearInterval(id);\n    }, []);\n\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Row>\n                    {COLORS.slice(0, 6).map((color) => (\n                        <RadialProgress key={color} value={70} color={color} />\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    <RadialProgress value={60} color=\"primary\" diameter=\"3rem\" thickness=\"0.35rem\" />\n                    <RadialProgress value={60} color=\"primary\" diameter=\"5rem\" thickness=\"0.5rem\" />\n                    <RadialProgress value={60} color=\"primary\" diameter=\"8rem\" thickness=\"0.75rem\" />\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · animated upload progress\">\n                <RadialProgress value={pct} color=\"brand\" diameter=\"6rem\" />\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Skeleton",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/skeleton.tsx",
    "description": "Silica Skeleton — an animated placeholder for loading content. <Skeleton className=\"h-32 w-full\" /> // block <Skeleton shape=\"circle\" className=\"h-12 w-12\" /> // avatar placeholder <Skeleton shape=\"text\" className=\"w-40\" /> // one line of text Owns only the fill, radius, and shimmer — size it yourself. Marked `aria-hidden` by default (it's decorative; announce loading with an `aria-busy` region around it); override via props if you need otherwise.",
    "props": [
      {
        "name": "SkeletonProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "shape",
            "optional": true,
            "type": "SkeletonShape",
            "doc": "`block` (default, `--radius-field`), `circle` (avatar/dot placeholder), or `text` (a pill-rounded line sized in `em`). Give it dimensions with utilities or inline `style`."
          }
        ]
      }
    ],
    "usageExample": "import { Skeleton } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function SkeletonDemo() {\n    return (\n        <>\n            <Section title=\"Shapes\">\n                <Row>\n                    <Skeleton className=\"h-6 w-32\" />\n                    <Skeleton shape=\"circle\" className=\"h-12 w-12\" />\n                    <Skeleton shape=\"text\" className=\"w-40\" />\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · loading card\">\n                <div className=\"flex max-w-sm flex-col gap-3 rounded-box border border-base-300 p-4\">\n                    <div className=\"flex items-center gap-3\">\n                        <Skeleton shape=\"circle\" className=\"h-10 w-10\" />\n                        <div className=\"flex flex-1 flex-col gap-2\">\n                            <Skeleton shape=\"text\" className=\"w-32\" />\n                            <Skeleton shape=\"text\" className=\"w-20\" />\n                        </div>\n                    </div>\n                    <Skeleton className=\"h-32 w-full\" />\n                    <Skeleton shape=\"text\" className=\"w-full\" />\n                    <Skeleton shape=\"text\" className=\"w-2/3\" />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Status",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/status.tsx",
    "description": "Silica Status — a small status dot, optionally pinging. <Status color=\"success\" ping label=\"Online\" /> <Status color=\"warning\" size=\"sm\" />",
    "props": [
      {
        "name": "StatusProps",
        "extends": "extends React.HTMLAttributes<HTMLSpanElement>",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "StatusColor",
            "doc": "Dot color."
          },
          {
            "name": "size",
            "optional": true,
            "type": "StatusSize",
            "doc": "Dot size."
          },
          {
            "name": "ping",
            "optional": true,
            "type": "boolean",
            "doc": "Add an expanding \"ping\" ring."
          },
          {
            "name": "label",
            "optional": true,
            "type": "string",
            "doc": "Accessible label (e.g. \"Online\")."
          }
        ]
      }
    ],
    "usageExample": "import { Status } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\nimport { COLORS, SIZES } from \"../lib/data\";\n\nexport function StatusDemo() {\n    return (\n        <>\n            <Section title=\"Colors\">\n                <Row>\n                    {COLORS.map((color) => (\n                        <span key={color} className=\"flex items-center gap-1.5 text-sm\">\n                            <Status color={color} label={color} />\n                            {color}\n                        </span>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    {SIZES.map((size) => (\n                        <span key={size} className=\"flex items-center gap-1.5 text-sm\">\n                            <Status color=\"primary\" size={size} />\n                            {size}\n                        </span>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Real use · team presence\">\n                <div className=\"flex flex-col gap-2 text-sm\">\n                    <span className=\"flex items-center gap-1.5\">\n                        <Status color=\"success\" ping label=\"Online\" />\n                        Ada Lovelace — active now\n                    </span>\n                    <span className=\"flex items-center gap-1.5\">\n                        <Status color=\"warning\" label=\"Away\" />\n                        Grace Hopper — away\n                    </span>\n                    <span className=\"flex items-center gap-1.5\">\n                        <Status color=\"neutral\" label=\"Offline\" />\n                        Alan Turing — offline\n                    </span>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "ToastProvider",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/toast.tsx",
    "description": "Silica ToastProvider — wrap your app once, then call `useToast().add(...)`. <ToastProvider> <App /> </ToastProvider> const toast = useToast(); toast.add({ title: \"Saved\", description: \"Your changes are saved.\", type: \"success\" }); For a sticky toast with a clickable action, pass `actionProps` (forwarded to Base UI's `Toast.Action`, which renders a `<button>`) — commonly paired with `timeout: 0` so it doesn't auto-dismiss before the user can act: toast.add({ title: \"New version available\", actionProps: { children: \"Refresh\", onClick: () => location.reload() }, timeout: 0, }); For a glass toast, pass a `className` through `data` (there's no direct `className` on the imperative `add()` call): toast.add({ title: \"Saved\", data: { className: \"glass\" } });",
    "props": [
      {
        "name": "ToastProviderProps",
        "members": []
      }
    ],
    "usageExample": null
  },
  {
    "name": "Tooltip",
    "package": "@wizeworks/silicaui-react",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui-react/src/tooltip.tsx",
    "description": "Silica Tooltip — behavior from Base UI, look from Silica's `.tooltip` CSS. <Tooltip content=\"Copy link\"> <Button variant=\"ghost\">Copy</Button> </Tooltip> Wrap a subtree in <TooltipProvider> to share a delay across many tooltips (adjacent ones then open instantly).",
    "props": [
      {
        "name": "TooltipProps",
        "extends": "extends PositioningProps",
        "members": [
          {
            "name": "content",
            "optional": false,
            "type": "React.ReactNode",
            "doc": "The floating content."
          },
          {
            "name": "children",
            "optional": false,
            "type": "React.ReactElement",
            "doc": "The trigger element — Base UI merges hover/focus behavior onto it."
          },
          {
            "name": "side",
            "optional": true,
            "type": "TooltipSide",
            "doc": "Which side of the trigger to prefer. Default `top` (flips to avoid collisions)."
          },
          {
            "name": "align",
            "optional": true,
            "type": "TooltipAlign",
            "doc": "Alignment along that side. Default `center`."
          },
          {
            "name": "sideOffset",
            "optional": true,
            "type": "number",
            "doc": "Gap between trigger and popup, in px. Default `8`."
          },
          {
            "name": "delay",
            "optional": true,
            "type": "number",
            "doc": "Hover-open delay in ms. Default `600` (Base UI)."
          },
          {
            "name": "closeDelay",
            "optional": true,
            "type": "number",
            "doc": "Close delay in ms. Default `0`."
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled open state."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": "Uncontrolled initial open state."
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": "Disable the tooltip entirely."
          },
          {
            "name": "arrow",
            "optional": true,
            "type": "boolean",
            "doc": "Show the little arrow. Default `true`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": "Extra class on the popup surface."
          },
          {
            "name": "popupProps",
            "optional": true,
            "type": "React.ComponentProps<typeof BaseTooltip.Popup> & {\n    [key: `data-${string}`]: string | undefined;\n  }",
            "doc": "Props forwarded to the popup surface itself. The popup renders in a PORTAL, so it sits OUTSIDE any `[data-theme]` island the trigger lives in — pass `popupProps={{ \"data-theme\": \"…\" }}` to re-establish the theme tokens on the popup's own root (mirrors `Select`'s and `Combobox`'s `popupProps`)."
          },
          {
            "name": "anchor",
            "optional": true,
            "type": "BasePositionerProps[\"anchor\"]",
            "doc": "What to position against. Defaults to the component's own trigger. Accepts an element, a ref, a function returning either, or a VIRTUAL element — anything with `getBoundingClientRect()` — which is how you pin a popup to a pointer, a text caret, or a spot on a canvas that has no DOM node. <PopoverContent anchor={rowRef} /> <PopoverContent anchor={{ getBoundingClientRect: () => new DOMRect(x, y, 0, 0) }} />",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "positionMethod",
            "optional": true,
            "type": "BasePositionerProps[\"positionMethod\"]",
            "doc": "`absolute` (default) or `fixed`. Use `fixed` to escape a clipping ancestor.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "alignOffset",
            "optional": true,
            "type": "BasePositionerProps[\"alignOffset\"]",
            "doc": "Offset along the alignment axis, in px. Pairs with `align`.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionBoundary",
            "optional": true,
            "type": "BasePositionerProps[\"collisionBoundary\"]",
            "doc": "The element the popup must stay inside. Defaults to the viewport — set it to a scroll container so the popup collides with the panel, not the window.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionPadding",
            "optional": true,
            "type": "BasePositionerProps[\"collisionPadding\"]",
            "doc": "Inset from the collision boundary, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "collisionAvoidance",
            "optional": true,
            "type": "BasePositionerProps[\"collisionAvoidance\"]",
            "doc": "Which collision strategy runs per axis (`flip`, `shift`, `none`).",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "sticky",
            "optional": true,
            "type": "BasePositionerProps[\"sticky\"]",
            "doc": "Keep the popup glued to the anchor while it scrolls out of view.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "arrowPadding",
            "optional": true,
            "type": "BasePositionerProps[\"arrowPadding\"]",
            "doc": "Minimum distance from the popup's corner to the arrow, in px.",
            "inheritedFrom": "PositioningProps"
          },
          {
            "name": "disableAnchorTracking",
            "optional": true,
            "type": "BasePositionerProps[\"disableAnchorTracking\"]",
            "doc": "Stop re-measuring when the anchor moves. Cheaper, but goes stale.",
            "inheritedFrom": "PositioningProps"
          }
        ]
      },
      {
        "name": "TooltipProviderProps",
        "members": []
      }
    ],
    "usageExample": "import { Tooltip, TooltipProvider, Button } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function TooltipDemo() {\n    return (\n        <TooltipProvider>\n            <Section title=\"Real use · sides (hover or focus a trigger)\">\n                <Row>\n                    {([\"top\", \"right\", \"bottom\", \"left\"] as const).map((side) => (\n                        <Tooltip key={side} content={`On the ${side}`} side={side}>\n                            <Button variant=\"outline\" color=\"neutral\">\n                                {side}\n                            </Button>\n                        </Tooltip>\n                    ))}\n                </Row>\n            </Section>\n\n            <Section title=\"Grouped delay (adjacent tooltips open instantly)\">\n                <Row>\n                    <Tooltip content=\"Copy link\">\n                        <Button variant=\"ghost\" color=\"neutral\">\n                            Copy\n                        </Button>\n                    </Tooltip>\n                    <Tooltip content=\"Share\">\n                        <Button variant=\"ghost\" color=\"neutral\">\n                            Share\n                        </Button>\n                    </Tooltip>\n                    <Tooltip content=\"Delete\">\n                        <Button variant=\"ghost\" color=\"error\">\n                            Delete\n                        </Button>\n                    </Tooltip>\n                </Row>\n            </Section>\n        </TooltipProvider>\n    );\n}"
  },
  {
    "name": "AppShell",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/app-shell.tsx",
    "description": "Silica AppShell — the outer page skeleton (one CSS Grid, named areas). Render whichever slots you need — `AppShellSidebar`/`AppShellHeader`/ `AppShellFooter` are all optional; an unrendered slot's area collapses to zero size, so the SAME AppShell covers \"sidebar+top+footer\", \"top+footer\", \"sidebar only\", etc. `AppShellMain` is the one required slot. <AppShell> <AppShellSidebar><Sidebar>…</Sidebar></AppShellSidebar> <AppShellHeader><Navbar>…</Navbar></AppShellHeader> <AppShellMain>…page content…</AppShellMain> <AppShellFooter><Footer>…</Footer></AppShellFooter> </AppShell> // top + footer only, no sidebar: <AppShell> <AppShellHeader><Navbar>…</Navbar></AppShellHeader> <AppShellMain>…</AppShellMain> <AppShellFooter><Footer>…</Footer></AppShellFooter> </AppShell>",
    "props": [
      {
        "name": "AppShellProps",
        "members": []
      },
      {
        "name": "AppShellSidebarProps",
        "members": []
      },
      {
        "name": "AppShellHeaderProps",
        "members": []
      },
      {
        "name": "AppShellMainProps",
        "members": []
      },
      {
        "name": "AppShellFooterProps",
        "members": []
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    AppShell,\n    AppShellSidebar,\n    AppShellHeader,\n    AppShellMain,\n    AppShellFooter,\n    SidebarProvider,\n    Sidebar,\n    SidebarHeader,\n    SidebarHeaderBrand,\n    SidebarContent,\n    SidebarGroup,\n    SidebarGroupLabel,\n    SidebarItem,\n    SidebarTrigger,\n    Navbar,\n    NavbarStart,\n    NavbarEnd,\n    Footer,\n    Wordmark,\n    Button,\n} from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst HomeIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M3 12 12 3l9 9\" /> <path d=\"M5 10v10h14V10\" />\n    </svg>\n);\nconst SettingsIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M14 17H5\" /> <path d=\"M19 7h-9\" /> <circle cx=\"17\" cy=\"17\" r=\"3\" /> <circle cx=\"7\" cy=\"7\" r=\"3\" />\n    </svg>\n);\n\nexport function AppShellDemo() {\n    const [active, setActive] = useState(\"dashboard\");\n\n    return (\n        <>\n            <Section title=\"Real use · sidebar + header + footer (same AppShell as below, different slots)\">\n                <div className=\"h-[26rem] w-full max-w-2xl overflow-hidden rounded-box border border-base-300\">\n                    <SidebarProvider>\n                        <AppShell>\n                            <AppShellSidebar>\n                                <Sidebar>\n                                    <SidebarHeader>\n                                        <SidebarHeaderBrand>\n                                            <Wordmark size=\"sm\" color=\"primary\">Acme</Wordmark>\n                                        </SidebarHeaderBrand>\n                                        <SidebarTrigger />\n                                    </SidebarHeader>\n                                    <SidebarContent>\n                                        <SidebarGroup>\n                                            <SidebarGroupLabel>Workspace</SidebarGroupLabel>\n                                            <SidebarItem\n                                                icon={HomeIcon}\n                                                active={active === \"dashboard\"}\n                                                onClick={() => setActive(\"dashboard\")}\n                                            >\n                                                Dashboard\n                                            </SidebarItem>\n                                            <SidebarItem\n                                                icon={SettingsIcon}\n                                                active={active === \"settings\"}\n                                                onClick={() => setActive(\"settings\")}\n                                            >\n                                                Settings\n                                            </SidebarItem>\n                                        </SidebarGroup>\n                                    </SidebarContent>\n                                </Sidebar>\n                            </AppShellSidebar>\n\n                            <AppShellHeader>\n                                <Navbar className=\"border-b border-base-300\">\n                                    <NavbarStart>\n                                        <span className=\"text-sm font-semibold capitalize\">{active}</span>\n                                    </NavbarStart>\n                                    <NavbarEnd>\n                                        <Button size=\"sm\" color=\"primary\">\n                                            New\n                                        </Button>\n                                    </NavbarEnd>\n                                </Navbar>\n                            </AppShellHeader>\n\n                            <AppShellMain className=\"p-6\">\n                                <p className=\"text-sm opacity-70\">\n                                    Content for “{active}” — this pane scrolls independently; try\n                                    collapsing the sidebar.\n                                </p>\n                                {Array.from({ length: 12 }, (_, i) => (\n                                    <p key={i} className=\"mt-3 text-sm opacity-60\">\n                                        Filler paragraph {i + 1} to make the main area scroll.\n                                    </p>\n                                ))}\n                            </AppShellMain>\n\n                            <AppShellFooter>\n                                <Footer center className=\"border-t border-base-300 py-3 text-xs\">\n                                    © 2026 Acme, Inc.\n                                </Footer>\n                            </AppShellFooter>\n                        </AppShell>\n                    </SidebarProvider>\n                </div>\n            </Section>\n\n            <Section title=\"Same AppShell, no sidebar · header + footer only\">\n                <div className=\"h-64 w-full max-w-2xl overflow-hidden rounded-box border border-base-300\">\n                    <AppShell>\n                        <AppShellHeader>\n                            <Navbar className=\"border-b border-base-300\">\n                                <NavbarStart>\n                                    <span className=\"text-sm font-semibold\">Acme</span>\n                                </NavbarStart>\n                            </Navbar>\n                        </AppShellHeader>\n                        <AppShellMain className=\"p-6\">\n                            <p className=\"text-sm opacity-70\">\n                                No sidebar slot rendered — its grid column collapses to zero\n                                automatically.\n                            </p>\n                        </AppShellMain>\n                        <AppShellFooter>\n                            <Footer center className=\"border-t border-base-300 py-3 text-xs\">\n                                © 2026 Acme, Inc.\n                            </Footer>\n                        </AppShellFooter>\n                    </AppShell>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Divider",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/divider.tsx",
    "description": "Silica Divider — a plain or labeled separator. <Divider /> // plain rule <Divider>OR</Divider> // centered label with rules on each side <Divider orientation=\"vertical\" /> // vertical rule inside a flex row",
    "props": [
      {
        "name": "DividerProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "orientation",
            "optional": true,
            "type": "DividerOrientation",
            "doc": "`horizontal` (default) or `vertical` (for row layouts)."
          }
        ]
      }
    ],
    "usageExample": "import { Divider, Button } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function DividerDemo() {\n    return (\n        <>\n            <Section title=\"Plain & labeled\">\n                <div className=\"flex max-w-sm flex-col\">\n                    <p className=\"text-sm opacity-70\">Continue with your account</p>\n                    <Divider />\n                    <p className=\"text-sm opacity-70\">Or use a different method</p>\n                </div>\n            </Section>\n\n            <Section title=\"Real use · sign-in split\">\n                <div className=\"flex max-w-sm flex-col gap-3\">\n                    <Button color=\"neutral\" variant=\"outline\">\n                        Continue with email\n                    </Button>\n                    <Divider>OR</Divider>\n                    <Button color=\"primary\">Continue with Google</Button>\n                </div>\n            </Section>\n\n            <Section title=\"Vertical (in a row)\">\n                <div className=\"flex h-8 items-center text-sm\">\n                    <span>Docs</span>\n                    <Divider orientation=\"vertical\" />\n                    <span>Pricing</span>\n                    <Divider orientation=\"vertical\" />\n                    <span>Blog</span>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Footer",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/footer.tsx",
    "description": "Silica Footer — a responsive multi-column site footer. <Footer> <nav> <FooterTitle>Product</FooterTitle> <Link href=\"#\">Features</Link> <Link href=\"#\">Pricing</Link> </nav> …more columns… </Footer> Renders a `<footer>`. Each direct child (e.g. a `<nav>`) becomes a vertical stack of links under its `<FooterTitle>`.",
    "props": [
      {
        "name": "FooterProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "center",
            "optional": true,
            "type": "boolean",
            "doc": "Center every column and its contents (single-row, centered footer)."
          }
        ]
      },
      {
        "name": "FooterTitleProps",
        "members": []
      }
    ],
    "usageExample": "import { Footer, FooterTitle, Link } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function FooterDemo() {\n    return (\n        <>\n            <Section title=\"Real use · multi-column site footer\">\n                <Footer className=\"rounded-box border border-base-300 p-6\">\n                    <nav>\n                        <FooterTitle>Product</FooterTitle>\n                        <Link href=\"#\">Features</Link>\n                        <Link href=\"#\">Pricing</Link>\n                        <Link href=\"#\">Changelog</Link>\n                    </nav>\n                    <nav>\n                        <FooterTitle>Company</FooterTitle>\n                        <Link href=\"#\">About</Link>\n                        <Link href=\"#\">Careers</Link>\n                        <Link href=\"#\">Contact</Link>\n                    </nav>\n                    <nav>\n                        <FooterTitle>Legal</FooterTitle>\n                        <Link href=\"#\">Terms</Link>\n                        <Link href=\"#\">Privacy</Link>\n                    </nav>\n                </Footer>\n            </Section>\n\n            <Section title=\"Centered\">\n                <Footer center className=\"rounded-box border border-base-300 p-6\">\n                    <div>\n                        <p>© 2026 Silica UI — all rights reserved.</p>\n                    </div>\n                </Footer>\n            </Section>\n\n            <Section title=\"Glass · footer over a colored page background\">\n                <div\n                    className=\"flex flex-col justify-end gap-24 rounded-box p-4\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Footer className=\"glass p-6\">\n                        <nav>\n                            <FooterTitle>Product</FooterTitle>\n                            <Link href=\"#\">Features</Link>\n                            <Link href=\"#\">Pricing</Link>\n                            <Link href=\"#\">Changelog</Link>\n                        </nav>\n                        <nav>\n                            <FooterTitle>Company</FooterTitle>\n                            <Link href=\"#\">About</Link>\n                            <Link href=\"#\">Careers</Link>\n                            <Link href=\"#\">Contact</Link>\n                        </nav>\n                        <nav>\n                            <FooterTitle>Legal</FooterTitle>\n                            <Link href=\"#\">Terms</Link>\n                            <Link href=\"#\">Privacy</Link>\n                        </nav>\n                    </Footer>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Hero",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/hero.tsx",
    "description": "Silica Hero — a full-width banner that centers its content. <Hero style={{ backgroundImage: `url(${img})` }}> <HeroOverlay /> <HeroContent className=\"text-neutral-content text-center\"> <div> <h1 className=\"text-5xl font-bold\">Ship faster</h1> <p>…</p> <Button color=\"primary\">Get started</Button> </div> </HeroContent> </Hero> Set a background image via the `style` prop; add `<HeroOverlay />` to tint it.",
    "props": [
      {
        "name": "HeroProps",
        "members": []
      }
    ],
    "usageExample": "import { Hero, HeroContent, HeroOverlay, Button } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function HeroDemo() {\n    return (\n        <Section title=\"Real use · landing banner\">\n            <Hero\n                className=\"rounded-box\"\n                style={{\n                    backgroundImage:\n                        \"linear-gradient(135deg, #6366f1, #ec4899)\",\n                }}\n            >\n                <HeroOverlay />\n                <HeroContent className=\"text-center text-white\">\n                    <div className=\"max-w-md\">\n                        <h1 className=\"text-4xl font-bold\">Ship faster with Silica</h1>\n                        <p className=\"py-4 opacity-90\">\n                            One token system, every component, zero lock-in.\n                        </p>\n                        <Button color=\"primary\">Get started</Button>\n                    </div>\n                </HeroContent>\n            </Hero>\n        </Section>\n    );\n}"
  },
  {
    "name": "Mask",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/mask.tsx",
    "description": "Silica Mask — clips its content (usually an `<img>`) to a shape. <Mask variant=\"hexagon\" className=\"w-24 h-24\"> <img src={photo} alt=\"\" className=\"w-full h-full object-cover\" /> </Mask> Give the mask a size (via `className`/`style`); the shape scales to fill it. You can also apply the classes directly to an `<img>` if you prefer.",
    "props": [
      {
        "name": "MaskProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "variant",
            "optional": false,
            "type": "MaskVariant",
            "doc": "The shape to clip to."
          }
        ]
      }
    ],
    "usageExample": "import { Mask } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst PHOTO = `data:image/svg+xml,${encodeURIComponent(\n    `<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>` +\n        `<defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'>` +\n        `<stop offset='0' stop-color='#6366f1'/><stop offset='1' stop-color='#ec4899'/>` +\n        `</linearGradient></defs>` +\n        `<rect width='100' height='100' fill='url(#g)'/>` +\n        `<circle cx='50' cy='40' r='18' fill='rgba(255,255,255,.92)'/>` +\n        `<rect x='22' y='62' width='56' height='38' rx='19' fill='rgba(255,255,255,.92)'/>` +\n        `</svg>`,\n)}`;\n\nconst SHAPES = [\n    \"squircle\",\n    \"circle\",\n    \"heart\",\n    \"hexagon\",\n    \"hexagon-2\",\n    \"pentagon\",\n    \"diamond\",\n    \"triangle\",\n    \"star\",\n    \"star-2\",\n    \"decagon\",\n    \"parallelogram\",\n] as const;\n\nexport function MaskDemo() {\n    return (\n        <Section title=\"Real use · avatar photo clipped to every shape\">\n            <Row>\n                {SHAPES.map((shape) => (\n                    <Mask key={shape} variant={shape} className=\"h-16 w-16\">\n                        <img src={PHOTO} alt=\"\" className=\"h-full w-full object-cover\" />\n                    </Mask>\n                ))}\n            </Row>\n        </Section>\n    );\n}"
  },
  {
    "name": "ScrollArea",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/scroll-area.tsx",
    "description": "Silica ScrollArea — a panel with custom overlay scrollbars. <ScrollArea className=\"h-64 w-72\"> <div className=\"p-4\">…long content…</div> </ScrollArea> Give it a bounded size (via `className`/`style`); the content scrolls inside and the overlay scrollbars fade in on hover. Use `orientation=\"both\"` for a two-axis panel.",
    "props": [
      {
        "name": "ScrollAreaProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "orientation",
            "optional": true,
            "type": "ScrollAreaOrientation",
            "doc": "Which scrollbars to render. Default `vertical`."
          }
        ]
      }
    ],
    "usageExample": "import { ScrollArea } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst ITEMS = Array.from({ length: 30 }, (_, i) => `Item ${i + 1}`);\n\nexport function ScrollAreaDemo() {\n    return (\n        <>\n            <Section title=\"Real use · scrollable list panel\">\n                <ScrollArea className=\"h-64 w-72 rounded-box border border-base-300\">\n                    <div className=\"flex flex-col gap-1 p-4\">\n                        {ITEMS.map((item) => (\n                            <div key={item} className=\"rounded-field px-2 py-1 text-sm\">\n                                {item}\n                            </div>\n                        ))}\n                    </div>\n                </ScrollArea>\n            </Section>\n\n            <Section title=\"Both axes\">\n                <Row>\n                    <ScrollArea\n                        orientation=\"both\"\n                        className=\"h-48 w-64 rounded-box border border-base-300\"\n                    >\n                        <div style={{ width: \"40rem\", height: \"24rem\" }} className=\"p-4\">\n                            Wide + tall content — scroll both directions.\n                        </div>\n                    </ScrollArea>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "ScrollStrip",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/scroll-strip.tsx",
    "description": "Silica ScrollStrip — a horizontal strip that says so when there is more of it off-screen. <ScrollStrip label=\"filters\" trackClassName=\"gap-2\"> {filters.map((f) => <Badge key={f}>{f}</Badge>)} </ScrollStrip> `overflow-x-auto` alone is a trap on anything that can be dragged narrow: the content is reachable, but the only thing announcing it exists is a scrollbar that overlay-scrollbar platforms never draw. This mounts real in-flow prev/next controls the moment the content stops fitting — in flow, not overlaid, so they never cover the edge item you were trying to read. `Tabs` already does this on its own (see `TabsList`'s `scrollable`); reach for this for any other row — filter chips, a toolbar, a card rail. Use `Carousel` instead when the content is a deck of full-width slides that should snap one at a time; this is for a row of many small things where the scroll position is continuous and every item is meant to be visible at once.",
    "props": [
      {
        "name": "ScrollStripProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onScroll\">",
        "members": [
          {
            "name": "label",
            "optional": false,
            "type": "string",
            "doc": "What the strip holds, as a plural noun — it names the controls (\"Scroll **tabs** forward\") and the scroll region itself. Required: a bare chevron with no accessible name is the most common way this pattern ships broken."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Control size on the `xs`–`xl` scale. Default `md`."
          },
          {
            "name": "fade",
            "optional": true,
            "type": "boolean",
            "doc": "Also fade the clipped edge, as a second and quieter signal — the controls say the strip CAN scroll, the fade says the content continues right there. Off by default: a strip that fits must not look dimmed at the edges."
          },
          {
            "name": "step",
            "optional": true,
            "type": "number",
            "doc": "Fraction of the visible width moved per press, `0`–`1`. Default `0.8` — deliberately not a full screenful, because the sliver of overlap is what makes it read as the strip moving rather than jumping somewhere new."
          },
          {
            "name": "controls",
            "optional": true,
            "type": "boolean",
            "doc": "Render the prev/next controls. Default `true`. Setting `false` keeps the scroller (and its keyboard reachability) but drops the buttons — for a strip whose overflow is already advertised some other way."
          },
          {
            "name": "trackClassName",
            "optional": true,
            "type": "string",
            "doc": "Extra classes for the scroller itself, e.g. `gap-2 py-1`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Badge, Button, ScrollStrip } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\n// Six, not more: the pane has to be draggable to a width where they all FIT,\n// or the demo only ever shows one of the two states it exists to contrast.\nconst TABS = [\"Overview\", \"Timeline\", \"Messages\", \"Activity\", \"Documents\", \"Details\"];\n\nconst CHIPS = [\"All\", \"Open\", \"Pending review\", \"Blocked\", \"Scheduled\", \"Archived\", \"Draft\"];\n\nconst SIZES = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as const;\n\nexport function ScrollStripDemo() {\n    // The demo has to be narrow-able, because the whole component only exists\n    // for the width at which the content stops fitting — a fixed-width showcase\n    // would never once show the controls.\n    const [width, setWidth] = useState(28);\n    const [active, setActive] = useState(\"Overview\");\n\n    return (\n        <>\n            <Section title=\"Real use · a tab strip in a pane you can drag narrow\">\n                <div className=\"flex flex-col gap-3\">\n                    <label className=\"flex items-center gap-3 text-sm\">\n                        <span className=\"w-24 shrink-0\">Pane width</span>\n                        <input\n                            type=\"range\"\n                            min={14}\n                            max={48}\n                            value={width}\n                            onChange={(e) => setWidth(Number(e.target.value))}\n                            className=\"range range-sm max-w-xs\"\n                        />\n                        <span className=\"tabular-nums\">{width}rem</span>\n                    </label>\n\n                    <div\n                        className=\"rounded-box border border-base-300\"\n                        style={{ width: `${width}rem` }}\n                    >\n                        <ScrollStrip data-demo=\"pane\" label=\"tabs\" trackClassName=\"gap-1 p-1\">\n                            {TABS.map((tab) => (\n                                <Button\n                                    key={tab}\n                                    variant={tab === active ? \"soft\" : \"ghost\"}\n                                    color=\"neutral\"\n                                    size=\"sm\"\n                                    onClick={() => setActive(tab)}\n                                >\n                                    {tab}\n                                </Button>\n                            ))}\n                        </ScrollStrip>\n                        <div className=\"border-t border-base-300 p-4 text-sm\">{active}</div>\n                    </div>\n                    <p className=\"max-w-md text-sm\">\n                        Drag it narrow: the pair of controls appears the moment a tab falls\n                        off the edge, and each one disables at its end rather than\n                        disappearing — so the strip never jumps sideways.\n                    </p>\n                </div>\n            </Section>\n\n            <Section title=\"Edge fade — a second, quieter signal\">\n                <div className=\"flex w-80 flex-col gap-4\">\n                    <ScrollStrip data-demo=\"fade\" label=\"filters\" fade size=\"sm\" trackClassName=\"gap-2\">\n                        {CHIPS.map((chip) => (\n                            <Badge key={chip} variant=\"outline\" color=\"neutral\">\n                                {chip}\n                            </Badge>\n                        ))}\n                    </ScrollStrip>\n                    <p className=\"text-sm\">\n                        The controls say the strip <em>can</em> scroll; the fade says the\n                        content continues right there. It clears itself at each end, so a\n                        strip that fits is never dimmed.\n                    </p>\n                </div>\n            </Section>\n\n            <Section title=\"Control sizes\">\n                <div className=\"flex flex-col gap-3\">\n                    {SIZES.map((size) => (\n                        <div key={size} className=\"flex items-center gap-3\">\n                            <span className=\"w-8 shrink-0 text-sm\">{size}</span>\n                            <div className=\"w-72\">\n                                <ScrollStrip data-demo={`strip-size-${size}`} label=\"cards\" size={size} trackClassName=\"gap-2\">\n                                    {CHIPS.map((chip) => (\n                                        <Badge key={chip} color=\"neutral\" variant=\"outline\">\n                                            {chip}\n                                        </Badge>\n                                    ))}\n                                </ScrollStrip>\n                            </div>\n                        </div>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Content that fits — no controls at all\">\n                <Row>\n                    <div className=\"w-96 rounded-box border border-base-300 p-1\">\n                        <ScrollStrip data-demo=\"fits\" label=\"tags\" trackClassName=\"gap-2\">\n                            <Badge color=\"neutral\">One</Badge>\n                            <Badge color=\"neutral\">Two</Badge>\n                            <Badge color=\"neutral\">Three</Badge>\n                        </ScrollStrip>\n                    </div>\n                </Row>\n            </Section>\n\n            <Section title=\"Right-to-left\">\n                <div dir=\"rtl\" className=\"w-72 rounded-box border border-base-300 p-1\">\n                    <ScrollStrip data-demo=\"rtl\" label=\"عناصر\" trackClassName=\"gap-2\">\n                        {CHIPS.map((chip) => (\n                            <Badge key={chip} variant=\"outline\" color=\"neutral\">\n                                {chip}\n                            </Badge>\n                        ))}\n                    </ScrollStrip>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Stack",
    "package": "@wizeworks/silicaui-react",
    "category": "Layout",
    "sourceFile": "silicaui-react/src/stack.tsx",
    "description": "Silica Stack — layers its children into a peeking deck (first child on top). With `interactive`, clicking (or Enter/Space) cycles the front card to the back so you can flip through the deck; the re-stack animates. Children stretch to the deck's WIDTH but keep their own height, so size the deck's width here and each card's height on the card: <Stack interactive className=\"w-48\"> <Card className=\"h-32 bg-primary text-primary-content\"><CardBody>1</CardBody></Card> <Card className=\"h-32 bg-secondary text-secondary-content\"><CardBody>2</CardBody></Card> <Card className=\"h-32 bg-accent text-accent-content\"><CardBody>3</CardBody></Card> </Stack>",
    "props": [
      {
        "name": "StackProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "peek",
            "optional": true,
            "type": "StackPeek",
            "doc": "Which way the deck peeks. `top` (default), `bottom`, `start`, or `end`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "How far the deck fans, as a share of the card's own size — `xs` (2%) through `xl` (9%), default `md` (5%). It scales with the card, so one value reads the same on a 128px thumbnail and a 600px hero card. For a distance off this ramp, set the property directly: `className=\"[--stack-peek:4%]\"` (any length works, including `12px`)."
          },
          {
            "name": "interactive",
            "optional": true,
            "type": "boolean",
            "doc": "Make the deck clickable — sends the front card to the back to reveal the next."
          }
        ]
      }
    ],
    "usageExample": "import { Stack, Card, CardBody } from \"@wizeworks/silicaui-react\";\nimport type { SilicaSize } from \"@wizeworks/silicaui-react\";\nimport { Section, LabeledRow } from \"../lib/Section\";\n\nconst CARDS = [\n    { label: \"1\", tone: \"bg-primary text-primary-content\" },\n    { label: \"2\", tone: \"bg-secondary text-secondary-content\" },\n    { label: \"3\", tone: \"bg-accent text-accent-content\" },\n];\n\n/**\n * The deck's three cards. A `stack` stretches its children to its own WIDTH but\n * leaves their height to them, so the height class goes here on the card — not\n * on the `<Stack>`, where it would size an empty box around content-height\n * cards and make the fan look far smaller than asked for.\n */\nfunction Deck({ card, body }: { card: string; body: string }) {\n    return (\n        <>\n            {CARDS.map((c) => (\n                <Card key={c.label} className={`${c.tone} ${card}`}>\n                    <CardBody className={`items-center justify-center ${body}`}>\n                        {c.label}\n                    </CardBody>\n                </Card>\n            ))}\n        </>\n    );\n}\n\nexport function StackDemo() {\n    return (\n        <>\n            <Section title=\"Real use · interactive peeking deck (click to cycle)\">\n                <Stack interactive className=\"w-48\" data-demo=\"interactive\">\n                    <Deck card=\"h-32\" body=\"text-2xl font-bold\" />\n                </Stack>\n            </Section>\n\n            <Section title=\"Peek direction\">\n                <div className=\"flex gap-8\">\n                    {([\"top\", \"bottom\", \"start\", \"end\"] as const).map((peek) => (\n                        <Stack\n                            key={peek}\n                            peek={peek}\n                            className=\"w-28\"\n                            data-demo={`dir-${peek}`}\n                        >\n                            <Deck card=\"h-20\" body=\"text-sm\" />\n                        </Stack>\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Fan distance\">\n                <div className=\"flex flex-wrap items-end gap-8\">\n                    {([\"xs\", \"sm\", \"md\", \"lg\", \"xl\"] as SilicaSize[]).map((size) => (\n                        <LabeledRow key={size} label={size}>\n                            <Stack\n                                size={size}\n                                className=\"w-32\"\n                                data-demo={`size-${size}`}\n                            >\n                                <Deck card=\"h-24\" body=\"text-sm\" />\n                            </Stack>\n                        </LabeledRow>\n                    ))}\n                </div>\n            </Section>\n\n            {/*\n              The peek is a share of the card's own size, so it survives a real\n              content-height card. Fixed-distance nudges did not: the shrink from\n              `scale()` out-ran them and the deck collapsed to a single card above\n              ~320px. Keep a large specimen here so that cannot come back\n              unnoticed — e2e/stack-peek.spec.ts measures exactly these two.\n            */}\n            <Section title=\"Large cards · the peek scales with the card\">\n                <div className=\"flex flex-wrap items-end gap-10\">\n                    <LabeledRow label=\"480 × 448\">\n                        <Stack className=\"w-[480px]\" data-demo=\"large\">\n                            <Deck card=\"h-[448px]\" body=\"text-4xl\" />\n                        </Stack>\n                    </LabeledRow>\n                    <LabeledRow label=\"480 × 448 · [--stack-peek:4%]\">\n                        <Stack\n                            className=\"w-[480px] [--stack-peek:4%]\"\n                            data-demo=\"large-tuned\"\n                        >\n                            <Deck card=\"h-[448px]\" body=\"text-4xl\" />\n                        </Stack>\n                    </LabeledRow>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Collapsible",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/collapsible.tsx",
    "description": "Silica Collapsible — a single show/hide disclosure (Base UI behavior, animated height). The primitive behind `Accordion`; use it when you have just one region to reveal. <Collapsible defaultOpen> <CollapsibleTrigger>Shipping details</CollapsibleTrigger> <CollapsiblePanel>Ships in 2–3 business days.</CollapsiblePanel> </Collapsible>",
    "props": [
      {
        "name": "CollapsibleProps",
        "members": []
      },
      {
        "name": "CollapsibleTriggerProps",
        "extends": "extends Styled<typeof BaseCollapsible.Trigger>",
        "members": [
          {
            "name": "chevron",
            "optional": true,
            "type": "boolean",
            "doc": "Set false to omit the built-in chevron. Ignored when `variant=\"icon\"`."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "\"default\" | \"icon\"",
            "doc": "`\"default\"` (the usual case) renders a full-width label + chevron row. `\"icon\"` renders just the chevron as a small circular button, sized like `AlertClose` — for placing a second disclosure control in its own slot (e.g. an Alert's trailing actions) while a `\"default\"` trigger elsewhere carries the visible label. Multiple triggers under one `Collapsible` share its open state automatically (Base UI reads it from context, not DOM position) — pass an `aria-label` on the icon one, since it has no visible text of its own."
          }
        ]
      },
      {
        "name": "CollapsiblePanelProps",
        "extends": "extends Styled<typeof BaseCollapsible.Panel>",
        "members": [
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { Collapsible, CollapsibleTrigger, CollapsiblePanel } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function CollapsibleDemo() {\n    return (\n        <Section title=\"Real use · single show/hide region\">\n            <Collapsible defaultOpen className=\"max-w-md\">\n                <CollapsibleTrigger>Shipping details</CollapsibleTrigger>\n                <CollapsiblePanel>\n                    Ships in 2–3 business days via standard shipping. Express options\n                    are available at checkout.\n                </CollapsiblePanel>\n            </Collapsible>\n        </Section>\n    );\n}"
  },
  {
    "name": "CommandPalette",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/command-palette.tsx",
    "description": "CommandPalette — a ⌘K launcher. Feed it a flat `items` list (optionally grouped); it filters as you type, moves the highlight with ↑/↓, runs the active command on Enter, and closes on Escape or backdrop click. Opens on ⌘K/Ctrl+K by default, or drive it with `open`/`onOpenChange`.",
    "props": [
      {
        "name": "CommandPaletteProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "CommandItem[]",
            "doc": "The commands to show and filter."
          },
          {
            "name": "open",
            "optional": true,
            "type": "boolean",
            "doc": "Controlled open state."
          },
          {
            "name": "defaultOpen",
            "optional": true,
            "type": "boolean",
            "doc": "Uncontrolled initial open state."
          },
          {
            "name": "onOpenChange",
            "optional": true,
            "type": "(open: boolean) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": "Search box placeholder."
          },
          {
            "name": "emptyMessage",
            "optional": true,
            "type": "string",
            "doc": "Shown when nothing matches."
          },
          {
            "name": "hotkey",
            "optional": true,
            "type": "boolean | string",
            "doc": "Global toggle hotkey. `true` (default) binds ⌘K / Ctrl+K; pass a single letter to rebind (still combined with ⌘/Ctrl); `false` disables it."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { CommandPalette, Button } from \"@wizeworks/silicaui-react\";\nimport type { CommandItem } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nexport function CommandPaletteDemo() {\n    const [open, setOpen] = useState(false);\n    const [lastCommand, setLastCommand] = useState<string | null>(null);\n\n    const items: CommandItem[] = [\n        {\n            id: \"new-page\",\n            label: \"Create new page\",\n            description: \"Add a blank page to this site\",\n            group: \"Actions\",\n            shortcut: \"⌘N\",\n            onSelect: () => setLastCommand(\"Create new page\"),\n        },\n        {\n            id: \"invite\",\n            label: \"Invite teammate\",\n            group: \"Actions\",\n            keywords: [\"member\", \"user\", \"collaborator\"],\n            onSelect: () => setLastCommand(\"Invite teammate\"),\n        },\n        {\n            id: \"theme-light\",\n            label: \"Switch to light theme\",\n            group: \"Preferences\",\n            onSelect: () => setLastCommand(\"Switch to light theme\"),\n        },\n        {\n            id: \"theme-dark\",\n            label: \"Switch to dark theme\",\n            group: \"Preferences\",\n            onSelect: () => setLastCommand(\"Switch to dark theme\"),\n        },\n        {\n            id: \"billing\",\n            label: \"Open billing settings\",\n            group: \"Preferences\",\n            disabled: true,\n            onSelect: () => setLastCommand(\"Open billing settings\"),\n        },\n    ];\n\n    return (\n        <Section title=\"Real use · ⌘K launcher (try the hotkey too)\">\n            <Row>\n                <Button color=\"primary\" onClick={() => setOpen(true)}>\n                    Open command palette\n                </Button>\n                {lastCommand && (\n                    <span className=\"text-sm opacity-70\">Ran: {lastCommand}</span>\n                )}\n            </Row>\n            <CommandPalette items={items} open={open} onOpenChange={setOpen} />\n        </Section>\n    );\n}"
  },
  {
    "name": "Dropzone",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/dropzone.tsx",
    "description": "Dropzone — drag files onto it or click to open the picker. Emits accepted files via `onFiles` and anything filtered out by `accept`/`maxSize` via `onReject`. Purely presentational about the *result* — render your own file list from what `onFiles` hands you.",
    "props": [
      {
        "name": "DropzoneProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onDrop\" | \"title\">",
        "members": [
          {
            "name": "onFiles",
            "optional": true,
            "type": "(files: File[]) => void",
            "doc": "Called with the accepted files (from a drop or the picker)."
          },
          {
            "name": "onReject",
            "optional": true,
            "type": "(rejections: DropzoneRejection[]) => void",
            "doc": "Called with files rejected by `accept` / `maxSize`."
          },
          {
            "name": "accept",
            "optional": true,
            "type": "string",
            "doc": "Native-style accept list, e.g. `\"image/*,.pdf\"`."
          },
          {
            "name": "multiple",
            "optional": true,
            "type": "boolean",
            "doc": "Allow selecting/dropping more than one file. Default `true`."
          },
          {
            "name": "maxSize",
            "optional": true,
            "type": "number",
            "doc": "Max size per file, in bytes."
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "title",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Primary line. Default `\"Drop files here, or click to browse\"`."
          },
          {
            "name": "hint",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Secondary hint line (e.g. accepted types)."
          },
          {
            "name": "icon",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Override the default upload icon."
          },
          {
            "name": "inputProps",
            "optional": true,
            "type": "React.InputHTMLAttributes<HTMLInputElement>",
            "doc": "Extra props for the underlying `<input type=file>`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Dropzone } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function DropzoneDemo() {\n    const [files, setFiles] = useState<string[]>([]);\n    const [rejected, setRejected] = useState<string[]>([]);\n\n    return (\n        <Section title=\"Real use · image upload with rejection reasons\">\n            <div className=\"flex max-w-md flex-col gap-3\">\n                <Dropzone\n                    accept=\"image/*\"\n                    maxSize={2 * 1024 * 1024}\n                    hint=\"PNG or JPG, up to 2MB\"\n                    onFiles={(fs) => setFiles(fs.map((f) => f.name))}\n                    onReject={(rs) =>\n                        setRejected(rs.map((r) => `${r.file.name} (${r.reason})`))\n                    }\n                />\n                {files.length > 0 && (\n                    <p className=\"text-xs text-success\">Accepted: {files.join(\", \")}</p>\n                )}\n                {rejected.length > 0 && (\n                    <p className=\"text-xs text-error\">Rejected: {rejected.join(\", \")}</p>\n                )}\n            </div>\n        </Section>\n    );\n}"
  },
  {
    "name": "EmptyState",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/empty-state.tsx",
    "description": "The centered \"nothing here yet\" placeholder — icon, title, description, and an action row. Drop it into an empty list, a table body, a card, or a panel. Slots are optional; `children` renders between the description and the actions for custom content.",
    "props": [
      {
        "name": "EmptyStateProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">",
        "members": [
          {
            "name": "icon",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Icon/illustration shown in the chip above the title."
          },
          {
            "name": "title",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Headline (e.g. \"No orders yet\")."
          },
          {
            "name": "description",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Supporting copy under the title."
          },
          {
            "name": "actions",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Action buttons/links rendered below the copy."
          },
          {
            "name": "size",
            "optional": true,
            "type": "EmptyStateSize",
            "doc": "`\"md\"` (default) or the more compact `\"sm\"`."
          }
        ]
      }
    ],
    "usageExample": "import { EmptyState, Button } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nfunction InboxIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" width=\"32\" height=\"32\">\n            <path d=\"M4 12h4l2 3h4l2-3h4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n            <path d=\"M5 6h14l1.5 6.5v6a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1v-6z\" strokeLinejoin=\"round\" />\n        </svg>\n    );\n}\n\nexport function EmptyStateDemo() {\n    return (\n        <>\n            <Section title=\"Real use · empty inbox\">\n                <EmptyState\n                    icon={<InboxIcon />}\n                    title=\"No messages yet\"\n                    description=\"When someone sends you a message, it'll show up here.\"\n                    actions={<Button color=\"primary\">Invite teammates</Button>}\n                    className=\"max-w-sm rounded-box border border-base-300\"\n                />\n            </Section>\n\n            <Section title=\"Compact (sm)\">\n                <EmptyState\n                    size=\"sm\"\n                    title=\"No results\"\n                    description=\"Try a different search term.\"\n                    className=\"max-w-sm rounded-box border border-base-300\"\n                />\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "PowerSearch",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/power-search.tsx",
    "description": "Silica PowerSearch — a search field that mixes free text with structured `field: value` filter chips (GitHub/Linear-style). Drive it with `usePowerSearchConfig` — this component is purely a view over that state. const search = usePowerSearchConfig({ fields: [ { key: \"status\", label: \"Status\", type: \"select\", options: [{ value: \"open\", label: \"Open\" }] }, { key: \"assignee\", label: \"Assignee\", type: \"text\" }, { key: \"due\", label: \"Due date\", type: \"date\" }, ], }); <PowerSearch {...search} placeholder=\"Search issues…\" />",
    "props": [
      {
        "name": "PowerSearchValuePickerProps",
        "members": [
          {
            "name": "value",
            "optional": false,
            "type": "string",
            "doc": ""
          },
          {
            "name": "onChange",
            "optional": false,
            "type": "(value: string) => void",
            "doc": ""
          },
          {
            "name": "onCommit",
            "optional": false,
            "type": "(value: string) => void",
            "doc": ""
          }
        ]
      },
      {
        "name": "PowerSearchProps",
        "members": [
          {
            "name": "fields",
            "optional": false,
            "type": "PowerSearchFieldDef[]",
            "doc": ""
          },
          {
            "name": "value",
            "optional": false,
            "type": "PowerSearchValue",
            "doc": ""
          },
          {
            "name": "setQuery",
            "optional": false,
            "type": "(query: string) => void",
            "doc": ""
          },
          {
            "name": "addTerm",
            "optional": false,
            "type": "(field: string, value: string) => void",
            "doc": ""
          },
          {
            "name": "updateTerm",
            "optional": false,
            "type": "(id: string, value: string) => void",
            "doc": ""
          },
          {
            "name": "removeTerm",
            "optional": false,
            "type": "(id: string) => void",
            "doc": ""
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "disabled",
            "optional": true,
            "type": "boolean",
            "doc": ""
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { PowerSearch, usePowerSearchConfig, Button, type PowerSearchFieldDef } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst FIELDS: PowerSearchFieldDef[] = [\n    {\n        key: \"status\",\n        label: \"Status\",\n        type: \"select\",\n        options: [\n            { value: \"open\", label: \"Open\" },\n            { value: \"in-progress\", label: \"In progress\" },\n            { value: \"done\", label: \"Done\" },\n        ],\n    },\n    { key: \"assignee\", label: \"Assignee\", type: \"text\", placeholder: \"e.g. ada\" },\n    { key: \"due\", label: \"Due date\", type: \"date\" },\n    { key: \"starred\", label: \"Starred\", type: \"boolean\" },\n    {\n        key: \"priority\",\n        label: \"Priority\",\n        type: \"custom\",\n        formatValue: (v) => \"⭐\".repeat(Number(v) || 1),\n        render: ({ onCommit }) => (\n            <div className=\"flex gap-1\">\n                {[1, 2, 3].map((n) => (\n                    <Button key={n} size=\"sm\" variant=\"outline\" onClick={() => onCommit(String(n))}>\n                        {\"⭐\".repeat(n)}\n                    </Button>\n                ))}\n            </div>\n        ),\n    },\n];\n\nexport function PowerSearchDemo() {\n    const search = usePowerSearchConfig({\n        fields: FIELDS,\n        defaultValue: {\n            query: \"\",\n            terms: [{ id: \"seed-1\", field: \"status\", value: \"in-progress\" }],\n        },\n    });\n\n    return (\n        <Section title=\"Real use · issue search (select/text/date/boolean/custom fields)\">\n            <div className=\"max-w-xl\">\n                <PowerSearch {...search} placeholder=\"Search issues…\" />\n                <pre className=\"mt-3 rounded-field bg-base-200 p-3 text-xs\">\n                    {JSON.stringify(search.value, null, 2)}\n                </pre>\n            </div>\n        </Section>\n    );\n}"
  },
  {
    "name": "ThemeController",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/theme-controller.tsx",
    "description": "Silica ThemeController — a control that switches the active `data-theme`. <ThemeController /> // light ⇄ dark toggle <ThemeController themes={[\"light\",\"dark\",\"dim\"]} labels /> Applies the theme to `document.documentElement` (or a `target`) and persists it to localStorage. Cycles to the next theme on click; a plain light/dark pair shows a sun/moon toggle.",
    "props": [
      {
        "name": "ThemeControllerProps",
        "members": [
          {
            "name": "themes",
            "optional": true,
            "type": "string[]",
            "doc": "The themes to cycle through. Default `[\"light\", \"dark\"]`."
          },
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled current theme."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial theme (falls back to stored value, then the target's current `data-theme`, then the first theme)."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(theme: string) => void",
            "doc": "Called with the new theme when it changes."
          },
          {
            "name": "onChange",
            "optional": true,
            "type": "(theme: string) => void",
            "doc": "@deprecated Use `onValueChange`. `onChange` is reserved for the native DOM handler on components that wrap a real form element; still honored here so this isn't a breaking change."
          },
          {
            "name": "target",
            "optional": true,
            "type": "HTMLElement | null | (() => HTMLElement | null)",
            "doc": "Element to set `data-theme` on. Default `document.documentElement`."
          },
          {
            "name": "storageKey",
            "optional": true,
            "type": "string | null",
            "doc": "localStorage key for persistence; `null` disables it. Default `\"silica-theme\"`."
          },
          {
            "name": "labels",
            "optional": true,
            "type": "boolean",
            "doc": "Show the current theme name next to the icon."
          },
          {
            "name": "variant",
            "optional": true,
            "type": "ButtonVariant",
            "doc": "Button variant. Default `ghost`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "ButtonColor",
            "doc": "Button color. Default `neutral`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "\"aria-label\"",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Toolbar",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/toolbar.tsx",
    "description": "Silica Toolbar — a group of controls with roving arrow-key focus. <Toolbar aria-label=\"Formatting\"> <ToolbarButton><BoldIcon /></ToolbarButton> <ToolbarButton><ItalicIcon /></ToolbarButton> <ToolbarSeparator /> <ToolbarLink href=\"/help\">Help</ToolbarLink> </Toolbar> For a start/center/end layout (e.g. centered tabs with actions on either side), give the bar exactly 3 direct children — a start child, a `<ToolbarCenter>`, and an end child: <Toolbar aria-label=\"Section navigation\"> <ToolbarGroup>...</ToolbarGroup> <ToolbarCenter><ToolbarGroup>...tabs...</ToolbarGroup></ToolbarCenter> <ToolbarGroup>...</ToolbarGroup> </Toolbar>",
    "props": [
      {
        "name": "ToolbarProps",
        "members": []
      },
      {
        "name": "ToolbarButtonProps",
        "members": []
      },
      {
        "name": "ToolbarGroupProps",
        "members": []
      },
      {
        "name": "ToolbarLinkProps",
        "members": []
      },
      {
        "name": "ToolbarSeparatorProps",
        "members": []
      },
      {
        "name": "ToolbarCenterProps",
        "members": []
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport {\n    Toolbar,\n    ToolbarButton,\n    ToolbarCenter,\n    ToolbarGroup,\n    ToolbarLink,\n    ToolbarSeparator,\n} from \"@wizeworks/silicaui-react\";\nimport { Section, Stack } from \"../lib/Section\";\n\nfunction BoldIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" strokeLinejoin=\"round\" />\n        </svg>\n    );\n}\nfunction ItalicIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"M15 4h-5M14 20H9M14 4l-4 16\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction UnderlineIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"M7 4v6a5 5 0 0 0 10 0V4M6 21h12\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction PlusIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"M12 5v14M5 12h14\" strokeLinecap=\"round\" />\n        </svg>\n    );\n}\nfunction TrashIcon() {\n    return (\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n            <path d=\"M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n        </svg>\n    );\n}\n\nexport function ToolbarDemo() {\n    const [format, setFormat] = useState<string[]>([\"bold\"]);\n\n    const toggle = (key: string) =>\n        setFormat((f) => (f.includes(key) ? f.filter((k) => k !== key) : [...f, key]));\n\n    return (\n        <>\n            <Section title=\"Real use · text formatting toolbar\">\n                <Toolbar aria-label=\"Formatting\">\n                    <ToolbarGroup>\n                        <ToolbarButton\n                            aria-pressed={format.includes(\"bold\")}\n                            onClick={() => toggle(\"bold\")}\n                        >\n                            <BoldIcon />\n                        </ToolbarButton>\n                        <ToolbarButton\n                            aria-pressed={format.includes(\"italic\")}\n                            onClick={() => toggle(\"italic\")}\n                        >\n                            <ItalicIcon />\n                        </ToolbarButton>\n                        <ToolbarButton\n                            aria-pressed={format.includes(\"underline\")}\n                            onClick={() => toggle(\"underline\")}\n                        >\n                            <UnderlineIcon />\n                        </ToolbarButton>\n                    </ToolbarGroup>\n                    <ToolbarSeparator />\n                    <ToolbarLink href=\"#\">Help</ToolbarLink>\n                </Toolbar>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Stack className=\"items-start\">\n                    {([\"sm\", \"md\", \"lg\"] as const).map((size) => (\n                        <Toolbar key={size} aria-label={`${size} toolbar`} size={size}>\n                            <ToolbarButton>\n                                <PlusIcon />\n                                Add\n                            </ToolbarButton>\n                            <ToolbarSeparator />\n                            <ToolbarLink href=\"#\">{size}</ToolbarLink>\n                        </Toolbar>\n                    ))}\n                </Stack>\n            </Section>\n\n            <Section title=\"Variant + dividers · bulk-selection bar\">\n                <div className=\"w-full max-w-md rounded-box border border-base-300\">\n                    <Toolbar aria-label=\"Bulk actions\" size=\"sm\" variant=\"muted\" dividers=\"bottom\" className=\"w-full\">\n                        <ToolbarGroup>\n                            <span className=\"px-1 text-xs font-medium opacity-70\">3 selected</span>\n                        </ToolbarGroup>\n                        <ToolbarSeparator />\n                        <ToolbarGroup>\n                            <ToolbarButton>\n                                <TrashIcon />\n                            </ToolbarButton>\n                        </ToolbarGroup>\n                        <ToolbarLink href=\"#\" className=\"ml-auto\">\n                            Deselect all\n                        </ToolbarLink>\n                    </Toolbar>\n                    <div className=\"p-4 text-sm opacity-60\">…table content…</div>\n                </div>\n            </Section>\n\n            <Section title=\"Dividers · card header\">\n                <div className=\"w-full max-w-md rounded-box border border-base-300\">\n                    <Toolbar aria-label=\"Card actions\" dividers=\"bottom\" className=\"w-full\">\n                        <span className=\"px-1 text-sm font-semibold\">Card title</span>\n                        <ToolbarButton className=\"ml-auto\">\n                            <PlusIcon />\n                        </ToolbarButton>\n                    </Toolbar>\n                    <div className=\"p-4 text-sm opacity-60\">…card content…</div>\n                </div>\n            </Section>\n\n            <Section title=\"Glass · floating action bar\">\n                <div\n                    className=\"flex justify-center rounded-box p-16\"\n                    style={{\n                        backgroundImage:\n                            \"linear-gradient(135deg, var(--color-primary), var(--color-accent), var(--color-secondary))\",\n                    }}\n                >\n                    <Toolbar aria-label=\"Floating actions\" className=\"glass\">\n                        <ToolbarGroup>\n                            <ToolbarButton>\n                                <PlusIcon />\n                                Add\n                            </ToolbarButton>\n                            <ToolbarButton>\n                                <TrashIcon />\n                            </ToolbarButton>\n                        </ToolbarGroup>\n                        <ToolbarSeparator />\n                        <ToolbarLink href=\"#\">Help</ToolbarLink>\n                    </Toolbar>\n                </div>\n            </Section>\n\n            <Section title=\"Center region · start / center / end\">\n                <div className=\"w-full max-w-md rounded-box border border-base-300\">\n                    <Toolbar aria-label=\"Section navigation\" dividers=\"bottom\" className=\"w-full\">\n                        <ToolbarGroup />\n                        <ToolbarCenter>\n                            <ToolbarGroup>\n                                <ToolbarButton aria-pressed={true}>Overview</ToolbarButton>\n                                <ToolbarButton aria-pressed={false}>Analytics</ToolbarButton>\n                                <ToolbarButton aria-pressed={false}>Settings</ToolbarButton>\n                            </ToolbarGroup>\n                        </ToolbarCenter>\n                        <ToolbarGroup>\n                            <ToolbarButton>\n                                <PlusIcon />\n                            </ToolbarButton>\n                        </ToolbarGroup>\n                    </Toolbar>\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "TreeView",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/tree-view.tsx",
    "description": "TreeView — a hierarchical tree with full keyboard support (↑/↓ move, →/← expand-or-descend / collapse-or-ascend, Home/End, Enter selects, Space toggles). Feed it a `TreeNode[]` forest; control expansion via `expanded`/`onExpandedChange` and selection via `selected`/`onSelectedChange`, or run uncontrolled with the `default*` props.",
    "props": [
      {
        "name": "TreeViewProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLUListElement>, \"onSelect\">",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "TreeNode[]",
            "doc": "The node forest."
          },
          {
            "name": "expanded",
            "optional": true,
            "type": "string[]",
            "doc": "Controlled set of expanded node ids."
          },
          {
            "name": "defaultExpanded",
            "optional": true,
            "type": "string[]",
            "doc": "Uncontrolled initial expanded ids."
          },
          {
            "name": "onExpandedChange",
            "optional": true,
            "type": "(expanded: string[]) => void",
            "doc": ""
          },
          {
            "name": "selected",
            "optional": true,
            "type": "string",
            "doc": "Controlled selected node id."
          },
          {
            "name": "defaultSelected",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial selected id."
          },
          {
            "name": "onSelectedChange",
            "optional": true,
            "type": "(id: string) => void",
            "doc": ""
          },
          {
            "name": "onSelect",
            "optional": true,
            "type": "(node: TreeNode) => void",
            "doc": "Fires with the full node when one is selected."
          },
          {
            "name": "onMove",
            "optional": true,
            "type": "(id: string, targetId: string, edge: TreeDropEdge) => void",
            "doc": "Enables row drag-to-reorder/-reparent (rows become `draggable`) and fires once a drag is released over a valid row: `edge` is \"before\"/\"after\" a sibling or \"inside\" (append as a child). TreeView only guards against dropping a node onto itself or its own descendant (which the geometry already knows); it does NOT know which nodes are valid containers, so the consumer's own move logic is the source of truth for the rest — an \"inside\" drop onto something that can't hold children should just no-op."
          },
          {
            "name": "onRename",
            "optional": true,
            "type": "(id: string, value: string) => void",
            "doc": "Enables inline rename on rows marked `renamable` (double-click the row, or F2 on a focused one) and fires ONCE on commit — Enter or blur, never per keystroke, so a consumer with an undo stack gets one entry per rename rather than one per character. Escape cancels without firing. An empty value is passed through: for most trees that means \"clear the name and go back to the derived one\", which only the consumer can decide."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { TreeView } from \"@wizeworks/silicaui-react\";\nimport type { TreeDropEdge, TreeNode } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nconst FolderIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n    </svg>\n);\nconst FileIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n        <path d=\"M5 3h9l5 5v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\" />\n    </svg>\n);\n\nconst TREE_ITEMS: TreeNode[] = [\n    {\n        id: \"pages\",\n        label: \"Pages\",\n        icon: FolderIcon,\n        children: [\n            { id: \"home\", label: \"Home\", icon: FileIcon },\n            { id: \"about\", label: \"About\", icon: FileIcon },\n            { id: \"pricing\", label: \"Pricing\", icon: FileIcon },\n        ],\n    },\n    {\n        id: \"shop\",\n        label: \"Shop\",\n        icon: FolderIcon,\n        children: [\n            {\n                id: \"products\",\n                label: \"Products\",\n                icon: FolderIcon,\n                children: [\n                    { id: \"product-list\", label: \"All products\", icon: FileIcon },\n                    { id: \"product-new\", label: \"New product\", icon: FileIcon },\n                ],\n            },\n            { id: \"collections\", label: \"Collections\", icon: FileIcon },\n            { id: \"checkout\", label: \"Checkout (locked)\", icon: FileIcon, disabled: true },\n        ],\n    },\n    { id: \"blog\", label: \"Blog\", icon: FileIcon },\n    { id: \"settings\", label: \"Settings\", icon: FileIcon },\n];\n\n/** Remove `id` from the forest, returning the pruned tree + the removed node. */\nfunction removeById(nodes: TreeNode[], id: string): [TreeNode[], TreeNode | undefined] {\n    let removed: TreeNode | undefined;\n    const next = nodes.flatMap((n) => {\n        if (n.id === id) {\n            removed = n;\n            return [];\n        }\n        if (!n.children) return [n];\n        const [children, found] = removeById(n.children, id);\n        if (found) removed = found;\n        return [{ ...n, children }];\n    });\n    return [next, removed];\n}\n\n/** Insert `node` before/after/inside `targetId`, wherever it lives in the forest. */\nfunction insertRelative(nodes: TreeNode[], targetId: string, edge: TreeDropEdge, node: TreeNode): TreeNode[] {\n    const idx = nodes.findIndex((n) => n.id === targetId);\n    if (idx === -1) {\n        return nodes.map((n) => (n.children ? { ...n, children: insertRelative(n.children, targetId, edge, node) } : n));\n    }\n    if (edge === \"inside\") {\n        const target = nodes[idx]!;\n        const updated = { ...target, children: [...(target.children ?? []), node] };\n        return [...nodes.slice(0, idx), updated, ...nodes.slice(idx + 1)];\n    }\n    const at = edge === \"before\" ? idx : idx + 1;\n    return [...nodes.slice(0, at), node, ...nodes.slice(at)];\n}\n\nfunction moveNode(nodes: TreeNode[], id: string, targetId: string, edge: TreeDropEdge): TreeNode[] {\n    const [without, removed] = removeById(nodes, id);\n    return removed ? insertRelative(without, targetId, edge, removed) : nodes;\n}\n\nexport function TreeViewDemo() {\n    const [selected, setSelected] = useState(\"about\");\n    const [expanded, setExpanded] = useState<string[]>([\"pages\", \"shop\"]);\n    const [items, setItems] = useState(TREE_ITEMS);\n\n    return (\n        <Section title=\"Real use · site page tree — drag a row to reorder or reparent it\">\n            <TreeView\n                items={items}\n                selected={selected}\n                onSelectedChange={setSelected}\n                expanded={expanded}\n                onExpandedChange={setExpanded}\n                onMove={(id, targetId, edge) => setItems((prev) => moveNode(prev, id, targetId, edge))}\n                className=\"max-w-xs\"\n            />\n        </Section>\n    );\n}"
  },
  {
    "name": "Wizard",
    "package": "@wizeworks/silicaui-react",
    "category": "Advanced / composite",
    "sourceFile": "silicaui-react/src/wizard.tsx",
    "description": "Wizard — a multi-step flow with a numbered indicator, per-step content, and a Back / Next-or-Finish footer. Control the step via `activeStep`/`onStepChange` or run uncontrolled with `defaultStep`. Steps carry their own `content`, or pass `children` to render the body yourself. `canGoNext` gates advancing so you can require the current step to validate first.",
    "props": [
      {
        "name": "WizardProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">",
        "members": [
          {
            "name": "steps",
            "optional": false,
            "type": "WizardStep[]",
            "doc": ""
          },
          {
            "name": "activeStep",
            "optional": true,
            "type": "number",
            "doc": "Controlled active step index."
          },
          {
            "name": "defaultStep",
            "optional": true,
            "type": "number",
            "doc": "Uncontrolled initial step index. Default `0`."
          },
          {
            "name": "onStepChange",
            "optional": true,
            "type": "(index: number) => void",
            "doc": ""
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color for markers + rail."
          },
          {
            "name": "linear",
            "optional": true,
            "type": "boolean",
            "doc": "Linear flow: markers can only jump backward (revisit) or stay; forward is via Next. `false` lets any enabled step be clicked. Default `true`."
          },
          {
            "name": "canGoNext",
            "optional": true,
            "type": "boolean",
            "doc": "Gate the Next button (e.g. until the active step validates). Default `true`."
          },
          {
            "name": "onFinish",
            "optional": true,
            "type": "() => void",
            "doc": "Called when Next is pressed on the last step."
          },
          {
            "name": "backLabel",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "nextLabel",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "finishLabel",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "hideFooter",
            "optional": true,
            "type": "boolean",
            "doc": "Hide the built-in Back / Next footer."
          },
          {
            "name": "children",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Render your own content instead of the active step's `content`."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Wizard, Input } from \"@wizeworks/silicaui-react\";\nimport type { WizardStep } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\nimport { COLORS } from \"../lib/data\";\n\nconst MINI_STEPS: WizardStep[] = [\n    { id: \"a\", title: \"Cart\" },\n    { id: \"b\", title: \"Shipping\" },\n    { id: \"c\", title: \"Payment\" },\n];\n\nconst STEPS: WizardStep[] = [\n    {\n        id: \"account\",\n        title: \"Account\",\n        content: (\n            <div className=\"flex max-w-sm flex-col gap-3\">\n                <Input placeholder=\"Work email\" type=\"email\" />\n                <Input placeholder=\"Choose a password\" type=\"password\" />\n            </div>\n        ),\n    },\n    {\n        id: \"profile\",\n        title: \"Profile\",\n        content: (\n            <div className=\"flex max-w-sm flex-col gap-3\">\n                <Input placeholder=\"Full name\" />\n                <Input placeholder=\"Company\" />\n            </div>\n        ),\n    },\n    {\n        id: \"billing\",\n        title: \"Billing\",\n        optional: true,\n        content: (\n            <div className=\"flex max-w-sm flex-col gap-3\">\n                <Input placeholder=\"Card number\" />\n                <span className=\"text-xs opacity-60\">\n                    Optional — you can add this later from Settings.\n                </span>\n            </div>\n        ),\n    },\n    {\n        id: \"review\",\n        title: \"Review\",\n        content: (\n            <p className=\"max-w-sm text-sm opacity-80\">\n                You're all set. Review your details and press Finish to create the\n                workspace.\n            </p>\n        ),\n    },\n];\n\nexport function WizardDemo() {\n    const [step, setStep] = useState(0);\n    const [done, setDone] = useState(false);\n\n    return (\n        <>\n            <Section title=\"Colors (step markers)\">\n                <div className=\"flex flex-col gap-6\">\n                    {COLORS.slice(0, 3).map((color) => (\n                        <Wizard\n                            key={color}\n                            color={color}\n                            steps={MINI_STEPS}\n                            defaultStep={1}\n                            hideFooter\n                        />\n                    ))}\n                </div>\n            </Section>\n\n            <Section title=\"Real use · workspace onboarding\">\n                <Wizard\n                    color=\"primary\"\n                    steps={STEPS}\n                    activeStep={step}\n                    onStepChange={setStep}\n                    onFinish={() => setDone(true)}\n                />\n                {done && (\n                    <p className=\"text-sm text-success\">\n                        🎉 Workspace created — you can close this wizard.\n                    </p>\n                )}\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Blockquote",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/typography.tsx",
    "description": "A pull-quote/testimonial block — larger and plainer than `.prose`'s inline-quote-in-a-paragraph styling. Pair with `BlockquoteCite`. <Blockquote> “Silica cut our design review time in half.” <BlockquoteCite>Ada Lovelace, Analytical Engines Inc.</BlockquoteCite> </Blockquote>",
    "props": [
      {
        "name": "HeadingProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level → renders `<h1>`…`<h6>`. Default 2."
          },
          {
            "name": "size",
            "optional": true,
            "type": "HeadingSize",
            "doc": "Visual size, independent of the semantic `level`: an h-level (`1`–`6`), `\"display\"`, or `\"display-1\"`–`\"display-3\"`. Omit to use the tag default — set it only when the outline needs one level but the design wants another size (an `<h2>` that should read as an h4, a hero `<h1>` sized to `display-1`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "HeadingSize",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "DisplayProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level for the outline (default 1) — independent of the visual size."
          },
          {
            "name": "size",
            "optional": true,
            "type": "DisplayStep",
            "doc": "Which step of the display ramp (`1`–`3`, largest → smallest). Omit for the base `.display` (equal to `.display-3`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "DisplayStep",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "TextProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "variant",
            "optional": true,
            "type": "TextVariant",
            "doc": "`body` (default), `lead` (larger intro), or `caption` (small, muted)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TextSize",
            "doc": "Explicit font size from the type scale (`text-*`). Overrides the size implied by `variant`; omit to use the variant's own size."
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `p`."
          }
        ]
      },
      {
        "name": "BlockquoteProps",
        "members": []
      },
      {
        "name": "BlockquoteCiteProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `footer`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Display",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/typography.tsx",
    "description": "Oversized hero/display heading on a semantic heading element.",
    "props": [
      {
        "name": "HeadingProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level → renders `<h1>`…`<h6>`. Default 2."
          },
          {
            "name": "size",
            "optional": true,
            "type": "HeadingSize",
            "doc": "Visual size, independent of the semantic `level`: an h-level (`1`–`6`), `\"display\"`, or `\"display-1\"`–`\"display-3\"`. Omit to use the tag default — set it only when the outline needs one level but the design wants another size (an `<h2>` that should read as an h4, a hero `<h1>` sized to `display-1`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "HeadingSize",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "DisplayProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level for the outline (default 1) — independent of the visual size."
          },
          {
            "name": "size",
            "optional": true,
            "type": "DisplayStep",
            "doc": "Which step of the display ramp (`1`–`3`, largest → smallest). Omit for the base `.display` (equal to `.display-3`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "DisplayStep",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "TextProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "variant",
            "optional": true,
            "type": "TextVariant",
            "doc": "`body` (default), `lead` (larger intro), or `caption` (small, muted)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TextSize",
            "doc": "Explicit font size from the type scale (`text-*`). Overrides the size implied by `variant`; omit to use the variant's own size."
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `p`."
          }
        ]
      },
      {
        "name": "BlockquoteProps",
        "members": []
      },
      {
        "name": "BlockquoteCiteProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `footer`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Heading",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/typography.tsx",
    "description": "A heading whose semantic level and visual size are set independently.",
    "props": [
      {
        "name": "HeadingProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level → renders `<h1>`…`<h6>`. Default 2."
          },
          {
            "name": "size",
            "optional": true,
            "type": "HeadingSize",
            "doc": "Visual size, independent of the semantic `level`: an h-level (`1`–`6`), `\"display\"`, or `\"display-1\"`–`\"display-3\"`. Omit to use the tag default — set it only when the outline needs one level but the design wants another size (an `<h2>` that should read as an h4, a hero `<h1>` sized to `display-1`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "HeadingSize",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "DisplayProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level for the outline (default 1) — independent of the visual size."
          },
          {
            "name": "size",
            "optional": true,
            "type": "DisplayStep",
            "doc": "Which step of the display ramp (`1`–`3`, largest → smallest). Omit for the base `.display` (equal to `.display-3`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "DisplayStep",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "TextProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "variant",
            "optional": true,
            "type": "TextVariant",
            "doc": "`body` (default), `lead` (larger intro), or `caption` (small, muted)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TextSize",
            "doc": "Explicit font size from the type scale (`text-*`). Overrides the size implied by `variant`; omit to use the variant's own size."
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `p`."
          }
        ]
      },
      {
        "name": "BlockquoteProps",
        "members": []
      },
      {
        "name": "BlockquoteCiteProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `footer`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Prose",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/prose.tsx",
    "description": "Silica Prose — typographic defaults for a block of rich/markdown content. Wrap raw HTML (or a Markdown renderer's output) and it gets themed headings, lists, quotes, code, tables, and rhythm — scoped to this block only. <Prose> <h1>Title</h1> <p>Body copy with a <a href=\"#\">link</a> and <code>inline code</code>.</p> </Prose> <Prose dangerouslySetInnerHTML={{ __html: renderedMarkdown }} /> Caps width at 65ch for readability — add `max-w-none` to remove.",
    "props": [
      {
        "name": "ProseProps",
        "extends": "extends React.HTMLAttributes<HTMLDivElement>",
        "members": [
          {
            "name": "size",
            "optional": true,
            "type": "ProseSize",
            "doc": "Default `md`. Rescales the whole block by one root font-size."
          }
        ]
      }
    ],
    "usageExample": "import { Prose } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\nexport function ProseDemo() {\n    return (\n        <>\n            <Section title=\"Real use · rendered article body\">\n                <Prose>\n                    <h2>Launch checklist</h2>\n                    <p>\n                        Draft the announcement in <strong>rich text</strong> — headings,\n                        lists, and links all export as clean HTML.\n                    </p>\n                    <ul>\n                        <li>Write the copy</li>\n                        <li>Add screenshots</li>\n                        <li>\n                            Link the <a href=\"#\">changelog</a>\n                        </li>\n                    </ul>\n                    <blockquote>Ship small, ship often.</blockquote>\n                    <p>\n                        Inline <code>code</code> and block code both pick up themed\n                        styling automatically.\n                    </p>\n                </Prose>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <div className=\"flex flex-col gap-6\">\n                    {([\"sm\", \"lg\"] as const).map((size) => (\n                        <Prose key={size} size={size}>\n                            <p>\n                                <code>size=&quot;{size}&quot;</code> rescales the whole block\n                                by one root font-size.\n                            </p>\n                        </Prose>\n                    ))}\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Text",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/typography.tsx",
    "description": "Body-copy text with a semantic variant. `body` carries no class (bare `<p>`).",
    "props": [
      {
        "name": "HeadingProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level → renders `<h1>`…`<h6>`. Default 2."
          },
          {
            "name": "size",
            "optional": true,
            "type": "HeadingSize",
            "doc": "Visual size, independent of the semantic `level`: an h-level (`1`–`6`), `\"display\"`, or `\"display-1\"`–`\"display-3\"`. Omit to use the tag default — set it only when the outline needs one level but the design wants another size (an `<h2>` that should read as an h4, a hero `<h1>` sized to `display-1`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "HeadingSize",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "DisplayProps",
        "extends": "extends React.HTMLAttributes<HTMLHeadingElement>",
        "members": [
          {
            "name": "level",
            "optional": true,
            "type": "HeadingLevel",
            "doc": "Semantic level for the outline (default 1) — independent of the visual size."
          },
          {
            "name": "size",
            "optional": true,
            "type": "DisplayStep",
            "doc": "Which step of the display ramp (`1`–`3`, largest → smallest). Omit for the base `.display` (equal to `.display-3`)."
          },
          {
            "name": "visualLevel",
            "optional": true,
            "type": "DisplayStep",
            "doc": "@deprecated Renamed to `size`. Still honored; `size` wins if both are set."
          }
        ]
      },
      {
        "name": "TextProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "variant",
            "optional": true,
            "type": "TextVariant",
            "doc": "`body` (default), `lead` (larger intro), or `caption` (small, muted)."
          },
          {
            "name": "size",
            "optional": true,
            "type": "TextSize",
            "doc": "Explicit font size from the type scale (`text-*`). Overrides the size implied by `variant`; omit to use the variant's own size."
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `p`."
          }
        ]
      },
      {
        "name": "BlockquoteProps",
        "members": []
      },
      {
        "name": "BlockquoteCiteProps",
        "extends": "extends React.HTMLAttributes<HTMLElement>",
        "members": [
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Element to render. Default `footer`."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "Wordmark",
    "package": "@wizeworks/silicaui-react",
    "category": "Typography",
    "sourceFile": "silicaui-react/src/wordmark.tsx",
    "description": "Silica Wordmark — a stylized logotype for a brand/product name. Wrap a highlighted portion in `<WordmarkAccent>` for a two-tone mark (e.g. the \"UI\" in \"Silica UI\"); a leading icon/glyph works as a plain child too. <Wordmark>Silica<WordmarkAccent>UI</WordmarkAccent></Wordmark> <Wordmark as=\"a\" href=\"/\" color=\"primary\"><LogoMark />Acme</Wordmark> <Wordmark src=\"/logo.svg\">Acme</Wordmark>",
    "props": [
      {
        "name": "WordmarkProps",
        "extends": "extends Omit<React.AllHTMLAttributes<HTMLElement>, \"color\" | \"size\" | \"src\" | \"alt\" | \"as\">",
        "members": [
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Solid accent color for the whole mark; maps to `wordmark-<color>`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Default `md`."
          },
          {
            "name": "as",
            "optional": true,
            "type": "React.ElementType",
            "doc": "Render as a different element — typically `\"a\"` when the mark links home."
          },
          {
            "name": "src",
            "optional": true,
            "type": "string",
            "doc": "A logo image rendered before the name. The one-prop path, for when the mark is a URL rather than a slotted component; `children` composition is the richer path and both lower to the same DOM. Ignored when `children` is given a mark of its own — pick one."
          },
          {
            "name": "alt",
            "optional": true,
            "type": "string",
            "doc": "Alt text for `src`. Defaults to `\"\"` (decorative): the brand NAME renders beside the logo, so announcing both just repeats it. Set it explicitly for a mark-only wordmark, where the logo carries the name."
          }
        ]
      },
      {
        "name": "WordmarkAccentProps",
        "members": []
      }
    ],
    "usageExample": "import { Wordmark, WordmarkAccent } from \"@wizeworks/silicaui-react\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst Mark = (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n        <path d=\"M12 2 2 7l10 5 10-5-10-5Z\" />\n        <path d=\"m2 17 10 5 10-5\" />\n        <path d=\"m2 12 10 5 10-5\" />\n    </svg>\n);\n\nexport function WordmarkDemo() {\n    return (\n        <>\n            <Section title=\"Real use · brand logotype\">\n                <Row>\n                    <Wordmark>\n                        Silica<WordmarkAccent>UI</WordmarkAccent>\n                    </Wordmark>\n                    <Wordmark as=\"a\" href=\"#\" color=\"primary\">\n                        {Mark}\n                        Acme\n                    </Wordmark>\n                </Row>\n            </Section>\n\n            <Section title=\"Sizes\">\n                <Row>\n                    <Wordmark size=\"xs\">Silica</Wordmark>\n                    <Wordmark size=\"sm\">Silica</Wordmark>\n                    <Wordmark size=\"md\">Silica</Wordmark>\n                    <Wordmark size=\"lg\">Silica</Wordmark>\n                    <Wordmark size=\"xl\">Silica</Wordmark>\n                </Row>\n            </Section>\n\n            <Section title=\"Colors\">\n                <Row>\n                    <Wordmark>Base</Wordmark>\n                    <Wordmark color=\"primary\">Primary</Wordmark>\n                    <Wordmark color=\"secondary\">Secondary</Wordmark>\n                    <Wordmark color=\"accent\">Accent</Wordmark>\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Chart",
    "package": "@wizeworks/silicaui-charts",
    "category": "wrapper",
    "sourceFile": "silicaui-charts/src/chart.tsx",
    "description": "A thin, fully-featured wrapper over Apache ECharts that auto-themes to the active Silica tokens. ECharts owns all rendering; Silica supplies the palette. The chart re-reads the tokens (and re-inits, since ECharts themes are fixed at `init`) whenever the ambient theme changes — a `data-theme` flip on `<html>` or an OS light/dark switch — so charts track the rest of the UI automatically. It also resizes with its container via a `ResizeObserver`. Give the container a height (defaults to 20rem); ECharts cannot measure a zero-height box.",
    "props": [
      {
        "name": "ChartProps",
        "extends": "extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onClick\">",
        "members": [
          {
            "name": "option",
            "optional": false,
            "type": "EChartsOption",
            "doc": "The ECharts option (series, axes, tooltip, legend, …) — full ECharts API."
          },
          {
            "name": "notMerge",
            "optional": true,
            "type": "boolean",
            "doc": "Replace the whole option instead of merging on update. Default `true`."
          },
          {
            "name": "loading",
            "optional": true,
            "type": "boolean",
            "doc": "Toggle ECharts' built-in loading spinner."
          },
          {
            "name": "renderer",
            "optional": true,
            "type": "\"canvas\" | \"svg\"",
            "doc": "Renderer backend. Default `\"canvas\"`."
          },
          {
            "name": "onInit",
            "optional": true,
            "type": "(chart: EChartsInstance) => void",
            "doc": "Called with the instance right after it's created (and after each re-init)."
          }
        ]
      }
    ],
    "usageExample": "import { Chart, Sparkline } from \"@wizeworks/silicaui-charts\";\nimport type { EChartsOption } from \"@wizeworks/silicaui-charts\";\nimport { Section, Row } from \"../lib/Section\";\n\nconst REVENUE_OPTION: EChartsOption = {\n    tooltip: { trigger: \"axis\" },\n    legend: { data: [\"Revenue\", \"Orders\"], top: 0 },\n    grid: { left: 4, right: 8, top: 34, bottom: 4, containLabel: true },\n    xAxis: {\n        type: \"category\",\n        data: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\"],\n    },\n    yAxis: [{ type: \"value\" }, { type: \"value\", splitLine: { show: false } }],\n    series: [\n        {\n            name: \"Revenue\",\n            type: \"line\",\n            yAxisIndex: 0,\n            smooth: true,\n            areaStyle: { opacity: 0.12 },\n            data: [8200, 9310, 9020, 11200, 12800, 12010, 14300],\n        },\n        {\n            name: \"Orders\",\n            type: \"bar\",\n            yAxisIndex: 1,\n            data: [120, 132, 128, 151, 168, 160, 184],\n        },\n    ],\n};\n\nconst CHANNEL_OPTION: EChartsOption = {\n    tooltip: { trigger: \"item\" },\n    legend: { bottom: 0 },\n    series: [\n        {\n            name: \"Channel\",\n            type: \"pie\",\n            radius: [\"45%\", \"72%\"],\n            itemStyle: { borderRadius: 6 },\n            label: { show: false },\n            data: [\n                { value: 4200, name: \"Direct\" },\n                { value: 3100, name: \"Organic\" },\n                { value: 2400, name: \"Referral\" },\n                { value: 1600, name: \"Social\" },\n            ],\n        },\n    ],\n};\n\nexport function ChartDemo() {\n    return (\n        <>\n            <Section title=\"Real use · revenue trend (auto-themed ECharts)\">\n                <Chart option={REVENUE_OPTION} style={{ maxWidth: 640 }} />\n            </Section>\n\n            <Section title=\"Channel split\">\n                <Chart option={CHANNEL_OPTION} style={{ maxWidth: 420, height: \"18rem\" }} />\n            </Section>\n\n            <Section title=\"Sparklines · inline trend indicators\">\n                <Row>\n                    <Sparkline\n                        data={[8, 9, 9, 11, 12, 12, 14]}\n                        area\n                        style={{ width: \"8rem\", height: \"2.5rem\" }}\n                    />\n                    <Sparkline\n                        data={[14, 12, 12, 11, 9, 9, 8]}\n                        style={{ width: \"8rem\", height: \"2.5rem\" }}\n                    />\n                </Row>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Sparkline",
    "package": "@wizeworks/silicaui-charts",
    "category": "wrapper",
    "sourceFile": "silicaui-charts/src/sparkline.tsx",
    "description": "A compact, axis-less trend line/bar for inline metrics (KPI cards, table cells). It builds the ECharts option for you and renders through {@link Chart}, so it inherits Silica theming and container-resize behavior.",
    "props": [
      {
        "name": "SparklineProps",
        "extends": "extends Omit<ChartProps, \"option\">",
        "members": [
          {
            "name": "data",
            "optional": false,
            "type": "number[]",
            "doc": "The series values."
          },
          {
            "name": "type",
            "optional": true,
            "type": "\"line\" | \"bar\"",
            "doc": "`\"line\"` (default) or `\"bar\"`."
          },
          {
            "name": "area",
            "optional": true,
            "type": "boolean",
            "doc": "Fill under a line sparkline."
          },
          {
            "name": "color",
            "optional": true,
            "type": "string",
            "doc": "Series color. Defaults to the Silica primary via the theme palette."
          },
          {
            "name": "tooltip",
            "optional": true,
            "type": "boolean",
            "doc": "Show a tooltip on hover. Default `false` — sparklines are glanceable."
          },
          {
            "name": "labels",
            "optional": true,
            "type": "(string | number)[]",
            "doc": "Optional category labels (used only in the tooltip)."
          }
        ]
      }
    ],
    "usageExample": null
  },
  {
    "name": "DataTable",
    "package": "@wizeworks/silicaui-table",
    "category": "wrapper",
    "sourceFile": "silicaui-table/src/data-table.tsx",
    "description": "A data grid over [TanStack Table](https://tanstack.com/table) dressed in the Silica `.table` CSS. The heavy sorting/selection/pagination logic is TanStack's (headless); everything visual — sort carets, selection column, selected-row tint, sticky header, pagination toolbar, empty + loading states — is Silica. Ships in the optional `@wizeworks/silicaui-table` package so the core React library stays dependency-free.",
    "props": [
      {
        "name": "DataTableProps",
        "members": [
          {
            "name": "data",
            "optional": false,
            "type": "TData[]",
            "doc": "Row data."
          },
          {
            "name": "columns",
            "optional": false,
            "type": "DataTableColumn<TData>[]",
            "doc": "Column definitions (`accessorKey` / `header` / `cell`, TanStack shape)."
          },
          {
            "name": "sortable",
            "optional": true,
            "type": "boolean",
            "doc": "Column sorting (click header to cycle asc → desc → none). Default `true`."
          },
          {
            "name": "selectable",
            "optional": true,
            "type": "boolean",
            "doc": "Row-selection checkboxes (adds a leading column). Default `false`."
          },
          {
            "name": "pagination",
            "optional": true,
            "type": "boolean | number",
            "doc": "Client-side pagination: a number sets the page size, `true` uses 10, `false` shows everything. Default `false`."
          },
          {
            "name": "zebra",
            "optional": true,
            "type": "boolean",
            "doc": "Zebra striping. Default `false`."
          },
          {
            "name": "hover",
            "optional": true,
            "type": "boolean",
            "doc": "Row hover highlight. Default `true`."
          },
          {
            "name": "stickyHeader",
            "optional": true,
            "type": "boolean",
            "doc": "Sticky header while the body scrolls. Default `false`."
          },
          {
            "name": "size",
            "optional": true,
            "type": "SilicaSize",
            "doc": "Cell density (maps to `.table-<size>`). Default `\"md\"`."
          },
          {
            "name": "color",
            "optional": true,
            "type": "SilicaColor",
            "doc": "Accent color for sort hover + selected-row tint."
          },
          {
            "name": "emptyState",
            "optional": true,
            "type": "React.ReactNode",
            "doc": "Rendered in place of the body when there are zero rows."
          },
          {
            "name": "loading",
            "optional": true,
            "type": "boolean",
            "doc": "Show placeholder skeleton rows instead of data."
          },
          {
            "name": "loadingRows",
            "optional": true,
            "type": "number",
            "doc": "Number of skeleton rows to show while `loading`. Default `5`."
          },
          {
            "name": "onRowClick",
            "optional": true,
            "type": "(row: TData) => void",
            "doc": "Fired when a body row is clicked (whole-row affordance)."
          },
          {
            "name": "onSelectionChange",
            "optional": true,
            "type": "(rows: TData[]) => void",
            "doc": "Fired with the selected originals whenever selection changes."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { Badge } from \"@wizeworks/silicaui-react\";\nimport type { SilicaColor } from \"@wizeworks/silicaui-react\";\nimport { DataTable } from \"@wizeworks/silicaui-table\";\nimport type { DataTableColumn } from \"@wizeworks/silicaui-table\";\nimport { Sparkline } from \"@wizeworks/silicaui-charts\";\nimport { Section } from \"../lib/Section\";\n\ninterface TeamRow {\n    name: string;\n    email: string;\n    role: string;\n    plan: string;\n    mrr: number;\n    trend: number[];\n    status: { label: string; color: SilicaColor };\n}\n\nconst TEAM: TeamRow[] = [\n    { name: \"Ada Lovelace\", email: \"ada@silica.dev\", role: \"Owner\", plan: \"Enterprise\", mrr: 2400, trend: [12, 18, 15, 22, 28, 26, 31], status: { label: \"Active\", color: \"success\" } },\n    { name: \"Grace Hopper\", email: \"grace@silica.dev\", role: \"Admin\", plan: \"Pro\", mrr: 990, trend: [8, 9, 11, 10, 13, 15, 14], status: { label: \"Active\", color: \"success\" } },\n    { name: \"Alan Turing\", email: \"alan@silica.dev\", role: \"Member\", plan: \"Pro\", mrr: 720, trend: [5, 6, 6, 8, 7, 9, 12], status: { label: \"Away\", color: \"warning\" } },\n    { name: \"Katherine Johnson\", email: \"kate@silica.dev\", role: \"Member\", plan: \"Starter\", mrr: 190, trend: [2, 3, 3, 4, 5, 5, 6], status: { label: \"Invited\", color: \"neutral\" } },\n    { name: \"Edsger Dijkstra\", email: \"edsger@silica.dev\", role: \"Admin\", plan: \"Enterprise\", mrr: 3100, trend: [20, 22, 25, 24, 29, 33, 38], status: { label: \"Active\", color: \"success\" } },\n    { name: \"Barbara Liskov\", email: \"barbara@silica.dev\", role: \"Member\", plan: \"Pro\", mrr: 880, trend: [9, 10, 12, 11, 14, 13, 16], status: { label: \"Active\", color: \"success\" } },\n    { name: \"Donald Knuth\", email: \"don@silica.dev\", role: \"Member\", plan: \"Starter\", mrr: 140, trend: [1, 2, 2, 3, 3, 4, 4], status: { label: \"Suspended\", color: \"error\" } },\n    { name: \"Margaret Hamilton\", email: \"maggie@silica.dev\", role: \"Admin\", plan: \"Enterprise\", mrr: 2750, trend: [18, 19, 21, 26, 30, 29, 34], status: { label: \"Active\", color: \"success\" } },\n];\n\nconst COLUMNS: DataTableColumn<TeamRow>[] = [\n    {\n        accessorKey: \"name\",\n        header: \"Member\",\n        cell: ({ row }) => (\n            <div className=\"flex flex-col\">\n                <span className=\"font-medium\">{row.original.name}</span>\n                <span className=\"text-xs opacity-60\">{row.original.email}</span>\n            </div>\n        ),\n    },\n    { accessorKey: \"role\", header: \"Role\" },\n    {\n        accessorKey: \"plan\",\n        header: \"Plan\",\n        cell: ({ row }) => <Badge>{row.original.plan}</Badge>,\n    },\n    {\n        accessorKey: \"mrr\",\n        header: \"MRR\",\n        cell: ({ row }) => (\n            <span className=\"tabular-nums\">${row.original.mrr.toLocaleString()}</span>\n        ),\n    },\n    {\n        id: \"trend\",\n        header: \"Trend\",\n        enableSorting: false,\n        cell: ({ row }) => (\n            <Sparkline\n                data={row.original.trend}\n                area\n                style={{ width: \"5rem\", height: \"1.75rem\" }}\n            />\n        ),\n    },\n    {\n        accessorKey: \"status\",\n        header: \"Status\",\n        enableSorting: false,\n        cell: ({ row }) => (\n            <Badge color={row.original.status.color}>{row.original.status.label}</Badge>\n        ),\n    },\n];\n\nexport function DataTableDemo() {\n    const [selected, setSelected] = useState<TeamRow[]>([]);\n    const [loading, setLoading] = useState(false);\n\n    return (\n        <>\n            <Section title=\"Real use · sortable, selectable, paginated team table\">\n                <div className=\"flex flex-col gap-2\">\n                    <DataTable\n                        data={TEAM}\n                        columns={COLUMNS}\n                        sortable\n                        selectable\n                        pagination={5}\n                        zebra\n                        color=\"primary\"\n                        onSelectionChange={setSelected}\n                    />\n                    <p className=\"text-xs opacity-60\">\n                        {selected.length} row{selected.length === 1 ? \"\" : \"s\"} selected\n                    </p>\n                </div>\n            </Section>\n\n            <Section title=\"Loading & empty states\">\n                <div className=\"flex flex-col gap-3\">\n                    <button\n                        className=\"w-fit text-xs underline opacity-70\"\n                        onClick={() => {\n                            setLoading(true);\n                            setTimeout(() => setLoading(false), 1500);\n                        }}\n                    >\n                        Simulate loading\n                    </button>\n                    <DataTable\n                        data={loading ? [] : TEAM.slice(0, 3)}\n                        columns={COLUMNS}\n                        loading={loading}\n                        loadingRows={3}\n                        emptyState={<span className=\"opacity-60\">No members found.</span>}\n                    />\n                </div>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "RichTextEditor",
    "package": "@wizeworks/silicaui-editor",
    "category": "wrapper",
    "sourceFile": "silicaui-editor/src/rich-text-editor.tsx",
    "description": "RichTextEditor — a TipTap editor with a Silica-styled toolbar and content surface. Emits HTML via `onValueChange`; control it with `value` or run uncontrolled with `defaultValue`. StarterKit + Link + Placeholder are wired in; drop `toolbar={false}` for a bare editable surface.",
    "props": [
      {
        "name": "RichTextEditorProps",
        "members": [
          {
            "name": "value",
            "optional": true,
            "type": "string",
            "doc": "Controlled HTML value."
          },
          {
            "name": "defaultValue",
            "optional": true,
            "type": "string",
            "doc": "Uncontrolled initial HTML."
          },
          {
            "name": "onValueChange",
            "optional": true,
            "type": "(html: string) => void",
            "doc": "Fires with the editor's HTML on every change."
          },
          {
            "name": "placeholder",
            "optional": true,
            "type": "string",
            "doc": "Empty-state placeholder text."
          },
          {
            "name": "editable",
            "optional": true,
            "type": "boolean",
            "doc": "Allow editing. Default `true`."
          },
          {
            "name": "toolbar",
            "optional": true,
            "type": "boolean",
            "doc": "Show the formatting toolbar. Default `true`."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          },
          {
            "name": "contentClassName",
            "optional": true,
            "type": "string",
            "doc": "Class for the editable content surface."
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { RichTextEditor } from \"@wizeworks/silicaui-editor\";\nimport { Section } from \"../lib/Section\";\n\nexport function RichTextEditorDemo() {\n    const [doc, setDoc] = useState(\n        \"<h2>Launch checklist</h2><p>Draft the announcement in <strong>rich text</strong> — headings, lists, and links all export as clean HTML.</p><ul><li>Write the copy</li><li>Add screenshots</li></ul>\",\n    );\n\n    return (\n        <Section title=\"Real use · a full formatting toolbar over TipTap\">\n            <RichTextEditor\n                value={doc}\n                onValueChange={setDoc}\n                className=\"max-w-xl\"\n            />\n        </Section>\n    );\n}"
  },
  {
    "name": "SortableList",
    "package": "@wizeworks/silicaui-dnd",
    "category": "wrapper",
    "sourceFile": "silicaui-dnd/src/sortable-list.tsx",
    "description": "SortableList — a drag-to-reorder list over dnd-kit. Give it `items`, a `getItemId`, and a `renderItem`; it fires `onReorder` with the new order after a pointer drag or keyboard move (Space to pick up, arrows to move, Space to drop). Set `handle` to drag only from a grip you wire with `ctx.handleProps`.",
    "props": [
      {
        "name": "SortableHandleProps",
        "members": []
      },
      {
        "name": "SortableListProps",
        "members": [
          {
            "name": "items",
            "optional": false,
            "type": "T[]",
            "doc": "The ordered items."
          },
          {
            "name": "getItemId",
            "optional": false,
            "type": "(item: T) => string | number",
            "doc": "Stable id for each item (drag identity + React key)."
          },
          {
            "name": "onReorder",
            "optional": false,
            "type": "(items: T[]) => void",
            "doc": "Called with the reordered array after a drag or keyboard move."
          },
          {
            "name": "renderItem",
            "optional": false,
            "type": "(item: T, ctx: SortableItemContext) => React.ReactNode",
            "doc": "Render a row; `ctx.handleProps` wires the drag handle (or is a no-op)."
          },
          {
            "name": "handle",
            "optional": true,
            "type": "boolean",
            "doc": "Drag only via a handle element you render with `ctx.handleProps` (rather than the whole row). Default `false` (the whole row is draggable)."
          },
          {
            "name": "className",
            "optional": true,
            "type": "string",
            "doc": ""
          }
        ]
      }
    ],
    "usageExample": "import { useState } from \"react\";\nimport { SortableList } from \"@wizeworks/silicaui-dnd\";\nimport { useSilicaClass } from \"@wizeworks/silicaui-react\";\nimport { Section } from \"../lib/Section\";\n\ninterface SectionBlock {\n    id: string;\n    label: string;\n}\n\nconst INITIAL: SectionBlock[] = [\n    { id: \"hero\", label: \"Hero banner\" },\n    { id: \"features\", label: \"Feature grid\" },\n    { id: \"pricing\", label: \"Pricing table\" },\n    { id: \"testimonials\", label: \"Testimonials\" },\n    { id: \"faq\", label: \"FAQ\" },\n];\n\nconst GripIcon = (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\">\n        <circle cx=\"9\" cy=\"6\" r=\"1.6\" />\n        <circle cx=\"15\" cy=\"6\" r=\"1.6\" />\n        <circle cx=\"9\" cy=\"12\" r=\"1.6\" />\n        <circle cx=\"15\" cy=\"12\" r=\"1.6\" />\n        <circle cx=\"9\" cy=\"18\" r=\"1.6\" />\n        <circle cx=\"15\" cy=\"18\" r=\"1.6\" />\n    </svg>\n);\n\nexport function SortableListDemo() {\n    const [blocks, setBlocks] = useState<SectionBlock[]>(INITIAL);\n    const sc = useSilicaClass();\n\n    return (\n        <Section title=\"Real use · reorder a page's sections (drag the handle)\">\n            <div className=\"max-w-sm\">\n                <SortableList\n                    items={blocks}\n                    getItemId={(b) => b.id}\n                    onReorder={setBlocks}\n                    handle\n                    renderItem={(block, ctx) => (\n                        <>\n                            <span\n                                {...ctx.handleProps}\n                                className={sc(\"sortable-handle\") as string}\n                                aria-label={`Drag ${block.label}`}\n                            >\n                                {GripIcon}\n                            </span>\n                            {block.label}\n                        </>\n                    )}\n                />\n            </div>\n        </Section>\n    );\n}"
  },
  {
    "name": "ResizablePanels",
    "package": "@wizeworks/silicaui-panels",
    "category": "wrapper",
    "sourceFile": "silicaui-panels/src/resizable-panels.tsx",
    "description": "",
    "props": [
      {
        "name": "ResizeHandleProps",
        "extends": "extends PanelResizeHandleProps",
        "members": []
      }
    ],
    "usageExample": "import {\n    ResizablePanelGroup,\n    ResizablePanel,\n    ResizeHandle,\n} from \"@wizeworks/silicaui-panels\";\nimport { Section } from \"../lib/Section\";\n\nexport function ResizablePanelsDemo() {\n    return (\n        <>\n            <Section title=\"Real use · sidebar + editor + preview\">\n                <ResizablePanelGroup\n                    direction=\"horizontal\"\n                    className=\"h-64 max-w-2xl rounded-box border border-base-300\"\n                >\n                    <ResizablePanel defaultSize={20} minSize={15}>\n                        <div className=\"flex h-full items-center justify-center bg-base-200 text-sm\">\n                            Sidebar\n                        </div>\n                    </ResizablePanel>\n                    <ResizeHandle />\n                    <ResizablePanel defaultSize={50} minSize={30}>\n                        <div className=\"flex h-full items-center justify-center text-sm\">\n                            Editor\n                        </div>\n                    </ResizablePanel>\n                    <ResizeHandle />\n                    <ResizablePanel defaultSize={30} minSize={15}>\n                        <div className=\"flex h-full items-center justify-center bg-base-200 text-sm\">\n                            Preview\n                        </div>\n                    </ResizablePanel>\n                </ResizablePanelGroup>\n            </Section>\n\n            <Section title=\"Vertical stack\">\n                <ResizablePanelGroup\n                    direction=\"vertical\"\n                    className=\"h-64 max-w-md rounded-box border border-base-300\"\n                >\n                    <ResizablePanel defaultSize={50}>\n                        <div className=\"flex h-full items-center justify-center bg-base-200 text-sm\">\n                            Top\n                        </div>\n                    </ResizablePanel>\n                    <ResizeHandle />\n                    <ResizablePanel defaultSize={50}>\n                        <div className=\"flex h-full items-center justify-center text-sm\">\n                            Bottom\n                        </div>\n                    </ResizablePanel>\n                </ResizablePanelGroup>\n            </Section>\n        </>\n    );\n}"
  },
  {
    "name": "Button",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Button",
    "icon": "button",
    "container": false,
    "behaviors": [],
    "doc": "Button — a <button>, or an <a> when it carries an href; label is text sugar.",
    "sourceFile": "silicaui-html/src/component.ts:633"
  },
  {
    "name": "Image",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Image",
    "icon": "image",
    "container": false,
    "behaviors": [],
    "doc": "Image — a self-closing <img>; `ratio` maps to an aspect utility appended to the class, then the whole string is prefixed as normal.",
    "sourceFile": "silicaui-html/src/component.ts:653"
  },
  {
    "name": "Video",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Video",
    "icon": "video",
    "container": false,
    "behaviors": [],
    "doc": "Video — a native <video>; `ratio` maps to an aspect utility like Image. A single `src` renders on the element; `props.sources` (`{src,type}[]`) OR authored children (hand-authored <source>/<track>) render nested instead, so the browser can pick a format. Boolean playback props follow the `=== true` convention every other boolean prop uses (the inspector toggle writes `undefined` when off), so a freshly-dropped Video seeds `controls: true`.",
    "sourceFile": "silicaui-html/src/component.ts:686"
  },
  {
    "name": "Embed",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Embed",
    "icon": "video",
    "container": false,
    "behaviors": [],
    "doc": "Embed — a curated third-party player (YouTube / Vimeo / Google Maps / Spotify / SoundCloud / Apple Music + Podcasts / Bandcamp / the podcast hosts). The ONLY component that emits an <iframe>, and only to an allowlisted host, in a sandbox, via `rawHtml` (so it bypasses the floor that downgrades arbitrary authored iframes to <div>). `props.url` is normalized by `resolveEmbed`; anything it does not recognize as FRAMEABLE falls back to a plain link — never a raw iframe. See embed.ts for why that distinction is the whole job.",
    "providers": [
      {
        "name": "YouTube",
        "kind": "video",
        "example": "https://www.youtube.com/watch?v=VIDEO_ID"
      },
      {
        "name": "Vimeo",
        "kind": "video",
        "example": "https://vimeo.com/123456789"
      },
      {
        "name": "Google Maps",
        "kind": "map",
        "example": "https://www.google.com/maps/embed?pb=…",
        "embedUrlOnly": true
      },
      {
        "name": "Spotify",
        "kind": "audio",
        "example": "https://open.spotify.com/track/TRACK_ID"
      },
      {
        "name": "SoundCloud",
        "kind": "audio",
        "example": "https://soundcloud.com/artist/track"
      },
      {
        "name": "Apple Music",
        "kind": "audio",
        "example": "https://music.apple.com/us/album/name/1441164426"
      },
      {
        "name": "Apple Podcasts",
        "kind": "podcast",
        "example": "https://podcasts.apple.com/us/podcast/name/id1200361736"
      },
      {
        "name": "Bandcamp",
        "kind": "audio",
        "example": "https://bandcamp.com/EmbeddedPlayer/album=123456789/size=large/",
        "embedUrlOnly": true
      },
      {
        "name": "Simplecast",
        "kind": "podcast",
        "example": "https://player.simplecast.com/EPISODE_ID",
        "embedUrlOnly": true
      },
      {
        "name": "Megaphone",
        "kind": "podcast",
        "example": "https://player.megaphone.fm/EPISODE_ID",
        "embedUrlOnly": true
      },
      {
        "name": "Transistor",
        "kind": "podcast",
        "example": "https://share.transistor.fm/e/EPISODE_ID",
        "embedUrlOnly": true
      },
      {
        "name": "Buzzsprout",
        "kind": "podcast",
        "example": "https://www.buzzsprout.com/123456/9876543?iframe=true",
        "embedUrlOnly": true
      }
    ],
    "sourceFile": "silicaui-html/src/component.ts:730"
  },
  {
    "name": "Heading",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Heading",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "Heading — <h1>…<h6> from props.level (default 2, clamped).",
    "sourceFile": "silicaui-html/src/component.ts:777"
  },
  {
    "name": "Icon",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Icon",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "doc": "Icon — an inline <span> carrying its name for a runtime/icon font to resolve.",
    "sourceFile": "silicaui-html/src/component.ts:789"
  },
  {
    "name": "Divider",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Divider",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "doc": "Divider — a void <hr>.",
    "sourceFile": "silicaui-html/src/component.ts:800"
  },
  {
    "name": "Link",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Link",
    "icon": "link",
    "container": true,
    "behaviors": [],
    "doc": "Link — a styled inline <a>. Static output had no way to author one at all, so every link in a projected page had to be a raw element node.",
    "sourceFile": "silicaui-html/src/component.ts:804"
  },
  {
    "name": "Input",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Input",
    "icon": "input",
    "container": false,
    "behaviors": [],
    "doc": "── form controls ───────────────────────────────────────────────────────── Each lowers to a native form element, so the browser's built-in behavior + accessibility come for free and the Phase 2 form contract wires the same tags. Input — a single-line <input>; props.type picks the mode (default 'text').",
    "sourceFile": "silicaui-html/src/component.ts:823"
  },
  {
    "name": "FileInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "File input",
    "icon": "input",
    "container": false,
    "behaviors": [],
    "doc": "FileInput — an <input type=\"file\">. `type` is fixed, so it isn't reachable through Input's props.type the way the other field modes are.",
    "sourceFile": "silicaui-html/src/component.ts:835"
  },
  {
    "name": "FloatingLabel",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Floating label",
    "icon": "label",
    "container": true,
    "behaviors": [],
    "doc": "FloatingLabel — <label> wrapping the control, caption LAST (the CSS floats it via the control's :placeholder-shown, which needs the sibling order the React component also produces: control first, caption second).",
    "sourceFile": "silicaui-html/src/component.ts:848"
  },
  {
    "name": "Textarea",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Textarea",
    "icon": "textarea",
    "container": false,
    "behaviors": [],
    "doc": "Textarea — a multi-line <textarea>; text/children are its value.",
    "sourceFile": "silicaui-html/src/component.ts:862"
  },
  {
    "name": "Select",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Select",
    "icon": "select",
    "container": false,
    "behaviors": [],
    "doc": "Select — a native <select>; options come from props.options (or child nodes).",
    "sourceFile": "silicaui-html/src/component.ts:874"
  },
  {
    "name": "Checkbox",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Checkbox",
    "icon": "checkbox",
    "container": true,
    "behaviors": [],
    "doc": "Checkbox / Radio / Toggle — native <input>s of the matching type. Toggle shares checkbox semantics; only its class (`toggle`) plus role=\"switch\" makes it a switch.",
    "sourceFile": "silicaui-html/src/component.ts:891"
  },
  {
    "name": "Radio",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Radio",
    "icon": "radio",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:899"
  },
  {
    "name": "Toggle",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Toggle",
    "icon": "toggle",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:907"
  },
  {
    "name": "Text",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Text",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "Simple element atoms.",
    "sourceFile": "silicaui-html/src/component.ts:916"
  },
  {
    "name": "Badge",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Badge",
    "icon": "label",
    "container": false,
    "behaviors": [],
    "doc": "Badge — lowers to `<span>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:917"
  },
  {
    "name": "Wordmark",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Wordmark",
    "icon": "wordmark",
    "container": true,
    "behaviors": [],
    "doc": "Wordmark — the brand lockup: an optional MARK (logo image or a slotted svg/Icon child) beside the brand name. It was `elementDef(…, \"span\")` — text-only, container:false — while its CSS (`& :is(svg,img)` sizing) and its React wrapper (`<Wordmark as=\"a\"><LogoMark/>Acme</Wordmark>`) both already assumed a mark. The schema is the layer the builder reads, so the builder won and \"put the logo in the wordmark\" was impossible by construction. Two paths, one DOM: nest a child (the power path), or set `src` (the one-control Inspector path). `primary: \"text\"` keeps a bare bind on the NAME — without it, adding `src` would make a bound site name fill the image URL instead.",
    "sourceFile": "silicaui-html/src/component.ts:928"
  },
  {
    "name": "Card",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Card",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Card — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:958"
  },
  {
    "name": "SelectableCard",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Selectable card",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "SelectableCard — a card that IS an option tile: a real (visually hidden) radio/checkbox inside a <label>, so the whole card is the click target and the selection posts with the form. Matches the React component's DOM.",
    "sourceFile": "silicaui-html/src/component.ts:963"
  },
  {
    "name": "Section",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Section",
    "icon": "section",
    "container": true,
    "behaviors": [],
    "doc": "Section — lowers to `<section>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:982"
  },
  {
    "name": "Container",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Container",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Container — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:983"
  },
  {
    "name": "Grid",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Grid",
    "icon": "grid",
    "container": true,
    "behaviors": [],
    "doc": "Grid — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:984"
  },
  {
    "name": "Stack",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Stack",
    "icon": "stack",
    "container": true,
    "behaviors": [],
    "doc": "Stack — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:985"
  },
  {
    "name": "Loading",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Loading",
    "icon": "loading",
    "container": false,
    "behaviors": [],
    "doc": "Feedback leaves — colorless status surfaces (class carries size/variant).",
    "sourceFile": "silicaui-html/src/component.ts:987"
  },
  {
    "name": "Skeleton",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Skeleton",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "doc": "Skeleton — lowers to `<div>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:988"
  },
  {
    "name": "Status",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Status",
    "icon": "dot",
    "container": false,
    "behaviors": [],
    "doc": "Status — lowers to `<span>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:989"
  },
  {
    "name": "Kbd",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Kbd",
    "icon": "kbd",
    "container": false,
    "behaviors": [],
    "doc": "Kbd — lowers to `<kbd>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:990"
  },
  {
    "name": "Navbar",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Navbar",
    "icon": "header",
    "container": true,
    "behaviors": [],
    "doc": "Navbar / Table — structural containers (children authored in the tree).",
    "sourceFile": "silicaui-html/src/component.ts:992"
  },
  {
    "name": "Table",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Table",
    "icon": "table",
    "container": true,
    "behaviors": [],
    "doc": "Table — lowers to `<table>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:993"
  },
  {
    "name": "Field",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Field",
    "icon": "label",
    "container": true,
    "behaviors": [],
    "doc": "Field — a form-row container (label + control as children).",
    "sourceFile": "silicaui-html/src/component.ts:995"
  },
  {
    "name": "Form",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Form",
    "icon": "form",
    "container": true,
    "behaviors": [
      "form"
    ],
    "doc": "Form — a <form> that ALWAYS lowers with the `form` behavior marker so a published form is functional (validate + submit) with zero author wiring. `props.action` names the host action a valid submit dispatches to; an explicitly-set behavior/data on the node is respected and never overwritten.",
    "sourceFile": "silicaui-html/src/component.ts:1001"
  },
  {
    "name": "Sidebar",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Sidebar",
    "icon": "sidebar",
    "container": true,
    "behaviors": [
      "sidebar"
    ],
    "doc": "Sidebar — a persistent nav panel (`<aside>`) that collapses in place to an icon rail, unlike Drawer (which overlays and dismisses). Always carries the `sidebar` behavior so a `SidebarTrigger` nested anywhere inside it works with zero authored wiring; `props.defaultCollapsed` seeds the initial state.",
    "sourceFile": "silicaui-html/src/component.ts:1020"
  },
  {
    "name": "SidebarTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Sidebar toggle",
    "icon": "sidebarTrigger",
    "container": false,
    "behaviors": [],
    "doc": "SidebarTrigger — the sidebar's collapse/expand button. A structural PART (`trigger`), not a behavior root itself — it must be authored somewhere inside the `Sidebar` it controls (e.g. its header).",
    "sourceFile": "silicaui-html/src/component.ts:1041"
  },
  {
    "name": "SelectionList",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Selection List",
    "icon": "selectionList",
    "container": false,
    "behaviors": [
      "selection-list"
    ],
    "doc": "SelectionList — a selectable listbox (single- or multi-select), items driven by props (not authored children, like Breadcrumb/Steps). Always carries the `selection-list` behavior so it's clickable/keyboard-navigable once published, with zero authored wiring. `props.items`: `{id, label, description?}[]` (or plain strings); `props.multiple`; `props.selected`: array of selected ids.",
    "sourceFile": "silicaui-html/src/component.ts:1058"
  },
  {
    "name": "Breadcrumb",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Breadcrumb",
    "icon": "breadcrumb",
    "container": false,
    "behaviors": [],
    "doc": "── navigation ───────────────────────────────────────────────────────────── Breadcrumb — a <nav class=\"breadcrumb\"> wrapping an <ol>; each item is a link, the last marked aria-current=\"page\". Items come from props.items (strings).",
    "sourceFile": "silicaui-html/src/component.ts:1117"
  },
  {
    "name": "Menu",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menu",
    "icon": "nav",
    "container": false,
    "behaviors": [],
    "doc": "Menu — a vertical <ul class=\"menu\"> of link items (sidebars / popover bodies).",
    "sourceFile": "silicaui-html/src/component.ts:1134"
  },
  {
    "name": "Steps",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Steps",
    "icon": "steps",
    "container": false,
    "behaviors": [],
    "doc": "Steps — a <ul class=\"steps\"> tracker; items up to props.current are `-primary` (read as completed). Both from props.",
    "sourceFile": "silicaui-html/src/component.ts:1148"
  },
  {
    "name": "Pagination",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Pagination",
    "icon": "pagination",
    "container": false,
    "behaviors": [],
    "doc": "Pagination — a joined button row (1…props.pages), the first marked active.",
    "sourceFile": "silicaui-html/src/component.ts:1163"
  },
  {
    "name": "Alert",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Alert",
    "icon": "warning",
    "container": false,
    "behaviors": [],
    "doc": "── feedback ─────────────────────────────────────────────────────────────── Alert — a role=\"alert\" surface; its children (or text prop) sit in the flex row.",
    "sourceFile": "silicaui-html/src/component.ts:1184"
  },
  {
    "name": "Progress",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Progress",
    "icon": "progress",
    "container": false,
    "behaviors": [],
    "doc": "Progress — a track div + a fill div whose LITERAL width utility encodes value.",
    "sourceFile": "silicaui-html/src/component.ts:1215"
  },
  {
    "name": "Stat",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Stat",
    "icon": "stat",
    "container": false,
    "behaviors": [],
    "doc": "── data display ─────────────────────────────────────────────────────────── Stat — a .stats container holding one .stat (title / value / desc from props).",
    "sourceFile": "silicaui-html/src/component.ts:1228"
  },
  {
    "name": "Avatar",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Avatar",
    "icon": "avatar",
    "container": false,
    "behaviors": [],
    "doc": "Avatar — a single .avatar div whose inner <img> rounds via inherited radius.",
    "sourceFile": "silicaui-html/src/component.ts:1243"
  },
  {
    "name": "Collapse",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Collapse",
    "icon": "collapse",
    "container": false,
    "behaviors": [],
    "doc": "Collapse — a native <details> disclosure (works with zero JS on publish). Not a container: its body is `props.content` (text). `expand` still honors authored children as the body for direct toHtml use, but the builder edits it as a prop. Root class is author-supplied (see palette.ts) and should be `details`, NOT `collapse` — Tailwind v4's built-in `.collapse` utility (`visibility: collapse`) wins over any component rule of that name and silently hides the whole thing; see the doc comment in @wizeworks/silicaui/src/components/collapse.js for the full story.",
    "sourceFile": "silicaui-html/src/component.ts:1265"
  },
  {
    "name": "Timeline",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Timeline",
    "icon": "timeline",
    "container": false,
    "behaviors": [],
    "doc": "Timeline — a <ul class=\"timeline\"> of events (marker + content per item).",
    "sourceFile": "silicaui-html/src/component.ts:1281"
  },
  {
    "name": "Label",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Label",
    "icon": "label",
    "container": false,
    "behaviors": [],
    "doc": "── structural/presentational catch-up (2026-07-08 sync pass) ────────────── Plain element atoms — same shape as `elementDef`, one tag each, no behavior. Sub-parts that carry no semantic tag of their own (a styled <div>/<span> — Card's CardBody/CardTitle, Hero's HeroContent, etc.) are deliberately NOT registered here: a host authors them as plain class-carrying children, per the confirmed Card precedent. Only parts with real semantic value (a distinct tag, or \"part\" behavior metadata) get their own atom.",
    "sourceFile": "silicaui-html/src/component.ts:1303"
  },
  {
    "name": "AvatarGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "AvatarGroup",
    "icon": "avatar",
    "container": true,
    "behaviors": [],
    "doc": "AvatarGroup — lowers to `<span>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1304"
  },
  {
    "name": "Prose",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Prose",
    "icon": "text",
    "container": true,
    "behaviors": [],
    "doc": "Prose — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1305"
  },
  {
    "name": "RichText",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Rich text",
    "icon": "text",
    "container": true,
    "behaviors": [],
    "doc": "RichText — a `.prose` container for TRUSTED rich-text / CMS long-form HTML. Authored children render as-is; pair it with an `html` data binding and `resolveTree` fills its inner HTML from the host-sanitized resolved value (see NodeBase.rawHtml). This is the data-bound content-page primitive.",
    "sourceFile": "silicaui-html/src/component.ts:1311"
  },
  {
    "name": "Hero",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Hero",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Hero — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1318"
  },
  {
    "name": "Footer",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Footer",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Footer — lowers to `<footer>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1319"
  },
  {
    "name": "FooterTitle",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "FooterTitle",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "FooterTitle — lowers to `<h6>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:1320"
  },
  {
    "name": "MockupWindow",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "MockupWindow",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MockupWindow — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1321"
  },
  {
    "name": "MockupBrowser",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "MockupBrowser",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MockupBrowser — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1322"
  },
  {
    "name": "MockupCode",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "MockupCode",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MockupCode — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1323"
  },
  {
    "name": "MockupCodeLine",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Code line",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MockupCodeLine — a <pre> row inside MockupCode. The gutter marker is a real `data-prefix` attribute the CSS reads, not text content.",
    "sourceFile": "silicaui-html/src/component.ts:1327"
  },
  {
    "name": "MockupPhone",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "MockupPhone",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MockupPhone — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1338"
  },
  {
    "name": "List",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "List",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "List — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1339"
  },
  {
    "name": "Dock",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dock",
    "icon": "sidebar",
    "container": true,
    "behaviors": [],
    "doc": "Dock — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1340"
  },
  {
    "name": "Join",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Join",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Join — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1341"
  },
  {
    "name": "Indicator",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Indicator",
    "icon": "dot",
    "container": true,
    "behaviors": [],
    "doc": "Indicator — lowers to `<span>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1342"
  },
  {
    "name": "Mask",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Mask",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Mask — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1343"
  },
  {
    "name": "Fieldset",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Fieldset",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Fieldset — lowers to `<fieldset>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1344"
  },
  {
    "name": "FieldsetLegend",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "FieldsetLegend",
    "icon": "label",
    "container": false,
    "behaviors": [],
    "doc": "FieldsetLegend — lowers to `<legend>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:1345"
  },
  {
    "name": "Blockquote",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Blockquote",
    "icon": "text",
    "container": true,
    "behaviors": [],
    "doc": "Blockquote — lowers to `<blockquote>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1346"
  },
  {
    "name": "BlockquoteCite",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "BlockquoteCite",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "BlockquoteCite — lowers to `<footer>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:1347"
  },
  {
    "name": "MetadataList",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "MetadataList",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "MetadataList — lowers to `<dl>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1348"
  },
  {
    "name": "AppShell",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "AppShell",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "AppShell — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1349"
  },
  {
    "name": "AppShellSidebar",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "AppShellSidebar",
    "icon": "sidebar",
    "container": true,
    "behaviors": [],
    "doc": "AppShellSidebar — lowers to `<aside>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1350"
  },
  {
    "name": "AppShellHeader",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "AppShellHeader",
    "icon": "header",
    "container": true,
    "behaviors": [],
    "doc": "AppShellHeader — lowers to `<header>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1351"
  },
  {
    "name": "AppShellMain",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "AppShellMain",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "AppShellMain — lowers to `<main>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1352"
  },
  {
    "name": "AppShellFooter",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "AppShellFooter",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "AppShellFooter — lowers to `<footer>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1353"
  },
  {
    "name": "InputGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "InputGroup",
    "icon": "input",
    "container": true,
    "behaviors": [],
    "doc": "InputGroup — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1354"
  },
  {
    "name": "Diff",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Diff",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Diff — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1355"
  },
  {
    "name": "Toolbar",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Toolbar",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Toolbar — size/variant/dividers are props on the source node, forwarded as data-attrs the CSS reads (mirrors DrawerContent's `data-side` below).",
    "sourceFile": "silicaui-html/src/component.ts:1359"
  },
  {
    "name": "ToolbarCenter",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "ToolbarCenter",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ToolbarCenter — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1375"
  },
  {
    "name": "DockItem",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dock item",
    "icon": "sidebarTrigger",
    "container": true,
    "behaviors": [],
    "doc": "Button-shaped structural atoms — a real <button>/<a>, so registering them (vs. plain divs) buys the host correct semantics + tab order for free.",
    "sourceFile": "silicaui-html/src/component.ts:1380"
  },
  {
    "name": "InputGroupButton",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Input group button",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1388"
  },
  {
    "name": "ToolbarButton",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Toolbar button",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1396"
  },
  {
    "name": "ToolbarLink",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Toolbar link",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1404"
  },
  {
    "name": "ToolbarSeparator",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Toolbar separator",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1412"
  },
  {
    "name": "ClickableCard",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Clickable card",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ClickableCard — a Card that's a whole clickable surface; a <button>, or an <a> when it carries an href (mirrors Button's own href-swap rule).",
    "sourceFile": "silicaui-html/src/component.ts:1421"
  },
  {
    "name": "SearchInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Search input",
    "icon": "input",
    "container": false,
    "behaviors": [],
    "doc": "Leaf form inputs — native controls only; the show/hide + clear-button chrome the React versions add needs real JS, so those are dropped here rather than shipping a dead button (see the sync-gap memory).",
    "sourceFile": "silicaui-html/src/component.ts:1437"
  },
  {
    "name": "PasswordInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Password input",
    "icon": "input",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1444"
  },
  {
    "name": "CheckboxGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Checkbox group",
    "icon": "checkbox",
    "container": true,
    "behaviors": [],
    "doc": "CheckboxGroup / CheckboxOption — a native fieldset-free group of checkboxes; CheckboxOption's label text is its children, matching the React shape.",
    "sourceFile": "silicaui-html/src/component.ts:1454"
  },
  {
    "name": "CheckboxOption",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Checkbox option",
    "icon": "checkbox",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1462"
  },
  {
    "name": "Swap",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Swap",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Swap — a hidden checkbox driving a pure-CSS cross-fade between two children (`.swap-on` / `.swap-off`, authored by the host as the node's children).",
    "sourceFile": "silicaui-html/src/component.ts:1474"
  },
  {
    "name": "Display",
    "package": "@wizeworks/silicaui-html",
    "category": "content",
    "label": "Display",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "Display — an oversized hero heading; always `.display`-styled, semantic level from props (mirrors Heading's own level handling).",
    "sourceFile": "silicaui-html/src/component.ts:1488"
  },
  {
    "name": "Timestamp",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Timestamp",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "doc": "Timestamp — dependency-free `Intl`-formatted date text. Computed once at render time (no live \"3m ago\" ticking without a JS runtime); `props.value` is an ISO date string, `props.format` picks relative vs. absolute.",
    "sourceFile": "silicaui-html/src/component.ts:1503"
  },
  {
    "name": "EmptyState",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Empty state",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "doc": "EmptyState — the centered \"nothing here yet\" placeholder; icon/title/ description/actions are DATA slots (mirrors Stat's prop-driven rows).",
    "sourceFile": "silicaui-html/src/component.ts:1537"
  },
  {
    "name": "RadioGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Radio group",
    "icon": "radio",
    "container": true,
    "behaviors": [],
    "doc": "RadioGroup / RadioOption — same shape as CheckboxGroup/CheckboxOption, one native radio per option (shared `name` gives arrow-key nav for free).",
    "sourceFile": "silicaui-html/src/component.ts:1556"
  },
  {
    "name": "RadioOption",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Radio option",
    "icon": "radio",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1564"
  },
  {
    "name": "Stats",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Stats",
    "icon": "stat",
    "container": true,
    "behaviors": [],
    "doc": "Stats — a flex row grouping multiple Stat blocks (mirrors AvatarGroup).",
    "sourceFile": "silicaui-html/src/component.ts:1572"
  },
  {
    "name": "Meter",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Meter",
    "icon": "progress",
    "container": false,
    "behaviors": [],
    "doc": "Meter — a static measurement (not task advancement, unlike Progress); same bucketed-literal-width technique so the fill needs no inline style.",
    "sourceFile": "silicaui-html/src/component.ts:1577"
  },
  {
    "name": "RadialProgress",
    "package": "@wizeworks/silicaui-html",
    "category": "feedback",
    "label": "Radial progress",
    "icon": "progress",
    "container": false,
    "behaviors": [],
    "doc": "RadialProgress — a circular ring; `--value` can't be an inline style (no inline style, ever), so the value snaps to the nearest of 21 literal `[--value:N]` utility buckets, same principle as Progress's width buckets.",
    "sourceFile": "silicaui-html/src/component.ts:1591"
  },
  {
    "name": "Accordion",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Accordion",
    "icon": "collapse",
    "container": true,
    "behaviors": [
      "disclosure"
    ],
    "doc": "Accordion — `disclosure` with `params.single`; AccordionItem is a plain wrapper div (no part), Trigger/Panel carry the trigger/panel roles.",
    "sourceFile": "silicaui-html/src/component.ts:1624"
  },
  {
    "name": "AccordionItem",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "AccordionItem",
    "icon": "collapse",
    "container": true,
    "behaviors": [],
    "doc": "AccordionItem — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1638"
  },
  {
    "name": "AccordionTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Accordion trigger",
    "icon": "collapse",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1640"
  },
  {
    "name": "AccordionPanel",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Accordion panel",
    "icon": "collapse",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1652"
  },
  {
    "name": "Collapsible",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Collapsible",
    "icon": "collapse",
    "container": true,
    "behaviors": [
      "disclosure"
    ],
    "doc": "Collapsible — a single `disclosure` trigger/panel pair (not single-open — there's only one pair under this root).",
    "sourceFile": "silicaui-html/src/component.ts:1668"
  },
  {
    "name": "CollapsibleTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Collapsible trigger",
    "icon": "collapse",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1680"
  },
  {
    "name": "CollapsiblePanel",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Collapsible panel",
    "icon": "collapse",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1692"
  },
  {
    "name": "ColorPicker",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Color picker",
    "icon": "box",
    "container": false,
    "behaviors": [
      "color-picker"
    ],
    "doc": "ColorPicker — the real OKLCH editor, not `<input type=\"color\">`. The native input was the obvious shortcut and is a DIFFERENT control (an sRGB swatch dialog, not an L/C/H editor); shipping it under this name would misdescribe what a consumer gets. Structure only — no `style` attributes, since static output must stay CSP-clean (verify-csp). The handler paints the ramps.",
    "sourceFile": "silicaui-html/src/component.ts:1711"
  },
  {
    "name": "TagInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Tag input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "tag-input"
    ],
    "doc": "TagInput — chips + a text field. The `template` part is what lets the handler create new chips without hardcoding class names in the runtime, which would break under a SilicaProvider prefix.",
    "sourceFile": "silicaui-html/src/component.ts:1797"
  },
  {
    "name": "Countdown",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Countdown",
    "icon": "box",
    "container": false,
    "behaviors": [
      "countdown"
    ],
    "doc": "Countdown — a live clock. Renders the CORRECT values for its build moment rather than zeros, so a page that never hydrates shows a sensible (if frozen) countdown instead of empty boxes; the handler then takes over.",
    "sourceFile": "silicaui-html/src/component.ts:1870"
  },
  {
    "name": "Filter",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Filter chips",
    "icon": "box",
    "container": true,
    "behaviors": [
      "toggle-group"
    ],
    "doc": "Filter — a single-select chip row with a reset. This is the EXISTING `toggle-group` behavior, not a new one: same single-select press semantics, same roving focus, same aria-pressed buttons. The only delta was the reset, which is now an optional `reset` part on that handler. Reusing kept the BehaviorType vocabulary closed, which is deliberate.",
    "sourceFile": "silicaui-html/src/component.ts:1923"
  },
  {
    "name": "FilterItem",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Filter chip",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:1945"
  },
  {
    "name": "ChatImage",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatImage",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "── chat ────────────────────────────────────────────────────────────────── The whole family lands together on purpose. Half a family is worse than none: a consumer who finds `Chat` but no `ChatComposer` hand-rolls the missing half in markup that then drifts from the React layer, which is the exact failure this registry exists to prevent.\n\nThe primitives (image/header/footer/bubble/layout) take their class from the authored node like `Card` does; the composites below build inner structure the author never writes, so those classes ARE emitted here.",
    "sourceFile": "silicaui-html/src/component.ts:1977"
  },
  {
    "name": "ChatHeader",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatHeader",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatHeader — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1978"
  },
  {
    "name": "ChatFooter",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatFooter",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatFooter — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1979"
  },
  {
    "name": "ChatBubble",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatBubble",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatBubble — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1980"
  },
  {
    "name": "ChatLayout",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatLayout",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatLayout — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1981"
  },
  {
    "name": "ChatLayoutMessages",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatLayoutMessages",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatLayoutMessages — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1982"
  },
  {
    "name": "ChatMessageMetadata",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "ChatMessageMetadata",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatMessageMetadata — lowers to `<div>`, holding its children.",
    "sourceFile": "silicaui-html/src/component.ts:1983"
  },
  {
    "name": "Chat",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Chat row",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Chat — one message row. `side: \"end\"` flips it to the outgoing side.",
    "sourceFile": "silicaui-html/src/component.ts:1986"
  },
  {
    "name": "ChatSystemMessage",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Chat system message",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "A centered notice (\"Today\", \"Ada joined\") — attributed to neither side.",
    "sourceFile": "silicaui-html/src/component.ts:2001"
  },
  {
    "name": "ChatMessage",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Chat message",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "ChatMessage — the convenience composite the React layer also exposes, lowering to the same primitives. `avatar` is a STRING here (initials); a rich avatar node is authored by composing Chat/ChatImage/ChatBubble directly, exactly as in React.",
    "sourceFile": "silicaui-html/src/component.ts:2018"
  },
  {
    "name": "ChatTypingIndicator",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Chat typing indicator",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "Three animated dots inside a real bubble, so it occupies the slot the next message will land in rather than reading as a stray line of muted text.",
    "sourceFile": "silicaui-html/src/component.ts:2051"
  },
  {
    "name": "ChatToolCalls",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Chat tool calls",
    "icon": "collapse",
    "container": true,
    "behaviors": [
      "disclosure"
    ],
    "doc": "ChatToolCalls — reuses the existing `disclosure` behavior and the Collapsible part classes the CSS already targets, rather than inventing a new BehaviorType for what is structurally a collapsible.",
    "sourceFile": "silicaui-html/src/component.ts:2077"
  },
  {
    "name": "ChatComposer",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Chat composer",
    "icon": "textarea",
    "container": true,
    "behaviors": [
      "form"
    ],
    "doc": "ChatComposer — a real <form> so a static page can actually send. React adds autoresize and Enter-to-send on top; those are progressive enhancements, and their absence degrades to a normal textarea + submit rather than to something broken.",
    "sourceFile": "silicaui-html/src/component.ts:2104"
  },
  {
    "name": "Carousel",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Carousel",
    "icon": "box",
    "container": true,
    "behaviors": [
      "carousel"
    ],
    "doc": "Carousel — `carousel`; unlike Accordion/Tabs/Menu, Track/Prev/Next/Dot aren't part of the public React API (Carousel/CarouselItem only), so the macro builds that inner structure itself from `node.children`, matching what the React component does internally.",
    "sourceFile": "silicaui-html/src/component.ts:2139"
  },
  {
    "name": "CarouselItem",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Carousel item",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2173"
  },
  {
    "name": "Marquee",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Marquee",
    "icon": "box",
    "container": true,
    "behaviors": [
      "marquee"
    ],
    "doc": "Marquee — `marquee`. Direction/speed/fade are CLASSES, not props: they're pure presentation with no structural or runtime counterpart, so the class is the API exactly as it is for Button. `repeat` earns a prop because it changes the STRUCTURE (how many copies get rendered) and the copy count has to agree with `--marquee-copies` or the loop distance is wrong — so the macro owns both halves. `pauseOnHover` earns one because it has a runtime counterpart to keep in step (the behavior param below).",
    "sourceFile": "silicaui-html/src/component.ts:2193"
  },
  {
    "name": "DropdownMenu",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dropdown menu",
    "icon": "nav",
    "container": true,
    "behaviors": [
      "menu"
    ],
    "doc": "DropdownMenu — `menu`; Trigger/Content/Item carry the trigger/panel/item roles. Content starts hidden (menu.ts reads its own `hidden` attribute to determine open state). Group/Label/Separator are plain elements — author them directly inside Content, same rule as every other sub-part above.",
    "sourceFile": "silicaui-html/src/component.ts:2234"
  },
  {
    "name": "DropdownMenuTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dropdown trigger",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2246"
  },
  {
    "name": "DropdownMenuContent",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dropdown content",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2258"
  },
  {
    "name": "DropdownMenuItem",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Dropdown item",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2272"
  },
  {
    "name": "Tabs",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tabs",
    "icon": "box",
    "container": true,
    "behaviors": [
      "tabs"
    ],
    "doc": "Tabs — `tabs`; Tab/Panel pair by position. TabsList is a plain wrapper (tabs.ts scopes `ownParts` to the whole root, not a specific list part).",
    "sourceFile": "silicaui-html/src/component.ts:2287"
  },
  {
    "name": "TabsList",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tabs list",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "doc": "TabsList carries the tablist role its role=tab children require; the tabs behavior fills in aria-selected/tabindex at hydrate. Panels stay visible pre-hydration on purpose (progressive enhancement — no-JS readers get all content), the runtime hides the inactive ones.",
    "sourceFile": "silicaui-html/src/component.ts:2303"
  },
  {
    "name": "TabsTab",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tab",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2336"
  },
  {
    "name": "TabsPanel",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tab panel",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2348"
  },
  {
    "name": "Outline",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Outline",
    "icon": "nav",
    "container": false,
    "behaviors": [
      "toc"
    ],
    "doc": "Outline — `toc`; unlike the React version (which derives its list from scanning heading elements at runtime), the vanilla macro is prop-driven like Breadcrumb/Steps/Timeline: `props.items`: `{id, label}[]` becomes the anchor links the `toc` behavior tracks via IntersectionObserver.",
    "sourceFile": "silicaui-html/src/component.ts:2365"
  },
  {
    "name": "Dialog",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Dialog",
    "icon": "box",
    "container": true,
    "behaviors": [
      "modal"
    ],
    "doc": "── interactive: new primitives (2026-07-08 bucket-2b sync pass) ────────── `modal` — Dialog/Drawer/AlertDialog/Lightbox/CommandPalette all share one Root(behavior) > Trigger(part=trigger) + Backdrop(part=backdrop) + Content(part=panel) + Close(part=close) shape; Lightbox layers `slide`/ `prev`/`next`/`title`(counter) parts and CommandPalette layers `search`/ `item` parts on the SAME behavior type rather than getting their own — see `modal.ts`. Header/Footer/Group/Label sub-parts are NOT registered (plain docking-bar divs — same sub-part rule as Card's CardBody).",
    "sourceFile": "silicaui-html/src/component.ts:2398"
  },
  {
    "name": "DialogTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Dialog trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2410"
  },
  {
    "name": "DialogBackdrop",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Dialog backdrop",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2422"
  },
  {
    "name": "DialogContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Dialog content",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2433"
  },
  {
    "name": "DialogClose",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Dialog close",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2448"
  },
  {
    "name": "DialogTitle",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "DialogTitle",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "DialogTitle — lowers to `<h2>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2459"
  },
  {
    "name": "DialogDescription",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "DialogDescription",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "DialogDescription — lowers to `<p>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2460"
  },
  {
    "name": "Drawer",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Drawer",
    "icon": "sidebar",
    "container": true,
    "behaviors": [
      "modal"
    ],
    "doc": "Drawer — identical shape to Dialog; `props.side` becomes a `data-side` attribute on the panel for the CSS to slide from (render-neutral to the behavior itself).",
    "sourceFile": "silicaui-html/src/component.ts:2466"
  },
  {
    "name": "DrawerTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Drawer trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2478"
  },
  {
    "name": "DrawerBackdrop",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Drawer backdrop",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2490"
  },
  {
    "name": "DrawerContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Drawer content",
    "icon": "sidebar",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2501"
  },
  {
    "name": "DrawerClose",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Drawer close",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2517"
  },
  {
    "name": "DrawerTitle",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "DrawerTitle",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "DrawerTitle — lowers to `<h2>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2528"
  },
  {
    "name": "DrawerDescription",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "DrawerDescription",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "DrawerDescription — lowers to `<p>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2529"
  },
  {
    "name": "AlertDialog",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog",
    "icon": "warning",
    "container": true,
    "behaviors": [
      "modal"
    ],
    "doc": "AlertDialog — same shape, `params.dismissible: false` (backdrop is inert — clicking it does NOT close, only Escape/an explicit close does, per the ARIA alert-dialog pattern). Action/Cancel are both `close` parts — a host's own click listener on Action still runs before this one closes it.",
    "sourceFile": "silicaui-html/src/component.ts:2536"
  },
  {
    "name": "AlertDialogTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2548"
  },
  {
    "name": "AlertDialogBackdrop",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog backdrop",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2560"
  },
  {
    "name": "AlertDialogContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog content",
    "icon": "warning",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2571"
  },
  {
    "name": "AlertDialogClose",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog close",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2586"
  },
  {
    "name": "AlertDialogCancel",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog cancel",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2598"
  },
  {
    "name": "AlertDialogAction",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Alert dialog action",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2610"
  },
  {
    "name": "AlertDialogTitle",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "AlertDialogTitle",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "AlertDialogTitle — lowers to `<h2>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2621"
  },
  {
    "name": "AlertDialogDescription",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "AlertDialogDescription",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "AlertDialogDescription — lowers to `<p>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2622"
  },
  {
    "name": "Lightbox",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox",
    "icon": "image",
    "container": true,
    "behaviors": [
      "modal"
    ],
    "doc": "Lightbox — trigger[i] opens slide[i] (positional pairing, like `tabs`); Counter reuses the `title` role (same \"text this behavior keeps in sync\" convention `calendar`'s month label uses).",
    "sourceFile": "silicaui-html/src/component.ts:2628"
  },
  {
    "name": "LightboxTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2640"
  },
  {
    "name": "LightboxBackdrop",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox backdrop",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2652"
  },
  {
    "name": "LightboxContent",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox content",
    "icon": "image",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2663"
  },
  {
    "name": "LightboxSlide",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox slide",
    "icon": "image",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2678"
  },
  {
    "name": "LightboxPrev",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox previous",
    "icon": "button",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2690"
  },
  {
    "name": "LightboxNext",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox next",
    "icon": "button",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2704"
  },
  {
    "name": "LightboxClose",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox close",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2718"
  },
  {
    "name": "LightboxCounter",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Lightbox counter",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2733"
  },
  {
    "name": "CommandPalette",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Command palette",
    "icon": "search",
    "container": true,
    "behaviors": [
      "modal"
    ],
    "doc": "CommandPalette — `params.hotkey` binds ⌘K/Ctrl+K globally (default `true`; `props.hotkey === false` disables it). Input/Item reuse the `search`/`item` parts `modal.ts` optionally wires filter+arrow-nav for.",
    "sourceFile": "silicaui-html/src/component.ts:2748"
  },
  {
    "name": "CommandPaletteBackdrop",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Command palette backdrop",
    "icon": "box",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2763"
  },
  {
    "name": "CommandPaletteContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Command palette content",
    "icon": "search",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2774"
  },
  {
    "name": "CommandPaletteInput",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Command palette input",
    "icon": "input",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2789"
  },
  {
    "name": "CommandPaletteItem",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Command palette item",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2802"
  },
  {
    "name": "Popover",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Popover",
    "icon": "box",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "doc": "`popover` — anchored trigger/panel pairs; positioning is computed at runtime (see `popover.ts`), same precedent as `carousel`'s `track.style.transform`. Popover/Tooltip/PreviewCard differ only by `params.trigger` — real parameters, not a papered-over mismatch.",
    "sourceFile": "silicaui-html/src/component.ts:2819"
  },
  {
    "name": "PopoverTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Popover trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2831"
  },
  {
    "name": "PopoverContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Popover content",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2843"
  },
  {
    "name": "PopoverClose",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Popover close",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2855"
  },
  {
    "name": "PopoverTitle",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "PopoverTitle",
    "icon": "heading",
    "container": false,
    "behaviors": [],
    "doc": "PopoverTitle — lowers to `<h3>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2866"
  },
  {
    "name": "PopoverDescription",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "PopoverDescription",
    "icon": "text",
    "container": false,
    "behaviors": [],
    "doc": "PopoverDescription — lowers to `<p>`, carrying `props.text` as its content.",
    "sourceFile": "silicaui-html/src/component.ts:2867"
  },
  {
    "name": "Tooltip",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Tooltip",
    "icon": "box",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "doc": "Tooltip — `params.trigger: \"hover\"`; the trigger wraps an arbitrary element (Base UI merges hover/focus onto it directly — a framework-free host instead gets a small inline wrapper, a documented simplification).",
    "sourceFile": "silicaui-html/src/component.ts:2873"
  },
  {
    "name": "TooltipTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Tooltip trigger",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2885"
  },
  {
    "name": "TooltipContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Tooltip content",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2897"
  },
  {
    "name": "PreviewCard",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Preview card",
    "icon": "box",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "doc": "PreviewCard — same shape as Tooltip (hover trigger), rich card content rather than a short text label.",
    "sourceFile": "silicaui-html/src/component.ts:2912"
  },
  {
    "name": "PreviewCardTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Preview card trigger",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2924"
  },
  {
    "name": "PreviewCardContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Preview card content",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2936"
  },
  {
    "name": "ContextMenu",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Context menu",
    "icon": "nav",
    "container": true,
    "behaviors": [
      "menu"
    ],
    "doc": "ContextMenu — reuses `menu` (not `popover`): its content is a flat action-item list that wants the SAME arrow-key/Home/End roving focus DropdownMenu already has, not a rich anchored panel. `params.trigger: \"context\"` swaps the open event to `contextmenu` and positions at the pointer instead of the trigger rect (see `menu.ts`).",
    "sourceFile": "silicaui-html/src/component.ts:2954"
  },
  {
    "name": "ContextMenuTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Context menu area",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2966"
  },
  {
    "name": "ContextMenuContent",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Context menu content",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2978"
  },
  {
    "name": "ContextMenuItem",
    "package": "@wizeworks/silicaui-html",
    "category": "overlay",
    "label": "Context menu item",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:2990"
  },
  {
    "name": "Menubar",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menubar",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "doc": "Menubar — each menu is its OWN independent `menu` root (a documented simplification: no bar-wide single-open coordination or hover-to-switch in vanilla, since sibling behavior roots can't see each other — but every menu still fully opens/closes/roves/dismisses on its own).",
    "sourceFile": "silicaui-html/src/component.ts:3006"
  },
  {
    "name": "MenubarMenu",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menu",
    "icon": "nav",
    "container": true,
    "behaviors": [
      "menu"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3008"
  },
  {
    "name": "MenubarTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menubar trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3020"
  },
  {
    "name": "MenubarContent",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menubar content",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3032"
  },
  {
    "name": "MenubarItem",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Menubar item",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3044"
  },
  {
    "name": "NavigationMenu",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "NavigationMenu",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "doc": "NavigationMenu — each item is its own independent `popover` root (`hover` trigger; same bar-wide-coordination simplification as Menubar). Content is rich mega-menu markup, not a flat item list, so this reuses `popover` (no item roving assumed) rather than `menu`.",
    "sourceFile": "silicaui-html/src/component.ts:3060"
  },
  {
    "name": "NavigationMenuItem",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Navigation menu item",
    "icon": "nav",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3062"
  },
  {
    "name": "NavigationMenuTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Navigation menu trigger",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3074"
  },
  {
    "name": "NavigationMenuContent",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Navigation menu content",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3086"
  },
  {
    "name": "NavigationMenuLink",
    "package": "@wizeworks/silicaui-html",
    "category": "nav",
    "label": "Navigation menu link",
    "icon": "nav",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3098"
  },
  {
    "name": "Combobox",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Combobox",
    "icon": "select",
    "container": false,
    "behaviors": [
      "combobox"
    ],
    "doc": "`combobox` — Combobox/Autocomplete/MultiSelect are all SINGLE, self- contained React components with an `items` prop (like `Select`, not a Root/Trigger/Content compound tree), so their vanilla macros follow the same shape: build the whole input+popup+options structure from `props.items` (unauthored structural sugar, same precedent as `Carousel`'s invented track/dots). Only `params.mode` differs.",
    "sourceFile": "silicaui-html/src/component.ts:3113"
  },
  {
    "name": "Autocomplete",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Autocomplete",
    "icon": "select",
    "container": false,
    "behaviors": [
      "combobox"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3120"
  },
  {
    "name": "MultiSelect",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Multi select",
    "icon": "select",
    "container": false,
    "behaviors": [
      "combobox"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3127"
  },
  {
    "name": "DateInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "date-segment"
    ],
    "doc": "`date-segment` — DateInput/DateTimeInput/TimeInput carry the behavior on their own root; DateRangeInput is two INDEPENDENT `date-segment` roots nested side by side (hydrate() scans the whole document for behavior roots, not just top-level ones, so both wire up with zero extra code).",
    "sourceFile": "silicaui-html/src/component.ts:3139"
  },
  {
    "name": "DateRangeInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date range input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "date-segment"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3157"
  },
  {
    "name": "DateTimeInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date & time input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "date-segment"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3173"
  },
  {
    "name": "TimeInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Time input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "date-segment"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3199"
  },
  {
    "name": "PinInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "PIN input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "pin-input"
    ],
    "doc": "`pin-input` — real single-char `<input>` cells (index-based), unlike `date-segment`'s buffer-accumulate model — see `pin-input.ts`.",
    "sourceFile": "silicaui-html/src/component.ts:3225"
  },
  {
    "name": "Calendar",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Calendar",
    "icon": "calendar",
    "container": false,
    "behaviors": [
      "calendar"
    ],
    "doc": "`calendar` — Calendar carries the behavior directly; DatePicker/ DateRangePicker are the SAME calendar shell nested inside a `popover` root's panel (a `calendar` behavior root nested inside a `popover` one — `ownParts` already stops at nested behavior boundaries, so this needs no extra code, same composition trick as Lightbox nesting inside `modal`).",
    "sourceFile": "silicaui-html/src/component.ts:3270"
  },
  {
    "name": "DatePicker",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date picker",
    "icon": "calendar",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3282"
  },
  {
    "name": "DatePickerTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date picker trigger",
    "icon": "calendar",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3294"
  },
  {
    "name": "DatePickerContent",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date picker content",
    "icon": "calendar",
    "container": false,
    "behaviors": [
      "calendar"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3306"
  },
  {
    "name": "DateRangePicker",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date range picker",
    "icon": "calendar",
    "container": true,
    "behaviors": [
      "popover"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3320"
  },
  {
    "name": "DateRangePickerTrigger",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date range picker trigger",
    "icon": "calendar",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3332"
  },
  {
    "name": "DateRangePickerContent",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Date range picker content",
    "icon": "calendar",
    "container": false,
    "behaviors": [
      "calendar"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3344"
  },
  {
    "name": "TreeView",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tree view",
    "icon": "box",
    "container": true,
    "behaviors": [
      "tree"
    ],
    "doc": "`tree` — TreeGroup defaults hidden unless `defaultExpanded`, same convention `AccordionPanel`/`CollapsiblePanel` established (the behavior only READS existing hidden state on hydrate, never forces it).",
    "sourceFile": "silicaui-html/src/component.ts:3364"
  },
  {
    "name": "TreeNode",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tree node",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3376"
  },
  {
    "name": "TreeToggle",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tree toggle",
    "icon": "button",
    "container": false,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3388"
  },
  {
    "name": "TreeGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Tree group",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3402"
  },
  {
    "name": "Wizard",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Wizard",
    "icon": "box",
    "container": true,
    "behaviors": [
      "wizard"
    ],
    "doc": "`wizard` — Back/Next reuse the `prev`/`next` roles (already exist).",
    "sourceFile": "silicaui-html/src/component.ts:3416"
  },
  {
    "name": "WizardStep",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Wizard step",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3428"
  },
  {
    "name": "WizardPanel",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Wizard panel",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3442"
  },
  {
    "name": "WizardBack",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Wizard back",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3454"
  },
  {
    "name": "WizardNext",
    "package": "@wizeworks/silicaui-html",
    "category": "data",
    "label": "Wizard next",
    "icon": "button",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3466"
  },
  {
    "name": "NumberField",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Number field",
    "icon": "input",
    "container": true,
    "behaviors": [
      "number-field"
    ],
    "doc": "`number-field` — native `<input type=number>`, no Base-UI-only CSS selectors to work around (confirmed via the CSS check this pass).",
    "sourceFile": "silicaui-html/src/component.ts:3484"
  },
  {
    "name": "ToggleGroup",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Toggle group",
    "icon": "toggle",
    "container": true,
    "behaviors": [
      "toggle-group"
    ],
    "doc": "`toggle-group` — a toolbar of toggle buttons, NOT a listbox (distinct ARIA pattern from `SelectionList`: `aria-pressed` on real buttons).",
    "sourceFile": "silicaui-html/src/component.ts:3514"
  },
  {
    "name": "ToggleGroupItem",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Toggle group item",
    "icon": "toggle",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3532"
  },
  {
    "name": "Range",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Range",
    "icon": "input",
    "container": false,
    "behaviors": [
      "slider"
    ],
    "doc": "`slider` — Range (compact) and Slider (rich, `showValue`) are both single self-contained components; see `sliderExpand`. Base UI's three addressable Track/Indicator/Thumb nodes are rebuilt here since a bare `<input type=range>` has no such structure (confirmed via the CSS check this pass) — real pointer-drag + keyboard geometry, not a native fallback.",
    "sourceFile": "silicaui-html/src/component.ts:3552"
  },
  {
    "name": "Slider",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Slider",
    "icon": "input",
    "container": false,
    "behaviors": [
      "slider"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3553"
  },
  {
    "name": "Switch",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Switch",
    "icon": "toggle",
    "container": false,
    "behaviors": [
      "switch"
    ],
    "doc": "`switch` — a `role=switch` element the CSS keys off `[data-checked]` for (Base UI's synthetic attribute, ported verbatim — a bare `<input type=checkbox>` would NOT match `.switch`'s selectors).",
    "sourceFile": "silicaui-html/src/component.ts:3559"
  },
  {
    "name": "Rating",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Rating",
    "icon": "star",
    "container": false,
    "behaviors": [
      "rating"
    ],
    "doc": "`rating` — not Base UI-backed in React either (plain JSX-set `data-filled`), so this ports near 1:1.",
    "sourceFile": "silicaui-html/src/component.ts:3583"
  },
  {
    "name": "ScrollArea",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Scroll area",
    "icon": "box",
    "container": true,
    "behaviors": [
      "scroll-area"
    ],
    "doc": "`scroll-area` — a real `overflow:auto` `track` (CSS hides its native scrollbar) with a custom `thumb` the behavior sizes/positions from the viewport/content ratio — not achievable as a pure-CSS trick (confirmed this pass).",
    "sourceFile": "silicaui-html/src/component.ts:3619"
  },
  {
    "name": "ScrollStrip",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Scroll strip",
    "icon": "list",
    "container": true,
    "behaviors": [
      "scroll-strip"
    ],
    "doc": "`scroll-strip` — a horizontal strip that SAYS SO when part of it is off-screen. The prev/next controls ship `hidden` so a no-JS render is a plain scroller rather than two dead buttons; the behavior reveals the PAIR once the content stops fitting (never one at a time — see the handler for why that oscillates).",
    "sourceFile": "silicaui-html/src/component.ts:3641"
  },
  {
    "name": "OverflowList",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Overflow list",
    "icon": "box",
    "container": true,
    "behaviors": [
      "overflow-list"
    ],
    "doc": "`overflow-list` — real `item`s reparent into the `panel` behind a \"+N\" `trigger` once they don't fit; `params.maxVisible` forces a fixed count when real layout isn't available (see `overflow-list.ts`).",
    "sourceFile": "silicaui-html/src/component.ts:3681"
  },
  {
    "name": "OverflowListItem",
    "package": "@wizeworks/silicaui-html",
    "category": "layout",
    "label": "Overflow list item",
    "icon": "box",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3709"
  },
  {
    "name": "Dropzone",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Dropzone",
    "icon": "input",
    "container": true,
    "behaviors": [
      "dropzone"
    ],
    "doc": "`dropzone` — Dropzone is bare (presentational only, host owns the file list via `onFiles`-equivalent listening for `sui:file`); FileUpload adds a managed `list` part the behavior renders thumbnail/name/remove rows into directly (the one place a behavior owns real create-your-own-markup state, same precedent as `Carousel`'s track/dots).",
    "sourceFile": "silicaui-html/src/component.ts:3726"
  },
  {
    "name": "FileUpload",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "File upload",
    "icon": "input",
    "container": true,
    "behaviors": [
      "dropzone"
    ],
    "sourceFile": "silicaui-html/src/component.ts:3727"
  },
  {
    "name": "PhoneInput",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Phone input",
    "icon": "input",
    "container": false,
    "behaviors": [
      "phone-input"
    ],
    "doc": "`phone-input` — a country `<select>` (options carry `data-dial`) joined with a digits `input`; the country list is plain static data, ported verbatim (no React-only mechanism was involved in the original).",
    "sourceFile": "silicaui-html/src/component.ts:3733"
  },
  {
    "name": "ThemeController",
    "package": "@wizeworks/silicaui-html",
    "category": "form",
    "label": "Theme controller",
    "icon": "box",
    "container": true,
    "behaviors": [
      "theme-toggle"
    ],
    "doc": "`theme-toggle` — thin wiring over the existing `setTheme`/`getTheme` primitives (see `theme-toggle.ts`); there was no new state machine to build here, just a registration.",
    "sourceFile": "silicaui-html/src/component.ts:3772"
  },
  {
    "name": "Overlay",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Overlay",
    "icon": "image",
    "container": true,
    "behaviors": [],
    "doc": "Overlay — pure CSS (`[data-reveal=\"hover\"]:hover .overlay-scrim`); no behavior at all (confirmed this pass). OverlayScrim is a real sub-atom (not a plain div) because `data-placement` is behavior-relevant to the CSS, same rule that earned ToolbarSeparator its own atom.",
    "sourceFile": "silicaui-html/src/component.ts:3794"
  },
  {
    "name": "OverlayScrim",
    "package": "@wizeworks/silicaui-html",
    "category": "media",
    "label": "Overlay scrim",
    "icon": "image",
    "container": true,
    "behaviors": [],
    "sourceFile": "silicaui-html/src/component.ts:3802"
  },
  {
    "name": "accordion",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/accordion.js",
    "description": "The Accordion component — collapsible sections (Base UI behavior). Colorless. Base UI drives open/close state and exposes the natural panel height as `--accordion-panel-height`, which we animate; the panel starts and ends at height 0 (`[data-starting-style]`/`[data-ending-style]`). The trigger chevron rotates while its panel is open (`[data-panel-open]`). Padding lives on an inner `.accordion-content` so the height animation stays smooth. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "accordion",
    "classes": [
      "accordion",
      "accordion-content",
      "accordion-header",
      "accordion-item",
      "accordion-panel",
      "accordion-trigger"
    ]
  },
  {
    "name": "alert",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/alert.js",
    "description": "The Alert component — a feedback surface for a contextual message. Same orthogonal design as Button/Badge: a color class (`.alert-success`) only sets `--alert-*` variables; `.alert` and the style classes read them. Alert is a box-tier surface, so it rounds with `--radius-box` (like Card). It lays its children out as a flex row — an optional leading icon, a growing content column, and any trailing actions — so the icon and text share one baseline. Variants mirror the rest of the system: solid (default, painted by `.alert`), plus `-soft` (tint), `-outline`, and `-dash`. Silica ships no icons; pass your own into the leading slot. @param {string[]} colors - color names to generate `.alert-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "alert",
    "classes": [
      "alert",
      "alert-accent",
      "alert-actions",
      "alert-banner",
      "alert-close",
      "alert-content",
      "alert-dash",
      "alert-description",
      "alert-dismiss",
      "alert-dismiss-inner",
      "alert-error",
      "alert-ghost",
      "alert-info",
      "alert-lg",
      "alert-md",
      "alert-neutral",
      "alert-outline",
      "alert-primary",
      "alert-secondary",
      "alert-sm",
      "alert-soft",
      "alert-success",
      "alert-title",
      "alert-warning",
      "alert-xl",
      "alert-xs"
    ],
    "colorVariants": [
      "alert-primary",
      "alert-secondary",
      "alert-accent",
      "alert-neutral",
      "alert-info",
      "alert-success",
      "alert-warning",
      "alert-error"
    ],
    "colorPattern": "alert-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `alert-<color>` accepts any color the app registers (see get_tokens → customColors). `alert-brand` is as real as `alert-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".alert-dismiss[data-closed]"
    ]
  },
  {
    "name": "animations",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/animations.js",
    "description": "Assignable element animations — presets an end user (via a site builder) can apply to ANY element, generated from one preset table so the three trigger class families always stay in sync: .sui-animate-{preset} — ON LOAD: a `@keyframes` animation that plays automatically on paint. No JS, no attribute. .sui-reveal-{preset} — ON SCROLL: sits at its hidden state by default, transitions to visible once `[data-sui-inview]` lands on the element (set by the `reveal` behavior in @wizeworks/silicaui-behaviors) — the same idiom Dialog/Popover already use for `[data-starting-style]`/`[data-ending-style]`, just driven by our own attribute. .sui-hover-{preset} — HOVER: a plain `:hover`/`:focus-visible` transition. No JS. Naming is deliberately `sui-`, not `animate-`: Tailwind core already ships `animate-spin`/`animate-pulse`/etc, and this package's own keyframes (`silica-spin`, `silica-skeleton`, …) already sidestep that collision by never exposing a bare `.animate-*` class. `sui-` also mirrors the existing `data-sui-*` marker namespace used by behaviors. Speed/delay are separate modifier classes (`.sui-duration-*`, `.sui-delay-*`) that set the `--sui-motion-duration`/`--sui-motion-delay` custom properties a preset reads, each with a `var(--duration-fast, …)` -style fallback — same non-namespace-token convention as `--duration`/ `--ease` (see theme.js): the DEFAULT lives in the fallback, so an app's own `--duration-fast` override always wins regardless of layer ordering. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "sui-",
    "rootNote": "No bare `.sui` class exists — this family is only its `sui-*` parts.",
    "classes": [
      "sui-animate-fade-in",
      "sui-animate-scale-in",
      "sui-animate-slide-down",
      "sui-animate-slide-left",
      "sui-animate-slide-right",
      "sui-animate-slide-up",
      "sui-animate-zoom-in",
      "sui-delay-1",
      "sui-delay-2",
      "sui-delay-3",
      "sui-duration-fast",
      "sui-duration-normal",
      "sui-duration-slow",
      "sui-hover-glow",
      "sui-hover-lift",
      "sui-hover-scale",
      "sui-reveal-fade-in",
      "sui-reveal-scale-in",
      "sui-reveal-slide-down",
      "sui-reveal-slide-left",
      "sui-reveal-slide-right",
      "sui-reveal-slide-up",
      "sui-reveal-zoom-in"
    ],
    "compoundSelectors": [
      "@keyframes silica-fade-in",
      "@keyframes silica-slide-up",
      "@keyframes silica-slide-down",
      "@keyframes silica-slide-left",
      "@keyframes silica-slide-right",
      "@keyframes silica-scale-in",
      "@keyframes silica-zoom-in",
      "@media (prefers-reduced-motion: reduce)"
    ]
  },
  {
    "name": "app-shell",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/app-shell.js",
    "description": "AppShell — the outer page skeleton: sidebar + header + main + footer, any combination. A single CSS Grid with named areas handles every layout (\"sidebar+top+footer\", \"top+footer\", \"sidebar only\", …) — an area simply collapses to zero size when its slot isn't rendered, so there's no variant prop to pick; just render the slots you need. Each slot is a thin `grid-area` wrapper; the real chrome inside it is BYO (`Sidebar`, `Navbar`, `Footer`, or anything else). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "app-shell",
    "classes": [
      "app-shell",
      "app-shell-footer",
      "app-shell-header",
      "app-shell-main",
      "app-shell-sidebar"
    ]
  },
  {
    "name": "avatar",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/avatar.js",
    "description": "The Avatar component — a user/entity thumbnail: a photo, or an initials / icon fallback on a colored chip. Single element by design. It does NOT clip with `overflow: hidden`; instead the inner `<img>` rounds itself via `border-radius: inherit` (border-radius clips a raster image to the rounded shape in every engine). That keeps the clip while letting the accent ring (`box-shadow`) and the presence dot (`::after`) render OUTSIDE the circle, where `overflow: hidden` would eat them. Orthogonal color model like the rest of the system, but scoped to the fallback chip: a color class sets `--avatar-bg`/`--avatar-fg` (the initials chip) and `--avatar-accent` (the ring). Circle by default; `-rounded` switches to a `--radius-box` square. `-ring` adds a gap ring, `-online` / `-offline` a presence dot, and `.avatar-group` overlaps a row of them. @param {string[]} colors - color names to generate `.avatar-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "avatar",
    "classes": [
      "avatar",
      "avatar-accent",
      "avatar-error",
      "avatar-group",
      "avatar-info",
      "avatar-lg",
      "avatar-md",
      "avatar-neutral",
      "avatar-offline",
      "avatar-online",
      "avatar-primary",
      "avatar-ring",
      "avatar-rounded",
      "avatar-secondary",
      "avatar-sm",
      "avatar-success",
      "avatar-warning",
      "avatar-xl",
      "avatar-xs"
    ],
    "colorVariants": [
      "avatar-primary",
      "avatar-secondary",
      "avatar-accent",
      "avatar-neutral",
      "avatar-info",
      "avatar-success",
      "avatar-warning",
      "avatar-error"
    ],
    "colorPattern": "avatar-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `avatar-<color>` accepts any color the app registers (see get_tokens → customColors). `avatar-brand` is as real as `avatar-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".avatar-online::after, .avatar-offline::after",
      ".avatar-online::after",
      ".avatar-offline::after",
      ".avatar-group > .avatar",
      ".avatar-group > .avatar:first-child"
    ]
  },
  {
    "name": "badge",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/badge.js",
    "description": "The Badge component — a small pill for labels, counts, and statuses. Same orthogonal design as Button: a color class (`.badge-primary`) only sets `--badge-*` variables; `.badge` and the style classes read them. Badge is a selector-tier element, so it rounds with `--radius-selector` and scales with the `--size-selector` density lever. @param {string[]} colors - color names to generate `.badge-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "badge",
    "classes": [
      "badge",
      "badge-accent",
      "badge-dash",
      "badge-error",
      "badge-ghost",
      "badge-info",
      "badge-lg",
      "badge-md",
      "badge-neutral",
      "badge-outline",
      "badge-primary",
      "badge-secondary",
      "badge-sm",
      "badge-soft",
      "badge-success",
      "badge-warning",
      "badge-xl",
      "badge-xs"
    ],
    "colorVariants": [
      "badge-primary",
      "badge-secondary",
      "badge-accent",
      "badge-neutral",
      "badge-info",
      "badge-success",
      "badge-warning",
      "badge-error"
    ],
    "colorPattern": "badge-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `badge-<color>` accepts any color the app registers (see get_tokens → customColors). `badge-brand` is as real as `badge-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".badge:has(svg)"
    ]
  },
  {
    "name": "breadcrumb",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/breadcrumb.js",
    "description": "The Breadcrumb component — a navigation trail. Colorless. Styles a `<nav class=\"breadcrumb\">` wrapping an ordered list: items lay out in a wrapping flex row and a CSS chevron is drawn via `li:not(:first-child)::before` (top+right borders rotated 45°, in `currentColor`, `em`-scaled) — no separator markup needed. Links read muted and brighten on hover; the current page (`[aria-current=\"page\"]`) sits at full strength. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "breadcrumb",
    "classes": [
      "breadcrumb"
    ]
  },
  {
    "name": "button",
    "package": "@wizeworks/silicaui",
    "category": "Actions",
    "sourceFile": "silicaui/src/components/button.js",
    "description": "The Button component. Design: color and style are orthogonal axes. - A color class (`.btn-primary`, `.btn-brand`, …) only sets CSS variables (`--btn-bg`, `--btn-fg`, `--btn-accent`, …). It renders nothing itself. - `.btn` and the style classes (`.btn-outline`, `.btn-soft`, …) read those variables to paint the button. Because color classes only set variables (never concrete properties), they never fight the style classes on specificity, and any new color composes with every style for free. @param {string[]} colors - color names to generate `.btn-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-` → `.sx-btn`). Only affects Silica class names, never the internal `--btn-*` variables or the shared `silica-spin` keyframes.",
    "root": "btn",
    "classes": [
      "btn",
      "btn-accent",
      "btn-active",
      "btn-block",
      "btn-circle",
      "btn-dash",
      "btn-error",
      "btn-ghost",
      "btn-info",
      "btn-lg",
      "btn-link",
      "btn-md",
      "btn-neutral",
      "btn-outline",
      "btn-primary",
      "btn-secondary",
      "btn-sm",
      "btn-soft",
      "btn-square",
      "btn-success",
      "btn-warning",
      "btn-wide",
      "btn-xl",
      "btn-xs"
    ],
    "colorVariants": [
      "btn-primary",
      "btn-secondary",
      "btn-accent",
      "btn-neutral",
      "btn-info",
      "btn-success",
      "btn-warning",
      "btn-error"
    ],
    "colorPattern": "btn-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `btn-<color>` accepts any color the app registers (see get_tokens → customColors). `btn-brand` is as real as `btn-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".btn:has(svg)"
    ]
  },
  {
    "name": "calendar",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/calendar.js",
    "description": "The Calendar / DatePicker component — a from-scratch month-grid date picker (Base UI ships no calendar in rc.0, so the React layer owns all the behavior; this owns the surface). A colorless grid with an orthogonal accent for the selection: a color class (`.calendar-primary`) sets `--calendar-accent`. Day states are driven by data attributes the React layer stamps: `[data-outside]` (adjacent month), `[data-today]`, `[data-selected]` (single), `[data-range-start]` / `[data-range-end]` / `[data-in-range]` (range), and `[data-disabled]`. In-range cells fill edge-to-edge (no gap) so the run reads as one continuous bar with accent endpoints. The `.calendar-popup` surface + `.date-field` control let the DatePicker sit under an `.input`-styled trigger. @param {string[]} colors - color names to generate `.calendar-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "calendar",
    "classes": [
      "calendar",
      "calendar-accent",
      "calendar-day",
      "calendar-error",
      "calendar-grid",
      "calendar-header",
      "calendar-info",
      "calendar-month",
      "calendar-months",
      "calendar-nav",
      "calendar-neutral",
      "calendar-popup",
      "calendar-primary",
      "calendar-secondary",
      "calendar-success",
      "calendar-title",
      "calendar-warning",
      "calendar-weekday",
      "calendar-weekdays",
      "date-field",
      "date-field-icon",
      "date-field-value"
    ],
    "colorVariants": [
      "calendar-primary",
      "calendar-secondary",
      "calendar-accent",
      "calendar-neutral",
      "calendar-info",
      "calendar-success",
      "calendar-warning",
      "calendar-error"
    ],
    "colorPattern": "calendar-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `calendar-<color>` accepts any color the app registers (see get_tokens → customColors). `calendar-brand` is as real as `calendar-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".date-field[data-placeholder] .date-field-value"
    ]
  },
  {
    "name": "card",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/card.js",
    "description": "The Card component — a surface container. Box-tier element: rounds with `--radius-box`. Sits on the `base-100` surface with a `base-300` hairline and a `--depth`-scaled shadow (flat when `--depth: 0`). Composes from parts: `.card` (frame) → `.card-body` (padded stack) with `.card-title` and `.card-actions` inside. A full-bleed `<figure>` (e.g. a cover image) is handled by the nested rules below. Card has no color variants — it's a neutral surface — so unlike the other components it takes only the prefix. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "card",
    "classes": [
      "card",
      "card-actions",
      "card-body",
      "card-clickable",
      "card-selectable",
      "card-selectable-indicator",
      "card-title",
      "checkbox",
      "radio"
    ],
    "compoundSelectors": [
      ".checkbox.card-selectable-indicator, .radio.card-selectable-indicator"
    ]
  },
  {
    "name": "carousel",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/carousel.js",
    "description": "The Carousel component — a scroll-snapping strip WITH navigation. Colorless. The scroll surface (`.carousel`) uses CSS scroll-snap; the React wrapper adds prev/next controls (`.carousel-control`) and clickable dot indicators (`.carousel-dot`) that drive it, so it behaves like a real carousel rather than a bare scrollable list. The scrollbar is hidden because the controls provide navigation; touch/trackpad swipe still works. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "carousel",
    "classes": [
      "carousel",
      "carousel-center",
      "carousel-control",
      "carousel-dot",
      "carousel-dot-active",
      "carousel-end",
      "carousel-indicators",
      "carousel-item",
      "carousel-next",
      "carousel-number",
      "carousel-number-active",
      "carousel-prev",
      "carousel-root",
      "carousel-vertical"
    ],
    "compoundSelectors": [
      ".carousel-center .carousel-item",
      ".carousel-end .carousel-item"
    ]
  },
  {
    "name": "chart",
    "package": "@wizeworks/silicaui",
    "category": "wrapper",
    "sourceFile": "silicaui/src/components/chart.js",
    "description": "Chart container — the box an ECharts canvas/SVG renders into. The actual chart theming is done in JS (the `@wizeworks/silicaui-charts` package reads the live color tokens and hands ECharts a matching theme); this class only owns the container so ECharts has a sized, block-level box to measure. Colorless. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "chart",
    "classes": [
      "chart"
    ]
  },
  {
    "name": "chat-suite",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/chat-suite.js",
    "description": "The Chat suite — a higher-level layer over the `chat`/`chat-bubble` primitives (chat.js): a scrollable message layout, a composer, and the small extras a real conversation needs (system dividers, grouped metadata, a collapsible tool-call detail). `ChatMessage` itself composes the existing `.chat`/`.chat-image`/`.chat-header`/`.chat-bubble` classes rather than repainting them — this module only adds what those don't already cover. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "classes": [
      "chat-composer",
      "chat-composer-actions",
      "chat-composer-field",
      "chat-layout",
      "chat-layout-messages",
      "chat-message-metadata",
      "chat-system-message",
      "chat-tool-calls",
      "chat-typing",
      "chat-typing-dot",
      "collapsible-content",
      "collapsible-trigger"
    ],
    "compoundSelectors": [
      ".chat-tool-calls .collapsible-trigger",
      ".chat-tool-calls .collapsible-content",
      ".chat-typing-dot:nth-child(2)",
      ".chat-typing-dot:nth-child(3)"
    ]
  },
  {
    "name": "chat",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/chat.js",
    "description": "The Chat component — a message row with an avatar, header/footer, and bubble. A grid: the avatar (`.chat-image`) spans all rows in one column; the header, bubble, and footer stack in the other. `.chat-start` puts the avatar on the left (incoming), `.chat-end` flips it to the right (outgoing). The bubble takes an orthogonal color (`.chat-bubble-primary`), defaulting to a neutral base-200 surface. @param {string[]} colors - color names to generate `.chat-bubble-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "chat",
    "classes": [
      "chat",
      "chat-bubble",
      "chat-bubble-accent",
      "chat-bubble-error",
      "chat-bubble-info",
      "chat-bubble-neutral",
      "chat-bubble-primary",
      "chat-bubble-secondary",
      "chat-bubble-success",
      "chat-bubble-warning",
      "chat-end",
      "chat-footer",
      "chat-header",
      "chat-image"
    ],
    "colorVariants": [
      "chat-bubble-primary",
      "chat-bubble-secondary",
      "chat-bubble-accent",
      "chat-bubble-neutral",
      "chat-bubble-info",
      "chat-bubble-success",
      "chat-bubble-warning",
      "chat-bubble-error"
    ],
    "colorPattern": "chat-bubble-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `chat-bubble-<color>` accepts any color the app registers (see get_tokens → customColors). `chat-bubble-brand` is as real as `chat-bubble-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".chat > *:not(.chat-image)",
      ".chat-end > *:not(.chat-image)",
      ".chat-end .chat-bubble"
    ]
  },
  {
    "name": "checkbox-group",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/checkbox-group.js",
    "description": "The CheckboxGroup layout — a stack of checkbox options managed as one array value (with optional parent \"select all\" that goes indeterminate). Colorless. Layout + option row only; the checkboxes are Silica `.checkbox` inputs. `.checkbox-option` is the clickable `<label>` pairing a checkbox with its caption. `[data-orientation=\"horizontal\"]` lays them in a row. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "checkbox-",
    "rootNote": "No bare `.checkbox` class exists — this family is only its `checkbox-*` parts.",
    "classes": [
      "checkbox-group",
      "checkbox-option"
    ]
  },
  {
    "name": "checkbox",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/checkbox.js",
    "description": "The Checkbox component — a native `<input type=\"checkbox\">` restyled. Selector-tier control: scales with `--size-selector` and rounds with `--radius-selector` (capped so it stays a rounded square, never a full circle, even under a large selector radius). A color class (`.checkbox-primary`) sets `--checkbox-accent` (checked fill/border/focus) and `--checkbox-content` (the checkmark color); unchecked is a neutral hairline box. The checkmark is composed from layered `linear-gradient`s rather than an SVG, so its color can be a live CSS var — the accent's auto-derived `-content`, which stays legible on ANY accent (dark mark on a light color like `warning`, light mark on a dark one). SVG `background-image` can't read a CSS var, and `::before`/`::after` on form controls is inconsistent across browsers — this avoids both. @param {string[]} colors - color names to generate `.checkbox-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "checkbox",
    "classes": [
      "checkbox",
      "checkbox-accent",
      "checkbox-error",
      "checkbox-info",
      "checkbox-lg",
      "checkbox-md",
      "checkbox-neutral",
      "checkbox-primary",
      "checkbox-secondary",
      "checkbox-sm",
      "checkbox-success",
      "checkbox-warning",
      "checkbox-xl",
      "checkbox-xs"
    ],
    "colorVariants": [
      "checkbox-primary",
      "checkbox-secondary",
      "checkbox-accent",
      "checkbox-neutral",
      "checkbox-info",
      "checkbox-success",
      "checkbox-warning",
      "checkbox-error"
    ],
    "colorPattern": "checkbox-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `checkbox-<color>` accepts any color the app registers (see get_tokens → customColors). `checkbox-brand` is as real as `checkbox-primary` once `brand` is declared."
  },
  {
    "name": "collapse",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/collapse.js",
    "description": "The Collapse component — a disclosure panel built on native `<details>`/`<summary>`, so open/close, keyboard, and screen-reader support come for free (no JS). Several with a shared `name` form an exclusive accordion (native HTML behavior). The CSS class is `.details`, NOT `.collapse` — Tailwind v4 ships a built-in `.collapse { visibility: collapse }` utility (for table row/column collapsing), and utility-layer rules always beat component base-layer rules regardless of source order or specificity. A `.collapse` class here would still get this component's box styling (border/bg/radius all still apply, since Tailwind's utility only sets `visibility`), but Tailwind's `visibility: collapse` would ALSO apply and silently make the whole thing invisible while it still occupies layout space — exactly the \"empty box\" bug this dodges. `Collapse`/`CollapseTitle`/`CollapseContent` (the public React names) are unaffected; only the underlying class token changed. Colorless. The `.details-title` (the `<summary>`) hides the default marker and draws its own chevron via `::after`, which rotates when the parent is `[open]`. `.details-content` holds the body. `-ghost` drops the surface for a flush, borderless accordion. Toggle is instant by design — animating `<details>` height needs bleeding-edge CSS (`interpolate-size`/`::details-content`) that isn't universally shipped; only the chevron animates, which is safe everywhere. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "details",
    "classes": [
      "details",
      "details-content",
      "details-ghost",
      "details-title"
    ],
    "compoundSelectors": [
      ".details[open] > .details-title::after"
    ]
  },
  {
    "name": "collapsible",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/collapsible.js",
    "description": "The Collapsible component — a single show/hide disclosure (Base UI behavior). The low-level primitive behind `Accordion` (which groups several): one trigger reveals one animated panel. Colorless and chrome-light so it drops into any layout. Base UI exposes the natural panel height as `--collapsible-panel-height`, which we animate; the panel starts/ends at height 0 (`[data-starting-style]`/`[data-ending-style]`). The trigger's chevron rotates while the panel is open (`[data-panel-open]`). Padding lives on an inner `.collapsible-content` so the height animation stays smooth. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "collapsible",
    "classes": [
      "collapsible",
      "collapsible-content",
      "collapsible-panel",
      "collapsible-trigger",
      "collapsible-trigger-icon"
    ]
  },
  {
    "name": "color-picker",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/color-picker.js",
    "description": "ColorPicker — an OKLCH-native color editor. SilicaUI's tokens are all OKLCH, so the picker edits L / C / H directly with three sliders instead of translating through HSV. Each slider's track is painted with a live `linear-gradient(... in oklch, …)` (set inline from the React component), so what you drag across is the real color ramp. A big swatch previews the result and a hex field reads/writes the same color. Colorless: the surface uses base tokens; the focus ring is `--color-primary`. The thumb/track gradients are all data-driven (inline styles), so there's no per-color variant to generate here. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "color-picker",
    "classes": [
      "color-picker",
      "color-picker-hex",
      "color-picker-hex-input",
      "color-picker-hex-label",
      "color-picker-popover",
      "color-picker-preview",
      "color-picker-slider",
      "color-picker-slider-label",
      "color-picker-slider-value",
      "color-picker-sliders",
      "color-picker-swatch",
      "color-picker-swatch-trigger",
      "color-picker-swatch-trigger-chip",
      "color-picker-swatch-trigger-label",
      "color-picker-thumb",
      "color-picker-track",
      "color-picker-value-hex",
      "color-picker-value-oklch",
      "color-picker-values"
    ],
    "compoundSelectors": [
      ".color-picker[data-disabled]"
    ]
  },
  {
    "name": "combobox",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/combobox.js",
    "description": "The Combobox / Autocomplete control chrome — the input-field half of the Base-UI-backed `Combobox` and `Autocomplete` (a searchable, filtered listbox). The popup, list, items, group labels and separators REUSE the Select surface (`.select-popup`, `.select-item`, `.select-item-indicator`, …) so the two read identically; this module only adds the text-input control: a field wrapper (`.combobox-control`) around an `.input`-styled `.combobox-input`, plus the trailing clear (×) and open (chevron) buttons and the empty-state row. The chevron flips while the popup is open (`[data-popup-open]`), and the clear button hides itself when there's nothing to clear (`:disabled`). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "combobox-",
    "rootNote": "No bare `.combobox` class exists — this family is only its `combobox-*` parts.",
    "classes": [
      "combobox-clear",
      "combobox-control",
      "combobox-empty",
      "combobox-input",
      "combobox-item",
      "combobox-trigger"
    ]
  },
  {
    "name": "command-palette",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/command-palette.js",
    "description": "CommandPalette — the ⌘K launcher surface. Built on the same Base UI Dialog machinery as `.dialog` (portal, focus trap, scroll lock, Escape-to-dismiss), but positioned near the top of the viewport and shaped as a search box over a scrolling result list. The React `<CommandPalette>` owns the filtering + arrow-key navigation; this styles the backdrop, the panel, the search row, groups, items, and the active/empty states. Colorless: the active item reads `--color-primary` for its tint/marker, same orthogonal-accent approach as the rest of Silica. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "command-palette-",
    "rootNote": "No bare `.command-palette` class exists — this family is only its `command-palette-*` parts.",
    "classes": [
      "command-palette-backdrop",
      "command-palette-empty",
      "command-palette-group",
      "command-palette-group-label",
      "command-palette-input",
      "command-palette-item",
      "command-palette-item-body",
      "command-palette-item-desc",
      "command-palette-item-icon",
      "command-palette-item-label",
      "command-palette-item-shortcut",
      "command-palette-list",
      "command-palette-popup",
      "command-palette-search",
      "command-palette-search-icon"
    ],
    "compoundSelectors": [
      ".command-palette-item[data-active] .command-palette-item-desc"
    ]
  },
  {
    "name": "countdown",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/countdown.js",
    "description": "The Countdown component — a segmented days/hours/minutes/seconds display. Colorless. A row of boxed units, each a big tabular number over a small label. The React wrapper ticks the values; this just paints the boxes. `-plain` drops the boxes for an inline number run. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "countdown",
    "classes": [
      "countdown",
      "countdown-label",
      "countdown-plain",
      "countdown-unit",
      "countdown-value"
    ]
  },
  {
    "name": "data-table",
    "package": "@wizeworks/silicaui",
    "category": "wrapper",
    "sourceFile": "silicaui/src/components/data-table.js",
    "description": "DataTable chrome — the interactive shell around a `.table`. The base `.table` still styles the cells (this module deliberately does NOT restyle `th`/`td`); `.data-table` only adds what a data grid needs on top: a bordered scroll container, sortable-header buttons with a caret that lights up per sort direction, a selected-row tint, a sticky header, skeleton/empty bodies, and a pagination toolbar. The React `<DataTable>` (in the optional `@wizeworks/silicaui-table` package) drives TanStack Table and hangs these classes on the markup. Colored: a `.data-table-<name>` class only sets `--dt-accent`, which the sort hover + selected-row tint read — so the accent is orthogonal to everything else, same as the rest of Silica. @param {string[]} colors - color names to generate `.data-table-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "data-table",
    "classes": [
      "data-table",
      "data-table-accent",
      "data-table-empty",
      "data-table-error",
      "data-table-info",
      "data-table-neutral",
      "data-table-pager",
      "data-table-pagination",
      "data-table-primary",
      "data-table-row-clickable",
      "data-table-scroll",
      "data-table-secondary",
      "data-table-skeleton",
      "data-table-sort",
      "data-table-sort-icon",
      "data-table-sticky",
      "data-table-success",
      "data-table-warning"
    ],
    "colorVariants": [
      "data-table-primary",
      "data-table-secondary",
      "data-table-accent",
      "data-table-neutral",
      "data-table-info",
      "data-table-success",
      "data-table-warning",
      "data-table-error"
    ],
    "colorPattern": "data-table-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `data-table-<color>` accepts any color the app registers (see get_tokens → customColors). `data-table-brand` is as real as `data-table-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".data-table-sticky .data-table-scroll",
      ".data-table-sticky thead th",
      ".data-table-sort-icon [data-part]",
      ".data-table-sort[data-sort=\"asc\"] .data-table-sort-icon [data-part=\"up\"]",
      ".data-table-sort[data-sort=\"desc\"] .data-table-sort-icon [data-part=\"down\"]",
      ".data-table tbody tr[data-selected]"
    ]
  },
  {
    "name": "dialog",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/dialog.js",
    "description": "The Dialog surface — the visual half of the Base-UI-backed Dialog (and AlertDialog). Base UI owns the modal machinery (portal, focus trap, scroll lock, dismissal); this styles the backdrop + centered popup + title/description. The popup is fixed-centered in CSS (Dialog has no positioner). Enter/exit rides Base UI's `[data-starting-style]`/`[data-ending-style]` — note the transform keeps the `translate(-50%, -50%)` centering AND adds the scale, so both must be restated in the animated state. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "dialog-",
    "rootNote": "No bare `.dialog` class exists — this family is only its `dialog-*` parts.",
    "classes": [
      "dialog-backdrop",
      "dialog-description",
      "dialog-footer",
      "dialog-footer-sticky",
      "dialog-header",
      "dialog-header-sticky",
      "dialog-popup",
      "dialog-title"
    ]
  },
  {
    "name": "diff",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/diff.js",
    "description": "The Diff component — a before/after comparison with a draggable split. Colorless. Two layers occupy the same grid cell: `.diff-item-2` is the full \"after\" underneath, `.diff-item-1` is the \"before\" on top, clipped to the split position with `clip-path: inset(...)`. The split is a single CSS variable, `--diff-pos` (a 0–100% length), so the React wrapper can drive it from pointer drag or the keyboard while the CSS stays declarative. `clip-path: inset()` and CSS custom properties are universally supported, so this renders identically everywhere (no container-query-unit dependence). `.diff-resizer` is the vertical handle drawn at `--diff-pos`; its `.diff-grip` knob holds the drag affordance. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "diff",
    "classes": [
      "diff",
      "diff-grip",
      "diff-item-1",
      "diff-item-2",
      "diff-resizer"
    ],
    "compoundSelectors": [
      ".diff-item-1, .diff-item-2",
      ".diff-item-1 > *, .diff-item-2 > *"
    ]
  },
  {
    "name": "divider",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/divider.js",
    "description": "The Divider component — a labeled or plain separator. Colorless. A flex line whose `::before`/`::after` draw the rules on either side of an optional centered label; with no label (`:empty`) the gap collapses so the two segments meet as one continuous line. `-vertical` rotates it for row layouts (needs a height from its parent). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "divider",
    "classes": [
      "divider",
      "divider-vertical"
    ]
  },
  {
    "name": "dock",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/dock.js",
    "description": "The Dock component — a bottom navigation bar of icon+label items. Colorless base with an orthogonal accent for the active item. A flex row of equal-width `.dock-item` buttons, each an icon over a small label. Position it yourself (`fixed bottom-0` for a real app dock). The active item lifts to full opacity and the accent color. @param {string[]} colors - color names to generate `.dock-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "dock",
    "classes": [
      "dock",
      "dock-accent",
      "dock-error",
      "dock-info",
      "dock-item",
      "dock-item-active",
      "dock-label",
      "dock-neutral",
      "dock-primary",
      "dock-secondary",
      "dock-success",
      "dock-warning"
    ],
    "colorVariants": [
      "dock-primary",
      "dock-secondary",
      "dock-accent",
      "dock-neutral",
      "dock-info",
      "dock-success",
      "dock-warning",
      "dock-error"
    ],
    "colorPattern": "dock-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `dock-<color>` accepts any color the app registers (see get_tokens → customColors). `dock-brand` is as real as `dock-primary` once `brand` is declared."
  },
  {
    "name": "drawer",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/drawer.js",
    "description": "The Drawer component — a panel that slides in from an edge (Base UI Dialog). Colorless. Reuses Base UI's Dialog behavior (focus trap, scroll lock, escape) but pins the popup to an edge and slides it in with a transform. `data-side` chooses the edge; the enter/exit transforms are driven by `[data-starting-style]` / `[data-ending-style]`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "drawer-",
    "rootNote": "No bare `.drawer` class exists — this family is only its `drawer-*` parts.",
    "classes": [
      "drawer-backdrop",
      "drawer-description",
      "drawer-footer",
      "drawer-footer-sticky",
      "drawer-header",
      "drawer-header-sticky",
      "drawer-popup",
      "drawer-title"
    ]
  },
  {
    "name": "dropdown",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/dropdown.js",
    "description": "The Dropdown Menu surface — the visual half of the Base-UI-backed Menu (click-triggered command menu). Named `.dropdown*` to avoid colliding with the static `.menu` nav-list component. Base UI owns positioning + roving focus + dismissal; this styles the popup, items, separators, and labels. Items highlight via Base UI's `[data-highlighted]` (keyboard OR pointer, so it unifies focus + hover) and dim via `[data-disabled]`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "dropdown",
    "classes": [
      "dropdown",
      "dropdown-item",
      "dropdown-item-arrow",
      "dropdown-label",
      "dropdown-separator"
    ]
  },
  {
    "name": "dropzone",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/dropzone.js",
    "description": "Dropzone — a file drag-and-drop / click-to-browse target. A dashed, focusable area that lights up while a drag hovers it and opens the native file picker on click/Enter. The React `<Dropzone>` owns the drag counter, the hidden `<input type=file>`, and accept/size filtering; this styles the idle / hover / dragging / disabled surface and the icon + text stack. Colorless: the active (dragging) state reads `--color-primary` for its border and tint. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "dropzone",
    "classes": [
      "dropzone",
      "dropzone-hint",
      "dropzone-icon",
      "dropzone-input",
      "dropzone-title"
    ],
    "compoundSelectors": [
      ".dropzone[data-dragging]",
      ".dropzone[data-disabled]",
      ".dropzone[data-dragging] .dropzone-icon"
    ]
  },
  {
    "name": "empty-state",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/empty-state.js",
    "description": "EmptyState — the centered \"nothing here yet\" placeholder. A vertical stack: an optional icon chip, a title, a description, and an action row. Colorless (neutral by design); it just reads the base tokens so it sits quietly inside any surface (card, table body, panel). The React `<EmptyState>` fills the slots. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "empty-state",
    "classes": [
      "empty-state",
      "empty-state-actions",
      "empty-state-description",
      "empty-state-icon",
      "empty-state-lg",
      "empty-state-md",
      "empty-state-sm",
      "empty-state-title",
      "empty-state-xl",
      "empty-state-xs"
    ]
  },
  {
    "name": "field",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/field.js",
    "description": "The Field component — an accessible form field that wires a label, control, description, and error together (ids + aria + validity). Behavior is Base UI's Field (it tracks dirty/touched/valid/invalid and associates the parts); Silica styles them. Use it around any Silica control. Colorless (semantic error). `.field-error` only renders when the field is invalid (Base UI controls that). When the control is marked `[data-invalid]` its accent flips to error, so the border + focus ring turn red to match. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "field",
    "classes": [
      "field",
      "field-description",
      "field-error",
      "field-label",
      "field-status",
      "field-status-attached",
      "field-status-detached",
      "field-status-error",
      "field-status-floating",
      "field-status-success",
      "field-status-warning",
      "input",
      "select",
      "textarea"
    ],
    "compoundSelectors": [
      ".input[data-invalid], .select[data-invalid], .textarea[data-invalid]",
      ".input[data-status=\"error\"], .select[data-status=\"error\"], .textarea[data-status=\"error\"]",
      ".input[data-status=\"warning\"], .select[data-status=\"warning\"], .textarea[data-status=\"warning\"]",
      ".input[data-status=\"success\"], .select[data-status=\"success\"], .textarea[data-status=\"success\"]",
      ".field:has(.field-status-attached) .input, .field:has(.field-status-attached) .select, .field:has(.field-status-attached) .textarea",
      ".field-status-floating.field-status-detached",
      ".field-status-floating.field-status-attached",
      ".field:has(.field-status-attached) .input:focus",
      ".field:has(.field-status-attached) .select:focus",
      ".field:has(.field-status-attached) .textarea:focus",
      ".field:has(.input:focus, .select:focus, .textarea:focus) .field-status-attached"
    ]
  },
  {
    "name": "fieldset",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/fieldset.js",
    "description": "The Fieldset component — a labeled group of form controls. Colorless. A vertical stack that resets the browser's native `<fieldset>` chrome (border/margin/padding/min-inline-size) so it lays out predictably, then adds a `.fieldset-legend` heading and `.fieldset-label` helper text that pair with Silica inputs. Drop it inside a `.card` or on its own; the gap keeps legend, controls, and helper text evenly spaced. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "fieldset",
    "classes": [
      "fieldset",
      "fieldset-label",
      "fieldset-legend"
    ]
  },
  {
    "name": "file-input",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/file-input.js",
    "description": "The FileInput component — a styled `<input type=\"file\">`. Colorless. Styles the native control and its `::file-selector-button` so the \"Choose file\" button reads as a Silica button while the filename sits beside it. Fully native — no JS needed. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "file-input",
    "classes": [
      "file-input",
      "file-input-lg",
      "file-input-md",
      "file-input-sm",
      "file-input-xl",
      "file-input-xs"
    ]
  },
  {
    "name": "file-upload",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/file-upload.js",
    "description": "FileUpload — a Dropzone plus a managed preview list. The dropzone itself is unstyled here (reuses `.dropzone`); this only styles the list of accepted-file rows rendered below it: a thumbnail/icon, name + size, and a remove button. Colorless. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "file-upload",
    "classes": [
      "file-upload",
      "file-upload-item",
      "file-upload-item-icon",
      "file-upload-item-meta",
      "file-upload-item-name",
      "file-upload-item-remove",
      "file-upload-item-size",
      "file-upload-item-thumb",
      "file-upload-list",
      "file-upload-rejections"
    ]
  },
  {
    "name": "filter",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/filter.js",
    "description": "The Filter component — a single-select row of pill \"chips\" with a reset, the pattern behind faceted product/category filtering. Radio semantics (choose one); picking a chip fills it with the accent, and a circular reset (`.filter-reset`) clears the choice. Colorless chips (base-100 + border) read an orthogonal accent for the selected state via `--filter-accent`; a color class (`.filter-primary`) on the row sets it. The selected chip is marked `[data-selected]` by the React layer. @param {string[]} colors - color names to generate `.filter-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "filter",
    "classes": [
      "filter",
      "filter-accent",
      "filter-error",
      "filter-info",
      "filter-item",
      "filter-neutral",
      "filter-primary",
      "filter-reset",
      "filter-secondary",
      "filter-success",
      "filter-warning"
    ],
    "colorVariants": [
      "filter-primary",
      "filter-secondary",
      "filter-accent",
      "filter-neutral",
      "filter-info",
      "filter-success",
      "filter-warning",
      "filter-error"
    ],
    "colorPattern": "filter-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `filter-<color>` accepts any color the app registers (see get_tokens → customColors). `filter-brand` is as real as `filter-primary` once `brand` is declared."
  },
  {
    "name": "footer",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/footer.js",
    "description": "The Footer component — a responsive multi-column site footer. Colorless. A grid that stacks its columns vertically on small screens and flows them into a row of `max-content` columns from `md` up. Each direct child is itself a grid, so a `<nav>` of links becomes a tidy vertical stack under its `.footer-title`. `-center` centers every column and its contents (for a single-row, centered footer). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "footer",
    "classes": [
      "footer",
      "footer-center",
      "footer-title"
    ],
    "compoundSelectors": [
      "@media (min-width: 48rem)"
    ]
  },
  {
    "name": "hero",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/hero.js",
    "description": "The Hero component — a full-width banner that centers its content. Colorless. A single-cell grid: `.hero-content` and an optional `.hero-overlay` are stacked in the same cell (both pinned to row/column 1), so an overlay can tint a background image set on `.hero` itself while the content sits legibly on top. Uses `background-size: cover` so an inline `background-image` fills the banner. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "hero",
    "classes": [
      "hero",
      "hero-content",
      "hero-overlay"
    ]
  },
  {
    "name": "indicator",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/indicator.js",
    "description": "The Indicator component — pins a small overlay (a Badge, a status dot) to a corner of another element: a notification count on a button, an unread dot on an avatar. Colorless / structural. `.indicator` is the positioning context; the `.indicator-item` sits at the top-end corner by default, nudged half over the edge. `-start` / `-bottom` move it to the other corners (combine them). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "indicator",
    "classes": [
      "indicator",
      "indicator-bottom",
      "indicator-item",
      "indicator-start"
    ],
    "compoundSelectors": [
      ".indicator-item.indicator-start",
      ".indicator-item.indicator-bottom",
      ".indicator-item.indicator-bottom.indicator-start"
    ]
  },
  {
    "name": "input-group",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/input-group.js",
    "description": "The InputGroup component — a positioning shell that lets a leading/trailing icon or button sit inside an `.input` (search icon, password show/hide, clear button, a country-code prefix, …). `.input-group` is the relative-positioned shell; `.input-group-start` / `.input-group-end` are absolutely-placed slots for the decoration itself; `.input-group-btn` is an interactive icon button that can live inside a slot. The `.input` living inside the shell reserves room for its decorations via `.input-affix-start` / `.input-affix-end` (defined in `input.js`, applied alongside the base `.input` class). Slot sizing is intentionally fixed (not per Input `size`), matching the existing Combobox/Autocomplete trailing-button precedent. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "input-group",
    "classes": [
      "input-group",
      "input-group-btn",
      "input-group-end",
      "input-group-start"
    ]
  },
  {
    "name": "input",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/input.js",
    "description": "The Input component — a single-line text field. Field-tier element: rounds with `--radius-field` and scales with the `--size-field` density lever, so it lines up pixel-for-pixel with same-size Buttons. A color class (`.input-primary`, `.input-error`, …) sets `--input-accent` (focus ring + focused border) and `--input-border` (a softened tint of the same color for the resting border); the default (no color) shows a neutral border and a primary focus ring. @param {string[]} colors - color names to generate `.input-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "input",
    "classes": [
      "input",
      "input-accent",
      "input-affix-end",
      "input-affix-start",
      "input-error",
      "input-info",
      "input-lg",
      "input-md",
      "input-neutral",
      "input-primary",
      "input-secondary",
      "input-sm",
      "input-success",
      "input-warning",
      "input-xl",
      "input-xs"
    ],
    "colorVariants": [
      "input-primary",
      "input-secondary",
      "input-accent",
      "input-neutral",
      "input-info",
      "input-success",
      "input-warning",
      "input-error"
    ],
    "colorPattern": "input-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `input-<color>` accepts any color the app registers (see get_tokens → customColors). `input-brand` is as real as `input-primary` once `brand` is declared."
  },
  {
    "name": "join",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/join.js",
    "description": "The Join component — groups adjacent items (buttons, inputs) into one seamless segmented control. Colorless / structural. It resets every child's corners to square, rounds only the outer ends of the group (`--radius-field`), and pulls each item back by one border-width so shared edges don't double up. The hovered/focused child lifts via `z-index` so its border/ring sits above its neighbours. Horizontal by default; `-vertical` stacks them. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "join",
    "classes": [
      "join",
      "join-vertical"
    ],
    "compoundSelectors": [
      ".join:not(.join-vertical) > :first-child",
      ".join:not(.join-vertical) > :last-child",
      ".join:not(.join-vertical) > :not(:first-child)",
      ".join-vertical > :first-child",
      ".join-vertical > :last-child",
      ".join-vertical > :not(:first-child)"
    ]
  },
  {
    "name": "kbd",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/kbd.js",
    "description": "The Kbd component — an inline keyboard-key cap (`<kbd>`). Colorless. Sits on the base-100 surface with a thicker bottom border for a subtle \"keycap\" depth. Everything is sized in `em` so it tracks the surrounding text; the size modifiers just re-scale that `em` base. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "kbd",
    "classes": [
      "kbd",
      "kbd-lg",
      "kbd-md",
      "kbd-sm",
      "kbd-xl",
      "kbd-xs"
    ]
  },
  {
    "name": "label",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/label.js",
    "description": "The Label components — a static `.label` and an animated `.floating-label`. Colorless. `.label` is a plain inline caption for a control (muted, icon-friendly). Use it above an input or inside a `.join` as an addon. `.floating-label` wraps a control + a `<span>` caption that sits inside the field at rest and floats up onto the top border once the field is focused or filled. It keys off `:placeholder-shown`, so the control MUST carry a placeholder (even a single space) for the \"filled\" state to resolve. Works whether the `<span>` comes before or after the control (`:has()` handles the ordering), and `select`/textarea are treated as always-floated when they hold a value. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "label",
    "classes": [
      "floating-label",
      "label",
      "label-control",
      "label-required"
    ],
    "compoundSelectors": [
      ".floating-label:has(> input:not(:placeholder-shown)) > span",
      ".floating-label:has(> textarea:not(:placeholder-shown)) > span",
      ".floating-label:has(> select) > span",
      ".floating-label:focus-within > span"
    ]
  },
  {
    "name": "lightbox",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/lightbox.js",
    "description": "Lightbox — a full-viewport image viewer (Base UI Dialog: focus trap, scroll lock, Escape-to-close). Chrome is deliberately theme-invariant (always a near-black scrim + white controls, like a photo viewer or video player) so it reads consistently regardless of the page's light/dark theme; only the focus ring uses `--color-primary`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "lightbox-",
    "rootNote": "No bare `.lightbox` class exists — this family is only its `lightbox-*` parts.",
    "classes": [
      "lightbox-backdrop",
      "lightbox-caption",
      "lightbox-close",
      "lightbox-counter",
      "lightbox-image",
      "lightbox-nav",
      "lightbox-nav-next",
      "lightbox-nav-prev",
      "lightbox-popup"
    ]
  },
  {
    "name": "link",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/link.js",
    "description": "The Link component — a styled inline anchor. Orthogonal color model, like Badge: a color class (`.link-primary`) only sets `--link-accent`; the base `.link` reads it for its color. By default a link is underlined and inherits the surrounding text color; `-hover` defers the underline until hover. A visible focus ring is always drawn for keyboard use. @param {string[]} colors - color names to generate `.link-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "link",
    "classes": [
      "link",
      "link-accent",
      "link-error",
      "link-hover",
      "link-info",
      "link-neutral",
      "link-primary",
      "link-secondary",
      "link-success",
      "link-warning"
    ],
    "colorVariants": [
      "link-primary",
      "link-secondary",
      "link-accent",
      "link-neutral",
      "link-info",
      "link-success",
      "link-warning",
      "link-error"
    ],
    "colorPattern": "link-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `link-<color>` accepts any color the app registers (see get_tokens → customColors). `link-brand` is as real as `link-primary` once `brand` is declared."
  },
  {
    "name": "list",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/list.js",
    "description": "The List component — a vertical list of rows. Colorless. A base-100 surface whose `.list-row`s are flex rows separated by hairline rules. Put `.list-col-grow` on the cell that should take the free space (title/body); leading/trailing cells (icon, avatar, actions) size to content. `.list-title` is a small muted section heading. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "list",
    "classes": [
      "list",
      "list-col-grow",
      "list-hover",
      "list-row",
      "list-title"
    ]
  },
  {
    "name": "loading",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/loading.js",
    "description": "The Loading component — a spinner for in-progress states. Colorless: a ring with one transparent edge spun by the shared `silica-spin` keyframes, drawn in `currentColor` so it takes on the surrounding text color (or a `text-*` utility). Sizes xs–xl. It stays spinning under `prefers-reduced-motion` on purpose — it's an essential activity signal, not decoration. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "loading",
    "classes": [
      "loading",
      "loading-lg",
      "loading-md",
      "loading-sm",
      "loading-xl",
      "loading-xs"
    ]
  },
  {
    "name": "marquee",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/marquee.js",
    "description": "The Marquee component — an infinitely-looping ticker strip. Colorless; it moves things, it doesn't paint them. The root (`.marquee`) is the clipping viewport, `.marquee-track` is the thing that actually travels, and `.marquee-group` is ONE copy of the content. A marquee renders its content TWICE (two identical groups) and the track slides by exactly one copy, so the moment the loop restarts the second copy is sitting where the first one began and the seam is invisible. The `-50%` you'll see in every marquee snippet on the web is subtly WRONG the instant there's a gap between items. With gap G and R copies, the track measures `R·group + (R−1)·G`, so `-100%/R` lands `G/R` short of a whole cycle and the strip visibly hitches once per loop. The exact cycle is `group + G` — i.e. `calc((-100% - G) / R)`, which is why the copy count rides along as `--marquee-copies` instead of the usual hard-coded `-50%`. That also means R is a knob: content too narrow to overflow the viewport just gets more copies, no JS measurement anywhere. Speed is a custom property (`--marquee-duration`) rather than a hard-coded animation shorthand, so `.marquee-slow`/`-fast` are pure var-setters and a caller can name any duration inline without fighting specificity — same model as `--sui-motion-duration` in animations.js. Motion is CSS-only. `@wizeworks/silicaui-behaviors`' `marquee` handler adds pause-on-hover and the reduced-motion/editor-preview freeze for non-React output; `.marquee-pause-on-hover` gives path-1 (plain HTML, no JS) the same hover pause without any runtime at all. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "marquee",
    "classes": [
      "marquee",
      "marquee-copies-2",
      "marquee-copies-3",
      "marquee-copies-4",
      "marquee-copies-5",
      "marquee-copies-6",
      "marquee-fade",
      "marquee-fast",
      "marquee-group",
      "marquee-normal",
      "marquee-pause-on-hover",
      "marquee-reverse",
      "marquee-slow",
      "marquee-track",
      "marquee-vertical"
    ],
    "compoundSelectors": [
      "@keyframes silica-marquee",
      "@keyframes silica-marquee-vertical",
      ".marquee-vertical .marquee-track",
      ".marquee-reverse .marquee-track",
      ".marquee-vertical.marquee-fade",
      ".marquee-pause-on-hover:hover .marquee-track",
      ".marquee-pause-on-hover:focus-within .marquee-track",
      ".marquee[data-sui-paused] .marquee-track",
      "@media (prefers-reduced-motion: reduce)"
    ]
  },
  {
    "name": "mask",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/mask.js",
    "description": "The Mask component — clips an element (or its content) to a shape. Colorless. Polygonal shapes use `clip-path: polygon()` with percentage points (so they scale with the element and never depend on an SVG being decoded); the circle uses `clip-path: circle()`. Only the two curved shapes that a polygon can't express — `squircle` and `heart` — fall back to a `mask-image` data-URI sized with `mask-size: contain`. All of these are broadly supported. Apply `.mask` + a shape class directly to an `<img>`, or to a sized container whose content should be clipped. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "mask",
    "classes": [
      "mask",
      "mask-circle",
      "mask-decagon",
      "mask-diamond",
      "mask-heart",
      "mask-hexagon",
      "mask-hexagon-2",
      "mask-parallelogram",
      "mask-pentagon",
      "mask-squircle",
      "mask-star",
      "mask-star-2",
      "mask-triangle",
      "mask-triangle-2",
      "mask-triangle-3",
      "mask-triangle-4"
    ]
  },
  {
    "name": "menu",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/menu.js",
    "description": "The Menu component — a styled vertical list of links/actions (sidebars, and later the contents of a dropdown/popover). Colorless surface. Items are the `<a>`/`<button>` inside each `<li>`: padded, field-rounded, hover-washed with base-200. The active item (`.menu-active` or `[aria-current=\"page\"]`) gets a soft primary tint. A `.menu-title` is a muted section label. Behavior (open/close of an enclosing popover) is NOT here — that arrives with the Base UI layer; this is the list. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "menu",
    "classes": [
      "menu",
      "menu-title"
    ]
  },
  {
    "name": "menubar",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/menubar.js",
    "description": "The Menubar component — a horizontal bar of menus (File / Edit / View …), like a desktop-app menu bar. Behavior is Base UI's Menubar + Menu (arrow between menus, hover to switch once one is open, roving focus); Silica styles the bar and its triggers. The menus themselves reuse the `.dropdown*` popup surface so every menu in the system looks identical. Colorless. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "menubar",
    "classes": [
      "menubar",
      "menubar-trigger"
    ]
  },
  {
    "name": "metadata-list",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/metadata-list.js",
    "description": "MetadataList — a key/value property list (a real `<dl>`; `MetadataItem` renders a `<dt>`+`<dd>` pair as direct grid children, so the whole list is one two-column CSS Grid — no wrapper divs needed per row). `data-layout=\"row\"` (default): label left, value right-aligned, one row each. `data-layout=\"stack\"`: label above value, single column — for narrow cards/sidebars. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "metadata-list",
    "classes": [
      "metadata-list",
      "metadata-list-label",
      "metadata-list-value"
    ],
    "compoundSelectors": [
      ".metadata-list dt:last-of-type",
      ".metadata-list dd:last-of-type",
      ".metadata-list[data-layout=\"stack\"]",
      ".metadata-list[data-layout=\"stack\"] .metadata-list-label",
      ".metadata-list[data-layout=\"stack\"] .metadata-list-value"
    ]
  },
  {
    "name": "meter",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/meter.js",
    "description": "The Meter component — a static measurement within a known range. Distinct from Progress: a meter shows a fixed reading (disk usage, score, capacity), not the advancement of a task. Same div-based track/indicator as Progress (Base UI's Meter sizes the indicator's width from the value; we just paint it), and the same orthogonal color model — a color class only sets `--meter-fill`, the neutral track stays put so the reading reads clearly. A `.meter-header` row pairs an optional `.meter-label` with a `.meter-value`. @param {string[]} colors - color names to generate `.meter-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "meter",
    "classes": [
      "meter",
      "meter-accent",
      "meter-error",
      "meter-header",
      "meter-indicator",
      "meter-info",
      "meter-label",
      "meter-lg",
      "meter-md",
      "meter-neutral",
      "meter-primary",
      "meter-secondary",
      "meter-sm",
      "meter-success",
      "meter-track",
      "meter-value",
      "meter-warning",
      "meter-xl",
      "meter-xs"
    ],
    "colorVariants": [
      "meter-primary",
      "meter-secondary",
      "meter-accent",
      "meter-neutral",
      "meter-info",
      "meter-success",
      "meter-warning",
      "meter-error"
    ],
    "colorPattern": "meter-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `meter-<color>` accepts any color the app registers (see get_tokens → customColors). `meter-brand` is as real as `meter-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".meter-xs .meter-track",
      ".meter-sm .meter-track",
      ".meter-md .meter-track",
      ".meter-lg .meter-track",
      ".meter-xl .meter-track"
    ]
  },
  {
    "name": "mockup",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/mockup.js",
    "description": "The Mockup components — frames for showcasing UI and code in docs and marketing pages. Colorless (the code frame paints itself with the neutral surface). Three independent frames: .mockup-window — an app window with three faux traffic-light dots .mockup-browser — a window plus a toolbar that holds a faux address bar .mockup-code — a dark terminal/code block; each `<pre data-prefix>` line renders its prefix (`$`, `>`, a line number…) The window titlebar and its dots are drawn with pseudo-elements so authors just wrap their content — no chrome markup required. The browser toolbar is real markup because it carries a URL. The dots are themed: close/minimize/zoom read `--color-error`, `--color-warning` and `--color-success`, so any theme that registers those roles gets correct traffic lights for free. `.mockup-plain` restores neutral, colorless dots. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "mockup-",
    "rootNote": "No bare `.mockup` class exists — this family is only its `mockup-*` parts.",
    "classes": [
      "mockup-browser",
      "mockup-browser-input",
      "mockup-browser-toolbar",
      "mockup-code",
      "mockup-phone",
      "mockup-phone-display",
      "mockup-plain",
      "mockup-window"
    ]
  },
  {
    "name": "multi-select",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/multi-select.js",
    "description": "MultiSelect — a searchable, multi-value listbox (Base UI Combobox in `multiple` mode, using its dedicated `Chip`/`Chips`/`ChipRemove` parts). The outer `.multi-select` is the bordered field (looks and focuses like `.tag-input`): a flex-wrapping box holding removable `.multi-select-chip`s and a borderless `.multi-select-input` that grows to fill the row, plus trailing clear (×) / open (chevron) buttons reusing the Combobox icon-button treatment. The dropdown list REUSES the Select surface (`.select-popup`, `.select-item`, `.select-item-indicator`, `.combobox-empty`) so every listbox in the system reads identically — this module only adds the chip field. Colored: `.multi-select-<name>` sets `--multi-select-accent` (focus ring, chip fill/text, focused border) and `--multi-select-border` (a softened tint of the same color for the resting border), matching the other field-tier controls. @param {string[]} colors - color names to generate `.multi-select-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "multi-select",
    "classes": [
      "multi-select",
      "multi-select-accent",
      "multi-select-chip",
      "multi-select-chip-remove",
      "multi-select-chips",
      "multi-select-clear",
      "multi-select-error",
      "multi-select-info",
      "multi-select-input",
      "multi-select-lg",
      "multi-select-md",
      "multi-select-neutral",
      "multi-select-primary",
      "multi-select-secondary",
      "multi-select-sm",
      "multi-select-success",
      "multi-select-trigger",
      "multi-select-warning",
      "multi-select-xl",
      "multi-select-xs"
    ],
    "colorVariants": [
      "multi-select-primary",
      "multi-select-secondary",
      "multi-select-accent",
      "multi-select-neutral",
      "multi-select-info",
      "multi-select-success",
      "multi-select-warning",
      "multi-select-error"
    ],
    "colorPattern": "multi-select-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `multi-select-<color>` accepts any color the app registers (see get_tokens → customColors). `multi-select-brand` is as real as `multi-select-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".multi-select:focus-within",
      ".multi-select[data-disabled]"
    ]
  },
  {
    "name": "navbar",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/navbar.js",
    "description": "The Navbar component — a horizontal top bar with start / center / end slots. Colorless. A flex row painted with the base surface. The three slots use `flex: 1` on start/end and `flex-shrink: 0` on center, so a centered slot stays optically centered whether or not the start/end content is balanced — and it degrades gracefully to a simple two-side bar when center is omitted. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "navbar",
    "classes": [
      "navbar",
      "navbar-center",
      "navbar-end",
      "navbar-start"
    ]
  },
  {
    "name": "navigation-menu",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/navigation-menu.js",
    "description": "The NavigationMenu component — a site-navigation bar whose items can open rich dropdown panels (a \"mega menu\"). Behavior is Base UI's NavigationMenu (hover/ click to open, a single shared animated viewport that resizes between panels, keyboard nav); Silica styles the bar, triggers, links, the floating popup, and the clipping viewport. Colorless. Base UI moves the active item's `.navigation-menu-content` into the shared `.navigation-menu-viewport` and exposes the target size as `--popup-width` / `--popup-height`, which the popup animates toward — so switching panels slides + resizes smoothly. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "navigation-menu",
    "classes": [
      "navigation-menu",
      "navigation-menu-content",
      "navigation-menu-icon",
      "navigation-menu-link",
      "navigation-menu-list",
      "navigation-menu-popup",
      "navigation-menu-positioner",
      "navigation-menu-trigger",
      "navigation-menu-viewport"
    ]
  },
  {
    "name": "number-field",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/number-field.js",
    "description": "The NumberField component — a stepper input (Base UI behavior). Colorless. A bordered group with a decrement button, a centered numeric input, and an increment button. Base UI owns the value clamping, keyboard stepping, and scrub interaction; we paint the group. The native spinner is hidden (the buttons replace it). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "number-field",
    "classes": [
      "number-field",
      "number-field-button",
      "number-field-decrement",
      "number-field-group",
      "number-field-increment",
      "number-field-input"
    ]
  },
  {
    "name": "outline",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/outline.js",
    "description": "Outline — a scroll-spy table of contents. A vertical rail (`.outline-list`'s border) with one link per heading; the link nearest the active reading position gets a solid accent rail segment + accent text (`[data-active]`, set by the React layer's scroll tracking — this module is pure paint). Colorless: the active state reads `--color-primary`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "outline",
    "classes": [
      "outline",
      "outline-link",
      "outline-list"
    ]
  },
  {
    "name": "overflow-list",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/overflow-list.js",
    "description": "OverflowList — a single-row list that measures available width and folds whatever doesn't fit into a trailing \"+N\" indicator. The React layer does the measuring (a hidden off-screen row renders every item once to read its real width, ResizeObserver drives recompute); this only paints the visible row, the hidden measurer, and the default \"+N\" badge + its popup. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "overflow-list",
    "classes": [
      "overflow-list",
      "overflow-list-badge",
      "overflow-list-measure",
      "overflow-list-popup"
    ]
  },
  {
    "name": "overlay",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/overlay.js",
    "description": "Overlay — a contextual scrim over a media element (image/video/card), presenting info or actions specific to what's behind it. Distinct from `Lightbox` (a full-viewport viewer) and `Dialog` (an interruptive modal) — this stays anchored to its media, either always visible or revealed on hover/focus (`data-reveal=\"hover\"`), for gallery grids and media cards. Colorless: the scrim is a black gradient/wash + white text, independent of the page theme (matches media conventions — captions read over any photo). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "overlay",
    "classes": [
      "overlay",
      "overlay-scrim"
    ],
    "compoundSelectors": [
      ".overlay-scrim :where(h1, h2, h3, h4, h5, h6, p)",
      ".overlay-scrim[data-placement=\"bottom\"]",
      ".overlay-scrim[data-placement=\"top\"]",
      ".overlay-scrim[data-placement=\"full\"]",
      ".overlay[data-reveal=\"hover\"] .overlay-scrim",
      ".overlay[data-reveal=\"hover\"]:hover .overlay-scrim, .overlay[data-reveal=\"hover\"]:focus-within .overlay-scrim"
    ]
  },
  {
    "name": "pagination",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/pagination.js",
    "description": "The Pagination component — a row of page controls. Colorless base with an orthogonal accent for the active page. The React wrapper computes the page range (with ellipses) and renders `.pagination-item` buttons plus prev/next; the active page gets `.pagination-item-active`. @param {string[]} colors - color names to generate `.pagination-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "pagination",
    "classes": [
      "pagination",
      "pagination-accent",
      "pagination-ellipsis",
      "pagination-error",
      "pagination-info",
      "pagination-item",
      "pagination-item-active",
      "pagination-lg",
      "pagination-md",
      "pagination-neutral",
      "pagination-primary",
      "pagination-secondary",
      "pagination-sm",
      "pagination-success",
      "pagination-warning",
      "pagination-xl",
      "pagination-xs"
    ],
    "colorVariants": [
      "pagination-primary",
      "pagination-secondary",
      "pagination-accent",
      "pagination-neutral",
      "pagination-info",
      "pagination-success",
      "pagination-warning",
      "pagination-error"
    ],
    "colorPattern": "pagination-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `pagination-<color>` accepts any color the app registers (see get_tokens → customColors). `pagination-brand` is as real as `pagination-primary` once `brand` is declared."
  },
  {
    "name": "phone-input",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/phone-input.js",
    "description": "The PhoneInput component's only bespoke rule — a fixed, compact width for the country-code `Select` trigger when it's joined (via `Join`) to the national-number `Input`. Everything else is composed from `Select`, `Input`, and `Join`, which is why this module is so small. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "phone-input-country",
    "classes": [
      "phone-input-country"
    ]
  },
  {
    "name": "pin-input",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/pin-input.js",
    "description": "The PinInput component — a row of single-character field-tier cells for OTP / verification-code entry. Each cell shares Input's field tier (`--radius-field`, `--size-field`) so it lines up with same-size Inputs; a color class (`.pin-input-cell-primary`, …) sets only `--pin-input-accent`, matching Input/Select's orthogonal-color convention. @param {string[]} colors - color names to generate `.pin-input-cell-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "pin-input",
    "classes": [
      "pin-input",
      "pin-input-cell",
      "pin-input-cell-accent",
      "pin-input-cell-error",
      "pin-input-cell-info",
      "pin-input-cell-lg",
      "pin-input-cell-md",
      "pin-input-cell-neutral",
      "pin-input-cell-primary",
      "pin-input-cell-secondary",
      "pin-input-cell-sm",
      "pin-input-cell-success",
      "pin-input-cell-warning",
      "pin-input-cell-xl",
      "pin-input-cell-xs"
    ],
    "colorVariants": [
      "pin-input-cell-primary",
      "pin-input-cell-secondary",
      "pin-input-cell-accent",
      "pin-input-cell-neutral",
      "pin-input-cell-info",
      "pin-input-cell-success",
      "pin-input-cell-warning",
      "pin-input-cell-error"
    ],
    "colorPattern": "pin-input-cell-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `pin-input-cell-<color>` accepts any color the app registers (see get_tokens → customColors). `pin-input-cell-brand` is as real as `pin-input-cell-primary` once `brand` is declared."
  },
  {
    "name": "popover",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/popover.js",
    "description": "The Popover surface — the visual half of the Base-UI-backed Popover (click-triggered floating panel). Base UI owns positioning/focus/dismissal; this styles the `.popover` panel + optional arrow + title/description. Light base-100 surface (unlike the dark Tooltip). The arrow is OFF by default (shadcn-style) — a bordered arrow on a light surface is fiddly to make seamless, and most popovers read cleaner without one; opt in with `arrow`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "popover",
    "classes": [
      "popover",
      "popover-arrow",
      "popover-description",
      "popover-title"
    ],
    "compoundSelectors": [
      ".popover-arrow[data-side=\"top\"]",
      ".popover-arrow[data-side=\"bottom\"]",
      ".popover-arrow[data-side=\"left\"]",
      ".popover-arrow[data-side=\"right\"]"
    ]
  },
  {
    "name": "power-search",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/power-search.js",
    "description": "PowerSearch — a structured search field: free text plus removable `field: value` filter chips, added via a field-picker → value-picker popover flow. The popup content reuses `.select-popup`-style chrome implicitly (it's rendered through `Popover`, styled here as `power-search-*` lists) so it still reads as part of the same listbox family. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "power-search",
    "classes": [
      "power-search",
      "power-search-add",
      "power-search-chip",
      "power-search-chip-field",
      "power-search-chip-remove",
      "power-search-chip-trigger",
      "power-search-field-item",
      "power-search-field-list",
      "power-search-input",
      "power-search-option-list",
      "power-search-value-form",
      "power-search-value-picker",
      "power-search-value-picker-back",
      "power-search-value-picker-label"
    ],
    "compoundSelectors": [
      ".power-search:focus-within"
    ]
  },
  {
    "name": "preview-card",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/preview-card.js",
    "description": "The PreviewCard surface — a hover/focus-triggered rich preview (link hovercard). Base UI's PreviewCard owns the open-on-hover behavior, focus, and positioning; this styles the `.preview-card` panel and its optional arrow. Same light base-100 surface + scale-in animation as Popover, but roomier and meant to hold freeform content (an avatar, heading, blurb, stats). Arrow is OFF by default (cleaner without one on a light bordered surface); opt in with the `arrow` prop. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "preview-card",
    "classes": [
      "preview-card",
      "preview-card-arrow"
    ],
    "compoundSelectors": [
      ".preview-card-arrow[data-side=\"top\"]",
      ".preview-card-arrow[data-side=\"bottom\"]",
      ".preview-card-arrow[data-side=\"left\"]",
      ".preview-card-arrow[data-side=\"right\"]"
    ]
  },
  {
    "name": "progress",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/progress.js",
    "description": "The Progress component — a horizontal bar showing completion of a task. Deliberately div-based (`.progress` track + `.progress-bar` fill), NOT a styled native `<progress>`. The native element paints its fill through engine-specific pseudo-elements (`::-webkit-progress-value` vs `::-moz-progress-bar`) that render differently across browsers and fight you on the indeterminate state. Two nested divs render pixel-identically in every engine and give full control over the indeterminate animation and radius. Orthogonal color model, same as the rest of the system: a color class (`.progress-success`) only sets `--progress-fill`; the track stays neutral so the filled portion reads clearly against it. Height scales with the shared `--size-field` density lever, so an `-sm` progress lines up with `-sm` fields. Determinate: set the bar's inline `width`. Indeterminate: add `.progress-indeterminate` and let a sliding segment animate (a gentle opacity pulse under `prefers-reduced-motion`). Keyframes live in theme.js. @param {string[]} colors - color names to generate `.progress-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "progress",
    "classes": [
      "progress",
      "progress-accent",
      "progress-bar",
      "progress-error",
      "progress-indeterminate",
      "progress-info",
      "progress-label",
      "progress-label-row",
      "progress-lg",
      "progress-md",
      "progress-neutral",
      "progress-primary",
      "progress-secondary",
      "progress-sm",
      "progress-success",
      "progress-value",
      "progress-warning",
      "progress-wrapper",
      "progress-xl",
      "progress-xs"
    ],
    "colorVariants": [
      "progress-primary",
      "progress-secondary",
      "progress-accent",
      "progress-neutral",
      "progress-info",
      "progress-success",
      "progress-warning",
      "progress-error"
    ],
    "colorPattern": "progress-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `progress-<color>` accepts any color the app registers (see get_tokens → customColors). `progress-brand` is as real as `progress-primary` once `brand` is declared."
  },
  {
    "name": "prose",
    "package": "@wizeworks/silicaui",
    "category": "Typography",
    "sourceFile": "silicaui/src/components/prose.js",
    "description": "The Prose component — typographic defaults for a block of rich/markdown content (Silica's answer to `@tailwindcss/typography`). Tailwind's Preflight strips headings, lists, quotes, code, and tables to nothing (it won't impose a look); this puts a considered, theme-aware look back — but ONLY inside `.prose`, so it never leaks into the app chrome. Every color is a Silica token (base-content text, primary links, base-200/300 surfaces + rules), so it tracks the active theme automatically. Colorless in the variant sense (no per-color classes). Inner sizing is in `em`, so the size modifiers (`-sm`/`-lg`/`-xl`) rescale the whole block by changing one root font-size. Caps at `65ch` for readability — add `max-w-none` to remove. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "prose",
    "classes": [
      "prose",
      "prose-lg",
      "prose-md",
      "prose-sm",
      "prose-xl",
      "prose-xs"
    ]
  },
  {
    "name": "radial-progress",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/radial-progress.js",
    "description": "The RadialProgress component — a circular progress ring with a centered label. Colorless accent (defaults to primary). Drawn with a single `conic-gradient` (filled arc + base-300 track) and a `::before` inner disc that punches out the centre to leave a ring of `--thickness`. No mask, no SVG — `conic-gradient` ships across every engine (2020+). The `--value` (0–100), `--size`, and `--thickness` custom properties are set inline by the React wrapper. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "radial-progress",
    "classes": [
      "radial-progress"
    ]
  },
  {
    "name": "radio-group",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/radio-group.js",
    "description": "The RadioGroup layout — a stack of radio options managed as one control. Colorless. Just the layout + option row; the radios themselves are Silica `.radio` inputs (native, so the browser gives arrow-key navigation within the shared `name` for free). `.radio-option` is the clickable `<label>` pairing a radio with its caption. `[data-orientation=\"horizontal\"]` lays them in a row. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "radio-",
    "rootNote": "No bare `.radio` class exists — this family is only its `radio-*` parts.",
    "classes": [
      "radio-group",
      "radio-option"
    ]
  },
  {
    "name": "radio",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/radio.js",
    "description": "The Radio component — a native `<input type=\"radio\">` restyled. Selector-tier control: scales with `--size-selector`, always a circle. A color class (`.radio-primary`) sets only `--radio-accent` (checked fill + border + focus ring). The checked \"dot\" is drawn with an inset box-shadow ring of the surface color — reliable across browsers and needs no pseudo-element. @param {string[]} colors - color names to generate `.radio-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "radio",
    "classes": [
      "radio",
      "radio-accent",
      "radio-error",
      "radio-info",
      "radio-lg",
      "radio-md",
      "radio-neutral",
      "radio-primary",
      "radio-secondary",
      "radio-sm",
      "radio-success",
      "radio-warning",
      "radio-xl",
      "radio-xs"
    ],
    "colorVariants": [
      "radio-primary",
      "radio-secondary",
      "radio-accent",
      "radio-neutral",
      "radio-info",
      "radio-success",
      "radio-warning",
      "radio-error"
    ],
    "colorPattern": "radio-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `radio-<color>` accepts any color the app registers (see get_tokens → customColors). `radio-brand` is as real as `radio-primary` once `brand` is declared."
  },
  {
    "name": "range",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/range.js",
    "description": "The Range component — a slider (Base UI behavior). Colorless track (base-300) with an orthogonal accent for the filled indicator and thumb. Base UI positions the indicator and thumb; we paint them. The thumb grows a soft focus/drag ring (`[data-dragging]` / `:focus-visible`). @param {string[]} colors - color names to generate `.range-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "range",
    "classes": [
      "range",
      "range-accent",
      "range-control",
      "range-error",
      "range-indicator",
      "range-info",
      "range-neutral",
      "range-primary",
      "range-secondary",
      "range-success",
      "range-thumb",
      "range-track",
      "range-warning"
    ],
    "colorVariants": [
      "range-primary",
      "range-secondary",
      "range-accent",
      "range-neutral",
      "range-info",
      "range-success",
      "range-warning",
      "range-error"
    ],
    "colorPattern": "range-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `range-<color>` accepts any color the app registers (see get_tokens → customColors). `range-brand` is as real as `range-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".range[data-disabled] .range-thumb"
    ]
  },
  {
    "name": "rating",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/rating.js",
    "description": "The Rating component — a row of star buttons. Colorless base with an orthogonal accent (`.rating-warning` sets the fill). Filled/empty state is driven by a `data-filled` attribute the React wrapper sets per star (so hover-preview and value both work). Icons are hard-sized so an unsized `<svg>` can't collapse or balloon across browsers. @param {string[]} colors - color names to generate `.rating-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "rating",
    "classes": [
      "rating",
      "rating-accent",
      "rating-error",
      "rating-info",
      "rating-item",
      "rating-lg",
      "rating-md",
      "rating-neutral",
      "rating-primary",
      "rating-readonly",
      "rating-secondary",
      "rating-sm",
      "rating-success",
      "rating-warning",
      "rating-xl",
      "rating-xs"
    ],
    "colorVariants": [
      "rating-primary",
      "rating-secondary",
      "rating-accent",
      "rating-neutral",
      "rating-info",
      "rating-success",
      "rating-warning",
      "rating-error"
    ],
    "colorPattern": "rating-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `rating-<color>` accepts any color the app registers (see get_tokens → customColors). `rating-brand` is as real as `rating-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".rating-readonly .rating-item"
    ]
  },
  {
    "name": "resizable-panels",
    "package": "@wizeworks/silicaui",
    "category": "wrapper",
    "sourceFile": "silicaui/src/components/resizable-panels.js",
    "description": "ResizablePanels chrome — the visual surface for react-resizable-panels. react-resizable-panels owns the layout + drag math (it sets flex direction, panel sizes, and the handle's `data-resize-handle-state`); this styles the bordered group frame and the resize handle (a thin bar with a centered grip that lights up on hover/drag). Orientation comes from the group's `data-panel-group-direction`, so one rule set covers both axes. The React wrappers (in the optional `@wizeworks/silicaui-panels` package) hang these classes on the library's components. Colorless: the hovered/dragged handle + grip read `--color-primary`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "resizable-",
    "rootNote": "No bare `.resizable` class exists — this family is only its `resizable-*` parts.",
    "classes": [
      "resizable-group",
      "resizable-handle",
      "resizable-handle-grip",
      "resizable-panel"
    ],
    "compoundSelectors": [
      ".resizable-group[data-panel-group-direction=\"horizontal\"] > .resizable-handle",
      ".resizable-group[data-panel-group-direction=\"vertical\"] > .resizable-handle",
      ".resizable-handle[data-resize-handle-state=\"hover\"], .resizable-handle[data-resize-handle-state=\"drag\"]",
      ".resizable-group[data-panel-group-direction=\"horizontal\"] > .resizable-handle .resizable-handle-grip",
      ".resizable-group[data-panel-group-direction=\"vertical\"] > .resizable-handle .resizable-handle-grip",
      ".resizable-handle[data-resize-handle-state=\"hover\"] .resizable-handle-grip, .resizable-handle[data-resize-handle-state=\"drag\"] .resizable-handle-grip"
    ]
  },
  {
    "name": "rich-text-editor",
    "package": "@wizeworks/silicaui",
    "category": "wrapper",
    "sourceFile": "silicaui/src/components/rich-text-editor.js",
    "description": "RichTextEditor chrome — the visual shell around a TipTap editor. TipTap (ProseMirror) owns all editing behavior; this styles the frame: a bordered box, a wrapping toolbar of toggle buttons (active state reads `--color-primary`), and the editable content surface (`.ProseMirror`) with sensible prose typography + a placeholder. The React `<RichTextEditor>` (in the optional `@wizeworks/silicaui-editor` package) drives TipTap and hangs these classes on the markup. Colorless: the active/pressed toolbar button reads `--color-primary`, same orthogonal-accent approach as the rest of Silica. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "rich-text-editor",
    "classes": [
      "ProseMirror",
      "is-editor-empty",
      "rich-text-editor",
      "rich-text-editor-btn",
      "rich-text-editor-content",
      "rich-text-editor-sep",
      "rich-text-editor-toolbar"
    ],
    "compoundSelectors": [
      ".rich-text-editor-btn[data-active]",
      ".rich-text-editor-content h1",
      ".rich-text-editor-content h2",
      ".rich-text-editor-content h3",
      ".rich-text-editor-content ul",
      ".rich-text-editor-content ol",
      ".rich-text-editor-content li > * + *",
      ".rich-text-editor-content blockquote",
      ".rich-text-editor-content a",
      ".rich-text-editor-content code",
      ".rich-text-editor-content pre",
      ".rich-text-editor-content pre code",
      ".rich-text-editor-content hr",
      ".rich-text-editor-content .ProseMirror p.is-editor-empty:first-child::before",
      ".rich-text-editor[data-disabled]"
    ]
  },
  {
    "name": "scroll-area",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/scroll-area.js",
    "description": "The ScrollArea component — a panel with custom, overlay scrollbars. Colorless. Behavior is Base UI's ScrollArea (native scrolling on the Viewport, synced decorative Scrollbar/Thumb overlays); Silica paints the surface. Base UI sizes the thumb inline from the scroll ratio, so we only style appearance and the cross-axis fill. The scrollbars overlay the content (they don't take layout width) and darken on hover. Structure: `.scroll-area` (root) › `.scroll-area-viewport` › `.scroll-area-content`, plus a `.scroll-area-scrollbar` (per orientation) wrapping a `.scroll-area-thumb`, and a `.scroll-area-corner`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "scroll-area",
    "classes": [
      "scroll-area",
      "scroll-area-content",
      "scroll-area-corner",
      "scroll-area-scrollbar",
      "scroll-area-thumb",
      "scroll-area-viewport"
    ],
    "compoundSelectors": [
      ".scroll-area:hover .scroll-area-scrollbar",
      ".scroll-area-scrollbar[data-orientation=\"vertical\"] .scroll-area-thumb",
      ".scroll-area-scrollbar[data-orientation=\"horizontal\"] .scroll-area-thumb"
    ]
  },
  {
    "name": "scroll-strip",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/scroll-strip.js",
    "description": "The ScrollStrip component — a horizontal strip that SAYS SO when part of it is off-screen. Colorless. `overflow-x: auto` on its own is a trap on anything that can be dragged narrow: the content is reachable, but the only thing announcing it exists is a scrollbar the platform may not draw at all (overlay scrollbars on macOS/iOS/Android draw nothing until you already scroll). A tab strip that ends at \"Activity\" with two more tabs past the edge simply does not have those tabs, as far as the person looking at it is concerned. Structure: `.scroll-strip` (row) › `.scroll-strip-control` + `.scroll-strip-track` (the real scroller) + `.scroll-strip-control`. ── The controls are IN FLOW, never overlaid ───────────────────────────── `.carousel-control` is absolutely positioned over the slide, which is right for a photo deck — there's nothing at the edge worth reading. A strip's edges are exactly where the content you're hunting for lives, so an overlay chevron covers the tab you were trying to read. These take their own space and push the scroller in instead. ── Why a disabled control keeps its space ─────────────────────────────── At an end the control is `:disabled`, not removed: unmounting it would widen the scroller, which can erase the very overflow that justified it, which re-mounts it — an oscillation with no fixed point. So the presence of the PAIR is driven by overflow and each one's `:disabled` by position. A runtime that hides them must hide BOTH (see the `scroll-strip` behavior). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "scroll-strip",
    "classes": [
      "scroll-strip",
      "scroll-strip-control",
      "scroll-strip-faded",
      "scroll-strip-lg",
      "scroll-strip-md",
      "scroll-strip-sm",
      "scroll-strip-track",
      "scroll-strip-xl",
      "scroll-strip-xs"
    ],
    "compoundSelectors": [
      "[dir=\"rtl\"] .scroll-strip-control svg",
      ".scroll-strip-faded > .scroll-strip-track",
      ".scroll-strip-faded[data-at-start] > .scroll-strip-track",
      ".scroll-strip-faded[data-at-end] > .scroll-strip-track",
      "[dir=\"rtl\"] .scroll-strip-faded > .scroll-strip-track",
      "@media (prefers-reduced-motion: reduce)"
    ]
  },
  {
    "name": "segment-field",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/segment-field.js",
    "description": "The segmented-field chrome shared by `DateInput`, `TimeInput`, `DateTimeInput`, and `DateRangeInput` — a bordered box (looks and focuses like `.input`) holding individually-focusable segment cells (`role=\"spinbutton\"`, e.g. mm / dd / yyyy) separated by literal text (the \"/\" or \":\" the locale's own format inserts). Colored: `.segment-field-<name>` sets `--segment-field-accent`, read by the focus ring and the focused-segment highlight. @param {string[]} colors - color names to generate `.segment-field-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "segment-field",
    "classes": [
      "date-range-input",
      "date-range-input-sep",
      "segment-field",
      "segment-field-accent",
      "segment-field-error",
      "segment-field-info",
      "segment-field-lg",
      "segment-field-literal",
      "segment-field-md",
      "segment-field-neutral",
      "segment-field-primary",
      "segment-field-secondary",
      "segment-field-segment",
      "segment-field-sm",
      "segment-field-success",
      "segment-field-warning",
      "segment-field-xl",
      "segment-field-xs"
    ],
    "colorVariants": [
      "segment-field-primary",
      "segment-field-secondary",
      "segment-field-accent",
      "segment-field-neutral",
      "segment-field-info",
      "segment-field-success",
      "segment-field-warning",
      "segment-field-error"
    ],
    "colorPattern": "segment-field-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `segment-field-<color>` accepts any color the app registers (see get_tokens → customColors). `segment-field-brand` is as real as `segment-field-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".segment-field:focus-within",
      ".segment-field[data-disabled]"
    ]
  },
  {
    "name": "select-menu",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/select-menu.js",
    "description": "The Select (listbox) surface — the visual half of the Base-UI-backed `Select`, a fully-styled, keyboard-driven, optionally-multi listbox. Distinct from the native-`<select>` `.select` field (see `select.js` / `NativeSelect`): the TRIGGER here reuses `.select` (and its `.select-<color>` / `.select-<size>` modifiers) for pixel-parity, then these sub-parts swap the CSS caret for a flex chevron `Icon` and add the portalled popup, items, groups, and separators. Base UI owns positioning + roving focus + typeahead + dismissal; this paints the surface. Items highlight via `[data-highlighted]` (keyboard OR pointer), mark the current choice via `[data-selected]`, and dim via `[data-disabled]`. The popup width tracks the trigger through `--anchor-width`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "select-",
    "rootNote": "No bare `.select` class exists — this family is only its `select-*` parts.",
    "classes": [
      "select-group-label",
      "select-icon",
      "select-item",
      "select-item-indicator",
      "select-placeholder",
      "select-popup",
      "select-scroll-arrow",
      "select-separator",
      "select-trigger",
      "select-value"
    ],
    "compoundSelectors": [
      ".select-trigger[data-placeholder] .select-placeholder",
      ".select-trigger[data-popup-open] .select-icon svg"
    ]
  },
  {
    "name": "select",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/select.js",
    "description": "The Select component — a native `<select>` restyled to the field tier. Shares Input's tier exactly (`--radius-field`, `--size-field`), so a Select lines up pixel-for-pixel with same-size Inputs and Buttons. A color class (`.select-primary`, …) sets `--select-accent`, coloring the border + focus ring; the default shows a neutral border and a primary focus ring. The dropdown chevron comes from the shared field-affordance contract (`lib/field-affordance.js`), so this caret is the same mark, ink, and trailing inset as the listbox trigger's chevron and the Combobox open button. It's drawn with `linear-gradient`s rather than an SVG because a native `<select>` can carry neither a child nor a reliable pseudo-element, and an SVG data-URI is a separate document that can't resolve a CSS var — gradients take a live color, so the mark still follows the theme. `appearance: none` removes the platform arrow. @param {string[]} colors - color names to generate `.select-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "select",
    "classes": [
      "select",
      "select-accent",
      "select-error",
      "select-info",
      "select-lg",
      "select-md",
      "select-neutral",
      "select-primary",
      "select-secondary",
      "select-sm",
      "select-success",
      "select-warning",
      "select-xl",
      "select-xs"
    ],
    "colorVariants": [
      "select-primary",
      "select-secondary",
      "select-accent",
      "select-neutral",
      "select-info",
      "select-success",
      "select-warning",
      "select-error"
    ],
    "colorPattern": "select-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `select-<color>` accepts any color the app registers (see get_tokens → customColors). `select-brand` is as real as `select-primary` once `brand` is declared."
  },
  {
    "name": "selection-list",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/selection-list.js",
    "description": "The SelectionList component — a selectable list of rows (single- or multi-select), each with a leading Checkbox/Radio indicator. Colorless: the selected row reads `--color-primary` for its tint, matching `tree-view.js`'s convention. The indicator itself is a real `.checkbox`/ `.radio` element (@wizeworks/silicaui-react reuses those components directly), so this module only styles the row/label/description chrome around it. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "selection-list",
    "classes": [
      "selection-list",
      "selection-list-item",
      "selection-list-item-body",
      "selection-list-item-description",
      "selection-list-item-icon",
      "selection-list-item-label"
    ],
    "compoundSelectors": [
      ".selection-list-item[aria-selected=\"true\"]",
      ".selection-list-item:focus-visible",
      ".selection-list-item[aria-disabled=\"true\"]"
    ]
  },
  {
    "name": "sidebar",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/sidebar.js",
    "description": "The Sidebar component — a persistent layout nav panel, distinct from `Drawer` (which overlays content and is meant to be dismissed). A Sidebar never overlays: it collapses IN PLACE to a narrow icon rail via `[data-collapsed]`, driven by `--sidebar-w`/`--sidebar-w-collapsed`. Same orthogonal-accent design as `dock.js`: a color class only sets `--sidebar-accent` (the active-item tint); everything else reads it with a fallback to `--color-primary`. `.sidebar-header-brand` is an optional wrapper for a logo/`Wordmark` inside `.sidebar-header` — it auto-hides when collapsed so only the trigger remains. @param {string[]} colors - color names to generate `.sidebar-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "sidebar",
    "classes": [
      "sidebar",
      "sidebar-accent",
      "sidebar-content",
      "sidebar-error",
      "sidebar-footer",
      "sidebar-group",
      "sidebar-group-label",
      "sidebar-header",
      "sidebar-header-brand",
      "sidebar-info",
      "sidebar-item",
      "sidebar-item-icon",
      "sidebar-item-label",
      "sidebar-item-trailing",
      "sidebar-neutral",
      "sidebar-primary",
      "sidebar-secondary",
      "sidebar-success",
      "sidebar-trigger",
      "sidebar-warning"
    ],
    "colorVariants": [
      "sidebar-primary",
      "sidebar-secondary",
      "sidebar-accent",
      "sidebar-neutral",
      "sidebar-info",
      "sidebar-success",
      "sidebar-warning",
      "sidebar-error"
    ],
    "colorPattern": "sidebar-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `sidebar-<color>` accepts any color the app registers (see get_tokens → customColors). `sidebar-brand` is as real as `sidebar-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".sidebar[data-side=\"right\"]",
      ".sidebar[data-collapsed]",
      "@media (prefers-reduced-motion: reduce)",
      ".sidebar[data-collapsed] .sidebar-header",
      ".sidebar[data-collapsed] .sidebar-header-brand",
      ".sidebar[data-collapsed] .sidebar-group-label",
      ".sidebar-item[data-active=\"true\"]",
      ".sidebar-item[data-disabled=\"true\"]",
      ".sidebar-item:focus-visible",
      ".sidebar[data-collapsed] .sidebar-item",
      ".sidebar[data-collapsed] .sidebar-item-label",
      ".sidebar[data-collapsed] .sidebar-item-trailing"
    ]
  },
  {
    "name": "skeleton",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/skeleton.js",
    "description": "The Skeleton component — an animated placeholder standing in for content that's still loading. Colorless (like Card): a neutral `base-300` fill with a translucent sheen that sweeps across via an animated `background-position`. Under `prefers-reduced-motion` the sweep is dropped for a gentle opacity pulse (the shared `silica-pulse` keyframe). Dimensions come from the caller (utilities / inline size) — Skeleton only owns the fill, radius, and shimmer. Shapes: base is a `--radius-field` block; `-circle` is an avatar-shaped placeholder; `-text` is a pill-rounded line sized in `em` so you can stack a few at different widths for a paragraph. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "skeleton",
    "classes": [
      "skeleton",
      "skeleton-circle",
      "skeleton-text"
    ]
  },
  {
    "name": "slider",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/slider.js",
    "description": "The Slider component — a rich range input (Base UI behavior). Where the native-input-backed `Range` is one thumb on a rail, `Slider` is the full Base UI slider: single OR multi-thumb (a two-thumb range selection), horizontal or vertical, with an optional value readout. Colorless track (base-300) + an orthogonal accent for the filled indicator and thumbs; a color class (`.slider-primary`) sets `--slider-accent`. Base UI positions the indicator and thumbs via inline styles; we only paint them. @param {string[]} colors - color names to generate `.slider-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "slider",
    "classes": [
      "slider",
      "slider-accent",
      "slider-control",
      "slider-error",
      "slider-indicator",
      "slider-info",
      "slider-lg",
      "slider-md",
      "slider-neutral",
      "slider-primary",
      "slider-secondary",
      "slider-sm",
      "slider-success",
      "slider-thumb",
      "slider-track",
      "slider-value",
      "slider-warning",
      "slider-xl",
      "slider-xs"
    ],
    "colorVariants": [
      "slider-primary",
      "slider-secondary",
      "slider-accent",
      "slider-neutral",
      "slider-info",
      "slider-success",
      "slider-warning",
      "slider-error"
    ],
    "colorPattern": "slider-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `slider-<color>` accepts any color the app registers (see get_tokens → customColors). `slider-brand` is as real as `slider-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".slider[data-orientation=\"vertical\"]",
      ".slider-control[data-orientation=\"vertical\"]",
      ".slider-track[data-orientation=\"vertical\"]",
      ".slider[data-disabled]"
    ]
  },
  {
    "name": "sortable-list",
    "package": "@wizeworks/silicaui",
    "category": "wrapper",
    "sourceFile": "silicaui/src/components/sortable-list.js",
    "description": "SortableList chrome — the visual surface for a dnd-kit reorderable list. dnd-kit owns the drag behavior (sensors, collision, keyboard, transforms); this styles the list rows and the drag handle, plus the lifted look while a row is being dragged (`[data-dragging]`). The React `<SortableList>` (in the optional `@wizeworks/silicaui-dnd` package) drives dnd-kit and hangs these classes on the markup; `transform`/`transition` are applied inline by dnd-kit, so this module deliberately doesn't set them. Colorless: the dragged row's border reads `--color-primary`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "familyPrefix": "sortable-",
    "rootNote": "No bare `.sortable` class exists — this family is only its `sortable-*` parts.",
    "classes": [
      "sortable-handle",
      "sortable-item",
      "sortable-list"
    ],
    "compoundSelectors": [
      ".sortable-item[data-dragging]",
      ".sortable-item[data-dragging] .sortable-handle"
    ]
  },
  {
    "name": "stack",
    "package": "@wizeworks/silicaui",
    "category": "Layout",
    "sourceFile": "silicaui/src/components/stack.js",
    "description": "The Stack component — layers its children into a peeking deck. Colorless. All children share one grid cell (`grid-area: 1/1`); the first child sits flush on top, and the next two peek out behind it, each nudged and scaled down a touch. `-bottom` makes the deck peek downward; `-start` / `-end` fan it to the sides. Great for stacked cards, notification piles, or image decks. The nudge is PROPORTIONAL, not a fixed distance. Each card behind the front one is scaled down, and `place-items: center` makes that scale pull its edges inward by `size × (1 − scale) / 2` — 3.75% for the 2nd card, 7.5% for the 3rd. A fixed-rem nudge has to out-run that shrink, so it loses at large sizes: a `1.5rem` translate against a 7.5% shrink stopped peeking entirely above 320px and the deck silently collapsed into a single card. So each transform pays back its own shrink first (the `3.75%` / `7.5%` terms cancel it exactly) and only then translates by `--stack-peek`, which is therefore the REAL, visible peek at any card size. Percentages in a translate resolve against the element's own border box — `translateY` against height, `translateX` against width — so one declaration fans identically whether the card is 128px or 1280px. `--stack-peek` is per-STEP: the 2nd card peeks by one and the 3rd by two, so the deck fans evenly. Override it with `stack-xs`…`stack-xl`, or set the property directly for a bespoke deck — it accepts any length, so `--stack-peek: 12px` works as well as a percentage. SIZING: children stretch to the deck's WIDTH (`width: 100%`) but keep their own height, so a height class belongs on the CARD and a width class on the deck. `place-items: center` is deliberate — a deck of `<img>` would be squashed by a block-axis stretch. A height on the deck itself is therefore an empty box around content-height cards, and since the peek is a share of the card, it will also read as a much smaller fan than asked for. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "stack",
    "classes": [
      "stack",
      "stack-bottom",
      "stack-end",
      "stack-lg",
      "stack-md",
      "stack-sm",
      "stack-start",
      "stack-xl",
      "stack-xs"
    ]
  },
  {
    "name": "stat",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/stat.js",
    "description": "The Stat component — a metric block (title · value · description), optionally with a trailing figure (icon), grouped in a `.stats` container. Colorless. Each `.stat` is a grid: the title/value/desc stack in column 1 while a `.stat-figure` sits in an implicit column 2 spanning all three rows, vertically centered (the daisyUI layout). The `.stats` container paints the surface and draws hairline separators between blocks — inline by default, switched to stacked by `-vertical`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "stat",
    "classes": [
      "stat",
      "stat-desc",
      "stat-figure",
      "stat-title",
      "stat-value",
      "stats",
      "stats-vertical"
    ],
    "compoundSelectors": [
      ".stats > .stat:not(:first-child)",
      ".stats-vertical > .stat:not(:first-child)"
    ]
  },
  {
    "name": "status",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/status.js",
    "description": "The Status component — a small status dot, optionally pinging. An inline dot painted with an orthogonal accent. `-ping` adds an expanding, fading ring behind it (respecting reduced-motion). Sizes scale the dot. @param {string[]} colors - color names to generate `.status-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "status",
    "classes": [
      "status",
      "status-accent",
      "status-error",
      "status-info",
      "status-lg",
      "status-md",
      "status-neutral",
      "status-ping",
      "status-primary",
      "status-secondary",
      "status-sm",
      "status-success",
      "status-warning",
      "status-xl",
      "status-xs"
    ],
    "colorVariants": [
      "status-primary",
      "status-secondary",
      "status-accent",
      "status-neutral",
      "status-info",
      "status-success",
      "status-warning",
      "status-error"
    ],
    "colorPattern": "status-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `status-<color>` accepts any color the app registers (see get_tokens → customColors). `status-brand` is as real as `status-primary` once `brand` is declared.",
    "compoundSelectors": [
      "@keyframes silica-ping",
      "@media (prefers-reduced-motion: reduce)"
    ]
  },
  {
    "name": "steps",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/steps.js",
    "description": "The Steps component — a horizontal progress tracker. A `.steps` list lays each `.step` out as an equal-width column: a numbered node on top, a label under it. Two pseudo-elements do the work — `::before` is the node (shows `counter(step)`, or a `data-content` override like a check), `::after` is the connector line reaching back to the previous node (absolutely placed at the node's center line, behind it). The first step drops its connector. A step marked with a color (`.step-primary`) paints its node AND its incoming connector via `--step-bg`/`--step-fg` — so coloring the steps up to the current one reads as \"completed\". Extensible over the color set. @param {string[]} colors - color names to generate `.step-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "step",
    "classes": [
      "step",
      "step-accent",
      "step-error",
      "step-info",
      "step-neutral",
      "step-primary",
      "step-secondary",
      "step-success",
      "step-warning",
      "steps"
    ],
    "colorVariants": [
      "step-primary",
      "step-secondary",
      "step-accent",
      "step-neutral",
      "step-info",
      "step-success",
      "step-warning",
      "step-error"
    ],
    "colorPattern": "step-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `step-<color>` accepts any color the app registers (see get_tokens → customColors). `step-brand` is as real as `step-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".step::before",
      ".step[data-content]::before",
      ".step::after",
      ".step:first-child::after"
    ]
  },
  {
    "name": "swap",
    "package": "@wizeworks/silicaui",
    "category": "Actions",
    "sourceFile": "silicaui/src/components/swap.js",
    "description": "The Swap component — toggles between two overlaid children. A `<label>` with a hidden checkbox and `.swap-on` / `.swap-off` children stacked in the same grid cell; checking the box cross-fades between them. `-rotate` spins the icons as they swap; `-flip` does a 3D flip. Perfect for a hamburger↔close, play↔pause, sun↔moon, etc. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "swap",
    "classes": [
      "swap",
      "swap-flip",
      "swap-off",
      "swap-on",
      "swap-rotate"
    ],
    "compoundSelectors": [
      ".swap-on, .swap-off",
      ".swap > input:checked ~ .swap-on",
      ".swap > input:checked ~ .swap-off",
      ".swap-rotate .swap-off",
      ".swap-rotate .swap-on",
      ".swap-rotate > input:checked ~ .swap-off",
      ".swap-rotate > input:checked ~ .swap-on",
      ".swap-flip .swap-off",
      ".swap-flip .swap-on",
      ".swap-flip > input:checked ~ .swap-off",
      ".swap-flip > input:checked ~ .swap-on"
    ]
  },
  {
    "name": "switch",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/switch.js",
    "description": "The Switch component — an accessible on/off toggle (Base UI behavior). Where `Toggle` is a restyled native `<input type=\"checkbox\">`, `Switch` is the Base UI switch: a `role=\"switch\"` control (with a hidden real input beside it, so it submits in a form and integrates with `Field`). Selector-tier: height scales with `--size-selector`; the track is a pill 1.75× as wide as it is tall. Style: the track fills with the accent when checked (`[data-checked]`) and the knob (`.switch-thumb`) glides from left to right via `translate`. A color class (`.switch-primary`) sets `--switch-accent`. The knob position keys off the ROOT's state (descendant selector), so it's robust regardless of which parts Base UI stamps `[data-checked]` onto. @param {string[]} colors - color names to generate `.switch-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "switch",
    "classes": [
      "switch",
      "switch-accent",
      "switch-error",
      "switch-info",
      "switch-lg",
      "switch-md",
      "switch-neutral",
      "switch-primary",
      "switch-secondary",
      "switch-sm",
      "switch-success",
      "switch-thumb",
      "switch-warning",
      "switch-xl",
      "switch-xs"
    ],
    "colorVariants": [
      "switch-primary",
      "switch-secondary",
      "switch-accent",
      "switch-neutral",
      "switch-info",
      "switch-success",
      "switch-warning",
      "switch-error"
    ],
    "colorPattern": "switch-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `switch-<color>` accepts any color the app registers (see get_tokens → customColors). `switch-brand` is as real as `switch-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".switch[data-checked] .switch-thumb"
    ]
  },
  {
    "name": "table",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/table.js",
    "description": "The Table component — a styled native `<table>`. Colorless (like Card/Skeleton → `table(prefix)` only). Rather than wrapping every cell in a class, `.table` styles the native table elements it contains (`th`, `td`, `thead`, `tbody tr`) via descendant selectors — so it works on plain semantic HTML (`<table class=\"table\"><thead>…`) with no per-cell classes, and the React layer can stay a single `<Table>` over raw rows. Modifiers: `-zebra` (striped rows), `-hover` (row highlight — a translucent base-content wash so it stays visible ON TOP of a zebra stripe too), and sizes `-xs…-xl` (cell padding + type). Neutral by design; no color variants. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "table",
    "classes": [
      "table",
      "table-hover",
      "table-lg",
      "table-md",
      "table-sm",
      "table-xl",
      "table-xs",
      "table-zebra"
    ]
  },
  {
    "name": "tabs",
    "package": "@wizeworks/silicaui",
    "category": "Navigation",
    "sourceFile": "silicaui/src/components/tabs.js",
    "description": "The Tabs surface — the visual half of the Base-UI-backed Tabs (no portal; Base UI owns selection state, roving focus, and the moving indicator's measurements). This styles the list, tabs, the sliding indicator, and panel. The active tab is marked **`[data-active]`** by Base UI (NOT `data-selected` — that mismatch silently no-ops the text-color rules while the indicator still moves, since the indicator is positioned by CSS vars, not the attribute). The indicator reads Base UI's `--active-tab-left`/`-width` (and `-top`/`-height` for the pill variants) and eases between positions. Accent is themed like the rest of the system: everything reads `--tabs-accent` / `--tabs-accent-content`, defaulting to primary. A color class (`.tabs-success`) re-points those, so a whole tab set recolors — and it still tracks the active theme, since the fallbacks are theme tokens. @param {string[]} colors - color names to generate `.tabs-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "tabs",
    "classes": [
      "tabs",
      "tabs-accent",
      "tabs-boxed",
      "tabs-error",
      "tabs-indicator",
      "tabs-info",
      "tabs-list",
      "tabs-list-scroll",
      "tabs-neutral",
      "tabs-panel",
      "tabs-pills",
      "tabs-primary",
      "tabs-scroller",
      "tabs-secondary",
      "tabs-success",
      "tabs-tab",
      "tabs-warning"
    ],
    "colorVariants": [
      "tabs-primary",
      "tabs-secondary",
      "tabs-accent",
      "tabs-neutral",
      "tabs-info",
      "tabs-success",
      "tabs-warning",
      "tabs-error"
    ],
    "colorPattern": "tabs-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `tabs-<color>` accepts any color the app registers (see get_tokens → customColors). `tabs-brand` is as real as `tabs-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".tabs-list-scroll .tabs-indicator",
      ".tabs-boxed .tabs-list",
      ".tabs-boxed .tabs-tab",
      ".tabs-boxed .tabs-tab[data-active]",
      ".tabs-boxed .tabs-indicator",
      ".tabs-pills .tabs-list",
      ".tabs-pills .tabs-tab",
      ".tabs-pills .tabs-tab[data-active]",
      ".tabs-pills .tabs-indicator"
    ]
  },
  {
    "name": "tag-input",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/tag-input.js",
    "description": "TagInput — a multi-value chip field. The outer `.tag-input` looks and focuses like an `.input`: a flex-wrapping box with a border + focus ring that holds removable `.tag-input-chip`s and a borderless `.tag-input-field` that grows to fill the row. The React `<TagInput>` manages the tag array, key handling, and remove buttons. Colored: a `.tag-input-<name>` class sets `--tag-accent`, which the focus ring and chip fill/text read — so chips can match any semantic color. @param {string[]} colors - color names to generate `.tag-input-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "tag-input",
    "classes": [
      "tag-input",
      "tag-input-accent",
      "tag-input-chip",
      "tag-input-chip-label",
      "tag-input-error",
      "tag-input-field",
      "tag-input-info",
      "tag-input-lg",
      "tag-input-md",
      "tag-input-neutral",
      "tag-input-primary",
      "tag-input-remove",
      "tag-input-secondary",
      "tag-input-sm",
      "tag-input-success",
      "tag-input-warning",
      "tag-input-xl",
      "tag-input-xs"
    ],
    "colorVariants": [
      "tag-input-primary",
      "tag-input-secondary",
      "tag-input-accent",
      "tag-input-neutral",
      "tag-input-info",
      "tag-input-success",
      "tag-input-warning",
      "tag-input-error"
    ],
    "colorPattern": "tag-input-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `tag-input-<color>` accepts any color the app registers (see get_tokens → customColors). `tag-input-brand` is as real as `tag-input-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".tag-input:focus-within",
      ".tag-input[data-disabled]"
    ]
  },
  {
    "name": "textarea",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/textarea.js",
    "description": "The Textarea component — a multi-line text field, sibling to Input. Field-tier element: rounds with `--radius-field` and its horizontal rhythm scales with `--size-field`, so it aligns with same-size Inputs. Unlike Input it grows vertically (a `min-height` floor, then `resize: vertical`) and uses a readable multi-line `line-height` rather than optical centering. A color class (`.textarea-primary`, …) sets only `--textarea-accent` (border + focus ring). @param {string[]} colors - color names to generate `.textarea-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "textarea",
    "classes": [
      "textarea",
      "textarea-accent",
      "textarea-error",
      "textarea-info",
      "textarea-lg",
      "textarea-md",
      "textarea-neutral",
      "textarea-primary",
      "textarea-secondary",
      "textarea-sm",
      "textarea-success",
      "textarea-warning",
      "textarea-xl",
      "textarea-xs"
    ],
    "colorVariants": [
      "textarea-primary",
      "textarea-secondary",
      "textarea-accent",
      "textarea-neutral",
      "textarea-info",
      "textarea-success",
      "textarea-warning",
      "textarea-error"
    ],
    "colorPattern": "textarea-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `textarea-<color>` accepts any color the app registers (see get_tokens → customColors). `textarea-brand` is as real as `textarea-primary` once `brand` is declared."
  },
  {
    "name": "timeline",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/timeline.js",
    "description": "The Timeline component — a sequence of events with connecting lines. Colorless. Each `<li>` is a 3-track grid: an opposite-side label (`.timeline-start`), a centered marker (`.timeline-middle`), and a content box (`.timeline-end`). The connecting lines are drawn as the marker's `::before`/`::after`, each flex-filling half the row so consecutive markers join into one continuous rail — no `<hr>` markup, and the first/last caps are hidden automatically. `-horizontal` rotates the whole thing into a row. (For a simple numbered process use Steps instead; Timeline is for dated events with content — changelogs, roadmaps, \"our story\".) @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "timeline",
    "classes": [
      "timeline",
      "timeline-box",
      "timeline-dot",
      "timeline-end",
      "timeline-horizontal",
      "timeline-middle",
      "timeline-start"
    ],
    "compoundSelectors": [
      ".timeline > li:first-child .timeline-middle::before",
      ".timeline > li:last-child .timeline-middle::after",
      ".timeline-horizontal .timeline-start",
      ".timeline-horizontal .timeline-middle",
      ".timeline-horizontal .timeline-end",
      ".timeline-horizontal > li:first-child .timeline-middle::before",
      ".timeline-horizontal > li:last-child .timeline-middle::after"
    ]
  },
  {
    "name": "timestamp",
    "package": "@wizeworks/silicaui",
    "category": "Data display",
    "sourceFile": "silicaui/src/components/timestamp.js",
    "description": "The Timestamp component — a muted, tabular-numeral time label. Colorless. Inherits font-size from context (used inline in chat metadata, table cells, list rows — sizes vary by callsite); only sets a quiet default color and `font-variant-numeric: tabular-nums` so shifting digits (a live \"2 minutes ago\" ticking up) don't jitter the surrounding layout. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "timestamp",
    "classes": [
      "timestamp"
    ]
  },
  {
    "name": "toast",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/toast.js",
    "description": "The Toast component — transient notifications (Base UI behavior). Shares Alert's surface: a solid color-per-type background driven by `--toast-bg`/`--toast-fg` (set via `[data-type]`, same orthogonal color model as `.alert-<name>`), a top-aligned leading icon slot, and the same radius/spacing/type scale — a toast is an Alert that floats and expires. Base UI owns the queue, timeout, focus management, and swipe-to-dismiss on top of that shared look; we lay the toasts out in a fixed corner viewport (a simple flex stack — reliable across browsers) and animate them in/out via `[data-starting-style]` / `[data-ending-style]`. @param {string[]} colors - color names to generate `[data-type=\"<name>\"]` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "toast",
    "classes": [
      "toast",
      "toast-action",
      "toast-close",
      "toast-content",
      "toast-description",
      "toast-title",
      "toast-viewport"
    ],
    "colorVariants": [
      "toast[data-type=\"primary\"]",
      "toast[data-type=\"secondary\"]",
      "toast[data-type=\"accent\"]",
      "toast[data-type=\"neutral\"]",
      "toast[data-type=\"info\"]",
      "toast[data-type=\"success\"]",
      "toast[data-type=\"warning\"]",
      "toast[data-type=\"error\"]"
    ],
    "colorPattern": "toast[data-type=\"<color>\"]",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `toast[data-type=\"<color>\"]` accepts any color the app registers (see get_tokens → customColors). `toast[data-type=\"brand\"]` is as real as `toast[data-type=\"primary\"]` once `brand` is declared.",
    "compoundSelectors": [
      ".toast[data-type=\"primary\"]",
      ".toast[data-type=\"secondary\"]",
      ".toast[data-type=\"accent\"]",
      ".toast[data-type=\"neutral\"]",
      ".toast[data-type=\"info\"]",
      ".toast[data-type=\"success\"]",
      ".toast[data-type=\"warning\"]",
      ".toast[data-type=\"error\"]"
    ]
  },
  {
    "name": "toggle-group",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/toggle-group.js",
    "description": "The ToggleGroup component — a segmented control (single- or multi-select set of toggle buttons). Behavior is Base UI's ToggleGroup + Toggle (roving focus, pressed state, single/multiple selection); Silica styles the track and the items. The active item reads as a raised base-100 pill on the base-200 track. NOTE: this is the button-based segmented control — distinct from `.toggle` (the on/off switch). `[data-pressed]` marks the selected item(s); `[data-orientation=\"vertical\"]` stacks it. @param {string[]} colors - registered color names to emit `-<color>` classes for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "toggle-group",
    "classes": [
      "toggle-group",
      "toggle-group-accent",
      "toggle-group-error",
      "toggle-group-info",
      "toggle-group-item",
      "toggle-group-lg",
      "toggle-group-md",
      "toggle-group-neutral",
      "toggle-group-primary",
      "toggle-group-secondary",
      "toggle-group-sm",
      "toggle-group-success",
      "toggle-group-warning",
      "toggle-group-xl",
      "toggle-group-xs"
    ],
    "colorVariants": [
      "toggle-group-primary",
      "toggle-group-secondary",
      "toggle-group-accent",
      "toggle-group-neutral",
      "toggle-group-info",
      "toggle-group-success",
      "toggle-group-warning",
      "toggle-group-error"
    ],
    "colorPattern": "toggle-group-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `toggle-group-<color>` accepts any color the app registers (see get_tokens → customColors). `toggle-group-brand` is as real as `toggle-group-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".toggle-group-xs .toggle-group-item",
      ".toggle-group-sm .toggle-group-item",
      ".toggle-group-md .toggle-group-item",
      ".toggle-group-lg .toggle-group-item",
      ".toggle-group-xl .toggle-group-item"
    ]
  },
  {
    "name": "toggle",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/toggle.js",
    "description": "The Toggle component — a native `<input type=\"checkbox\">` restyled as a switch. Selector-tier control: height scales with `--size-selector`; the track is a pill 1.75× as wide as it is tall. Style: the track background stays TRANSPARENT in both states — only the border and the knob carry color. Off = grey border + grey knob (at left); checked = accent border + accent knob (slid right). A color class (`.toggle-primary`) sets `--toggle-accent`. The knob is a `radial-gradient` circle sized to one square \"tile\", slid from left to right via `background-position` (which animates, so it glides); its color is `--toggle-knob`. No pseudo-element — reliable on a bare `<input>`. @param {string[]} colors - color names to generate `.toggle-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "toggle",
    "classes": [
      "toggle",
      "toggle-accent",
      "toggle-error",
      "toggle-info",
      "toggle-lg",
      "toggle-md",
      "toggle-neutral",
      "toggle-primary",
      "toggle-secondary",
      "toggle-sm",
      "toggle-success",
      "toggle-warning",
      "toggle-xl",
      "toggle-xs"
    ],
    "colorVariants": [
      "toggle-primary",
      "toggle-secondary",
      "toggle-accent",
      "toggle-neutral",
      "toggle-info",
      "toggle-success",
      "toggle-warning",
      "toggle-error"
    ],
    "colorPattern": "toggle-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `toggle-<color>` accepts any color the app registers (see get_tokens → customColors). `toggle-brand` is as real as `toggle-primary` once `brand` is declared."
  },
  {
    "name": "toolbar",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/toolbar.js",
    "description": "The Toolbar component — a container grouping related controls with roving focus. Behavior (arrow-key navigation, roving tabindex) is Base UI's Toolbar; Silica styles the bar, its buttons, groups, links, and separators. Colorless. A compact base-200 bar with ghost-style buttons that highlight on hover. `data-orientation=\"vertical\"` stacks it. Separators read their own `data-orientation` (a vertical rule inside a horizontal bar, and vice-versa). `data-size` (\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\") sets `--toolbar-height`/ `--toolbar-padding-inline` and the bar's own `font-size`, which its native `.toolbar-button`/`.toolbar-link` parts read — so they resize for free. That cascade is real only for THOSE parts (this module owns both ends of it); a bare `.btn`/`.input` dropped into a toolbar still needs its own explicit `-sm`/`-lg` class, since those components pick their size via a literal class, not an inherited variable. `data-variant=\"muted\"` gives the bar a tinted, less prominent background — for contextual/temporary toolbars (e.g. a bulk-selection action bar) that should read as distinct from a standing one. `data-dividers` (\"top\" | \"bottom\" | \"both\") drops the bar's own box (full border on every side) in favor of a rule on just the given edge(s) — for embedding the toolbar as a header inside a Card/Section rather than as a standalone floating bar. A `.toolbar-center` child switches the bar to a 3-column grid (`start | center | end`, via `:has()`) so center content (e.g. tabs) stays visually centered independent of how wide the start/end content is. Give the toolbar exactly 3 direct children when using it: a start child, the `.toolbar-center` child, and an end child (typically each wrapped in a `ToolbarGroup`). @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "toolbar",
    "classes": [
      "toolbar",
      "toolbar-button",
      "toolbar-center",
      "toolbar-group",
      "toolbar-link",
      "toolbar-separator"
    ]
  },
  {
    "name": "tooltip",
    "package": "@wizeworks/silicaui",
    "category": "Feedback & overlay",
    "sourceFile": "silicaui/src/components/tooltip.js",
    "description": "The Tooltip surface — the visual half of the Base-UI-backed Tooltip. Silica's split: Base UI owns the behavior (hover/focus intent, delay, positioning, portal, dismissal) in the React layer; this file owns only how the popup LOOKS. It's the first component to pair a CSS surface with a Base UI primitive, so it sets the pattern: style `.tooltip` (the popup) + `.tooltip-arrow`, and let the React wrapper attach these classes to `Tooltip.Popup`/`Tooltip.Arrow`. A classic dark chip (neutral surface). Enter/exit is driven by Base UI's `[data-starting-style]`/`[data-ending-style]` attributes + the `--transform-origin` it sets on the popup, so the scale animation grows from the anchored edge. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "tooltip",
    "classes": [
      "tooltip",
      "tooltip-arrow"
    ],
    "compoundSelectors": [
      ".tooltip-arrow[data-side=\"top\"]",
      ".tooltip-arrow[data-side=\"bottom\"]",
      ".tooltip-arrow[data-side=\"left\"]",
      ".tooltip-arrow[data-side=\"right\"]"
    ]
  },
  {
    "name": "tree-view",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/tree-view.js",
    "description": "TreeView — a hierarchical, keyboard-navigable tree (page trees, file/section hierarchies, nav builders). Structure follows the ARIA tree pattern: `ul.tree[role=tree]` → `li.tree-item[role=treeitem]` (the focusable node, roving tabindex) → an inner `.tree-node` row (the highlight/click target: chevron + optional icon + label) and, when expanded, a nested `ul.tree-group[role=group]`. Depth indentation is driven by a `--tree-depth` custom prop set inline by the React component. Colorless: the selected row reads `--color-primary` for its tint/text. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "tree",
    "classes": [
      "tree",
      "tree-group",
      "tree-item",
      "tree-node",
      "tree-node-icon",
      "tree-node-label",
      "tree-rename",
      "tree-toggle",
      "tree-toggle-spacer"
    ],
    "compoundSelectors": [
      ".tree-node[data-selected]",
      ".tree-node[data-disabled]",
      ".tree-item:focus-visible > .tree-node",
      ".tree-node[data-dragging]",
      ".tree-node[data-drag-over=\"inside\"]",
      ".tree-node[data-drag-over=\"before\"], .tree-node[data-drag-over=\"after\"]",
      ".tree-node[data-drag-over=\"before\"]::before, .tree-node[data-drag-over=\"after\"]::after",
      ".tree-node[data-drag-over=\"before\"]::before",
      ".tree-node[data-drag-over=\"after\"]::after",
      ".tree-toggle[data-expanded]"
    ]
  },
  {
    "name": "typography",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/components/typography.js",
    "description": "Typography — @wizeworks/silicaui's UI type ramp (distinct from `.prose`, which styles a block of long-form/markdown content). This gives the *application* a designed default: bare `<h1>`–`<h6>` and `<p>` look right with zero classes, plus explicit `.display` / `.display-1`–`.display-3` / `.h1`–`.h6` / `.lead` / `.caption` classes to apply any step to any element (a semantic `<h1>` that should read as an h3, or a hero `<h1>` sized up to `.display-1`, etc.). Anchored to the 16px root + the `text-*` scale (see index.js/theme.js). Heading sizes are in `rem` so they track the base font size; the oversized display ramp is fluid (`clamp` + container units) — see DISPLAY_STEPS. Two deliberate scoping choices: • Global element defaults are scoped to `[data-theme]` — the same opt-in surface @wizeworks/silicaui paints (theme.js) — so @wizeworks/silicaui NEVER restyles a host page's headings you didn't opt into (the embeddable/Sparx case). • They use `:where(...)` (zero specificity) so a Tailwind utility (`text-sm`) OR a `.h*` class always wins without `!important`. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": null,
    "classes": [
      "blockquote",
      "blockquote-cite",
      "caption",
      "display",
      "display-1",
      "display-2",
      "display-3",
      "h1",
      "h2",
      "h3",
      "h4",
      "h5",
      "h6",
      "lead"
    ],
    "compoundSelectors": [
      "[data-theme] :where(h1, h2, h3, h4, h5, h6)",
      "[data-theme] :where(h1)",
      "[data-theme] :where(h2)",
      "[data-theme] :where(h3)",
      "[data-theme] :where(h4)",
      "[data-theme] :where(h5)",
      "[data-theme] :where(h6)",
      "[data-theme] :where(p)",
      "[data-theme] :where(small)",
      "[data-theme] :where(blockquote)",
      "[data-theme] :where(blockquote > footer, blockquote > cite)"
    ]
  },
  {
    "name": "validator",
    "package": "@wizeworks/silicaui",
    "category": "Data input",
    "sourceFile": "silicaui/src/components/validator.js",
    "description": "The Validator component — validity-driven coloring for form controls. Colorless (semantic error/success only). Add `.validator` alongside `.input`, `.select`, `.textarea`, etc. It recolors the control by (a) the native `:user-invalid` / `:user-valid` states — which only engage AFTER the user has interacted, so a pristine form doesn't shout — and (b) an explicit `[aria-invalid]` attribute for controlled React validation. It works by writing the SAME accent variables the field components already read (`--input-accent`, `--select-accent`, `--textarea-accent`), so the border and focus ring flip to error/success with no per-field wiring. As a fallback it also sets `border-color`/`outline-color` directly for any control that doesn't route through an accent var. `.validator-hint` is an inline message that stays hidden until the control it immediately follows is invalid. @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "validator",
    "classes": [
      "validator",
      "validator-hint"
    ],
    "compoundSelectors": [
      ".validator:user-invalid",
      ".validator[aria-invalid='true']",
      ".validator:user-valid",
      ".validator[aria-invalid='false']",
      ".validator:user-invalid + .validator-hint",
      ".validator[aria-invalid='true'] + .validator-hint"
    ]
  },
  {
    "name": "wizard",
    "package": "@wizeworks/silicaui",
    "category": "Advanced / composite",
    "sourceFile": "silicaui/src/components/wizard.js",
    "description": "Wizard — a multi-step flow: a numbered step indicator with connectors, a content pane for the active step, and a Back / Next-or-Finish footer. The React `<Wizard>` owns the active-step state, linear vs. free navigation, and the footer buttons; this styles the indicator (upcoming / active / complete markers + the connecting rail), the content area, and the footer row. Colored: a `.wizard-<name>` class sets `--wz-accent` (+ its readable `--wz-accent-content`), which the active/complete markers and filled connectors read — orthogonal accent, same as the rest of Silica. @param {string[]} colors - color names to generate `.wizard-<name>` for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "wizard",
    "classes": [
      "wizard",
      "wizard-accent",
      "wizard-content",
      "wizard-error",
      "wizard-footer",
      "wizard-info",
      "wizard-neutral",
      "wizard-primary",
      "wizard-secondary",
      "wizard-step",
      "wizard-step-label",
      "wizard-step-marker",
      "wizard-step-optional",
      "wizard-steps",
      "wizard-success",
      "wizard-warning"
    ],
    "colorVariants": [
      "wizard-primary",
      "wizard-secondary",
      "wizard-accent",
      "wizard-neutral",
      "wizard-info",
      "wizard-success",
      "wizard-warning",
      "wizard-error"
    ],
    "colorPattern": "wizard-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `wizard-<color>` accepts any color the app registers (see get_tokens → customColors). `wizard-brand` is as real as `wizard-primary` once `brand` is declared.",
    "compoundSelectors": [
      ".wizard-step[data-clickable]",
      ".wizard-step[data-disabled]",
      ".wizard-step:not(:first-child)::before",
      ".wizard-step[data-state=\"active\"]::before, .wizard-step[data-state=\"complete\"]::before",
      ".wizard-step[data-state=\"active\"] .wizard-step-marker",
      ".wizard-step[data-state=\"complete\"] .wizard-step-marker",
      ".wizard-step[data-state=\"active\"] .wizard-step-label"
    ]
  },
  {
    "name": "wordmark",
    "package": "@wizeworks/silicaui",
    "category": "Typography",
    "sourceFile": "silicaui/src/components/wordmark.js",
    "description": "The Wordmark component — a stylized logotype for a brand/product name. Colorless base (reads `currentColor`-adjacent `--color-base-content`) with an orthogonal accent for `.wordmark-accent` (a highlighted suffix/prefix, e.g. the \"UI\" in \"Silica UI\"). Tight tracking + a heavier weight distinguish it from ordinary body/heading text — this is a logotype, not a `<Heading>`. @param {string[]} colors - color names to generate `.wordmark-<name>` variants for @param {string} [prefix] - prepended verbatim to every class (e.g. `sx-`)",
    "root": "wordmark",
    "classes": [
      "wordmark",
      "wordmark-accent",
      "wordmark-error",
      "wordmark-info",
      "wordmark-lg",
      "wordmark-md",
      "wordmark-neutral",
      "wordmark-primary",
      "wordmark-secondary",
      "wordmark-sm",
      "wordmark-success",
      "wordmark-warning",
      "wordmark-xl",
      "wordmark-xs"
    ],
    "colorVariants": [
      "wordmark-primary",
      "wordmark-secondary",
      "wordmark-accent",
      "wordmark-neutral",
      "wordmark-info",
      "wordmark-success",
      "wordmark-warning",
      "wordmark-error"
    ],
    "colorPattern": "wordmark-<color>",
    "colorNote": "The eight above are the DEFAULT roles, not the whole set — `wordmark-<color>` accepts any color the app registers (see get_tokens → customColors). `wordmark-brand` is as real as `wordmark-primary` once `brand` is declared."
  },
  {
    "name": "color-utilities",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/color-utilities.js",
    "description": "The full build-time utility set: the surface ramp plus each semantic color and its `-content` foreground. Wired into the plugin so every declared color is paintable via `text-`/`bg-`/`border-` without scanning. @param {string[]} colors - the plugin's `colors:` list @param {string} [prefix]",
    "root": null,
    "classes": [
      "bg-accent",
      "bg-accent-content",
      "bg-base-100",
      "bg-base-200",
      "bg-base-300",
      "bg-base-content",
      "bg-error",
      "bg-error-content",
      "bg-info",
      "bg-info-content",
      "bg-neutral",
      "bg-neutral-content",
      "bg-primary",
      "bg-primary-content",
      "bg-secondary",
      "bg-secondary-content",
      "bg-soft",
      "bg-success",
      "bg-success-content",
      "bg-warning",
      "bg-warning-content",
      "border-accent",
      "border-accent-content",
      "border-base-100",
      "border-base-200",
      "border-base-300",
      "border-base-content",
      "border-error",
      "border-error-content",
      "border-info",
      "border-info-content",
      "border-neutral",
      "border-neutral-content",
      "border-primary",
      "border-primary-content",
      "border-secondary",
      "border-secondary-content",
      "border-soft",
      "border-success",
      "border-success-content",
      "border-warning",
      "border-warning-content",
      "glass",
      "soft",
      "text-accent",
      "text-accent-content",
      "text-base-100",
      "text-base-200",
      "text-base-300",
      "text-base-content",
      "text-error",
      "text-error-content",
      "text-info",
      "text-info-content",
      "text-neutral",
      "text-neutral-content",
      "text-primary",
      "text-primary-content",
      "text-secondary",
      "text-secondary-content",
      "text-soft",
      "text-success",
      "text-success-content",
      "text-warning",
      "text-warning-content"
    ]
  },
  {
    "name": "type-scale",
    "package": "@wizeworks/silicaui",
    "category": "css",
    "sourceFile": "silicaui/src/type-scale.js",
    "description": "The type scale — @wizeworks/silicaui's `text-*` size ladder, and the SINGLE source of truth for it. The plugin registers this as `theme.extend.fontSize` (see index.js) so Tailwind emits `text-xs` … `text-10xl`, and the MCP catalog generator imports the SAME object so the documented scale can never drift from what the plugin actually ships. Exposed as `@wizeworks/silicaui/type-scale` for anyone who wants to build a size picker or safelist from the canonical scale rather than re-typing it. Anchored to a 16px root (index.js declares `100%`, honoring a user's own browser setting): `text-md` (== `text-base`) is 1rem = 16px — the worldwide default body size — so the scale reads as a self-documenting xs → sm → MD → lg… ladder rather than leaving 16px an accidental Tailwind default. `md` is the named alias @wizeworks/silicaui code should reach for; always prefer a scale step over a `text-[13px]`-style magic number. xs–9xl match Tailwind's own defaults (nothing shifts) but are declared EXPLICITLY rather than left to Tailwind — otherwise the ladder @wizeworks/silicaui \"owns\" quietly stopped at 7xl while 8xl/9xl leaked in from the framework default, so the top of the scale wasn't self-documenting. `10xl` (10rem) extends past Tailwind's ceiling for oversized hero/display type. Shape matches Tailwind's `fontSize` theme: `[fontSize, { lineHeight }]`.",
    "root": null,
    "familyPrefix": "text-",
    "rootNote": "No bare `.text` class exists — this family is only its `text-*` parts.",
    "classes": [
      "text-xs",
      "text-sm",
      "text-md",
      "text-base",
      "text-lg",
      "text-xl",
      "text-2xl",
      "text-3xl",
      "text-4xl",
      "text-5xl",
      "text-6xl",
      "text-7xl",
      "text-8xl",
      "text-9xl",
      "text-10xl"
    ]
  }
]
