{
  "site": {
    "name": "Iconiq UI",
    "url": "https://iconiqui.com",
    "description": "Iconiq UI is an open-source React component library built around the shadcn registry workflow. Browse motion-powered UI primitives, install them as local files, and adapt them directly inside modern interfaces.",
    "llms": {
      "overview": "https://iconiqui.com/llms.txt",
      "full": "https://iconiqui.com/llms-full.txt"
    },
    "catalogs": {
      "aiIndex": "https://iconiqui.com/ai-index.json"
    }
  },
  "guides": [
    {
      "title": "Overview",
      "href": "/",
      "url": "https://iconiqui.com",
      "summary": "Homepage with the full live component playground and the primary installation path for the registry."
    },
    {
      "title": "Introduction",
      "href": "/introduction",
      "url": "https://iconiqui.com/introduction",
      "summary": "Product overview, design principles, and the delivery model behind the Iconiq component library."
    },
    {
      "title": "Installation",
      "href": "/installation",
      "url": "https://iconiqui.com/installation",
      "summary": "Installation guide for the shadcn registry flow, direct registry JSON URLs, and sample component entries."
    },
    {
      "title": "Marketplace",
      "href": "/marketplace",
      "url": "https://iconiqui.com/marketplace",
      "summary": "VS Code Marketplace install page for the Iconiq UI extension, with links to the extension README and registry guides."
    },
    {
      "title": "MCP",
      "href": "/mcp",
      "url": "https://iconiqui.com/mcp",
      "summary": "MCP setup guide for connecting Iconiq to AI coding tools through the shadcn registry workflow."
    }
  ],
  "components": [
    {
      "slug": "bento-builder",
      "name": "Bento Builder",
      "href": "/builder/bento-builder",
      "url": "https://iconiqui.com/builder/bento-builder",
      "installPackage": "@iconiq/bento-builder",
      "installCommand": "npx shadcn@latest add @iconiq/bento-builder",
      "registryPath": "bento-builder.json",
      "registryUrl": "https://iconiqui.com/r/bento-builder.json",
      "summary": "Interactive bento-grid layout tool — drag tiles to reposition, tap to rename, drag a corner to resize, add tiles, then export the generated grid layout code to drop straight into your own project.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "ai-input",
      "name": "AI Input",
      "href": "/blocks/ai-input",
      "url": "https://iconiqui.com/blocks/ai-input",
      "installPackage": "@iconiq/ai-input",
      "installCommand": "npx shadcn@latest add @iconiq/ai-input",
      "registryPath": "ai-input.json",
      "registryUrl": "https://iconiqui.com/r/ai-input.json",
      "summary": "Chat-style composer that stacks sent messages above the input as bubbles, exposes agent and model selector chips, and plays an Apple Intelligence-style gradient wave inside the surface when a message is sent.",
      "apiSections": [
        {
          "id": "ai-input",
          "title": "AIInput",
          "summary": "Chat-style composer that stacks sent messages above the input as bubbles, exposes agent and model selector chips, and plays an Apple Intelligence-style gradient wave inside the surface when a message is sent.",
          "notes": [
            "Press Enter to send; Shift+Enter inserts a newline. Empty drafts are ignored.",
            "The textarea auto-grows with the draft up to 132px, then scrolls.",
            "Clicking send (or pressing Enter) plays the gradient wave once: a tall, softly blurred multicolor band rises from the bottom to the top of the composer in a single pass, then fades out.",
            "The wave only appears after a message is sent — never while typing.",
            "The wave sweep collapses to a static gradient fade when the user prefers reduced motion.",
            "Agent and model chips open lightweight spring-animated menus that dismiss on outside click or Escape.",
            "The plus menu is fully data-driven via `menuItems`: actions, switch toggles, separators, and one-level submenus that slide in with a back button.",
            "The plus menu flips to open downward automatically when there is not enough room above the composer.",
            "The send button lifts to full contrast once the draft has content."
          ],
          "fields": [
            {
              "name": "agents",
              "type": "AIInputOption[]",
              "defaultValue": "",
              "required": false,
              "description": "Options for the agent chip on the left of the footer. Each option has `value` and `label`. Omit to hide the chip."
            },
            {
              "name": "defaultAgent",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initially selected agent value. Falls back to the first agent option."
            },
            {
              "name": "models",
              "type": "AIInputOption[]",
              "defaultValue": "",
              "required": false,
              "description": "Options for the model chip on the right of the footer. Omit to hide the chip."
            },
            {
              "name": "defaultModel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initially selected model value. Falls back to the first model option."
            },
            {
              "name": "menuItems",
              "type": "AIInputMenuItem[]",
              "defaultValue": "",
              "required": false,
              "description": "Items for the plus menu. Each item has `value`, `label`, and optional `icon`. Set `type` to `\"toggle\"` for a switch row (with optional `defaultChecked`) or `\"separator\"` for a divider. Action items accept a per-item `onClick` and toggles a per-item `onCheckedChange`, firing alongside the component-level callbacks. Pass nested `items` to turn an action into a one-level submenu with a slide transition and back button. Omit to make the plus button a plain attachment button."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "\"Ask for follow-up changes\"",
              "required": false,
              "description": "Placeholder copy for the textarea."
            },
            {
              "name": "showMessages",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Render sent messages as right-aligned chat bubbles above the composer. Disable when you render your own thread."
            },
            {
              "name": "onSend",
              "type": "(message: string, meta: { agent: string; model: string }) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the trimmed message and the current agent and model picks when the user presses Enter or clicks send."
            },
            {
              "name": "onMicClick",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the microphone button is clicked."
            },
            {
              "name": "onPlusClick",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the plus button is clicked and no `menuItems` are provided."
            },
            {
              "name": "onMenuSelect",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the item's `value` when an action item — top-level or inside a submenu — is selected in the plus menu."
            },
            {
              "name": "onMenuToggle",
              "type": "(value: string, checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a toggle item in the plus menu is switched on or off."
            },
            {
              "name": "onAgentChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the new agent value when the agent chip selection changes."
            },
            {
              "name": "onModelChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the new model value when the model chip selection changes."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Extra classes for the outer wrapper."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "banner",
      "name": "Banner",
      "href": "/blocks/banner",
      "url": "https://iconiqui.com/blocks/banner",
      "installPackage": "@iconiq/banner",
      "installCommand": "npx shadcn@latest add @iconiq/banner",
      "registryPath": "banner.json",
      "registryUrl": "https://iconiqui.com/r/banner.json",
      "summary": "Top-of-screen announcement banner with four gradient tones, a left-aligned ringed icon and message, a right-aligned outlined action, a dismiss collapse, and a fluid spring morph that melts the bar into a confirmation pill when its action is clicked.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "code-block",
      "name": "Code Block",
      "href": "/blocks/code-block",
      "url": "https://iconiqui.com/blocks/code-block",
      "installPackage": "@iconiq/code-block",
      "installCommand": "npx shadcn@latest add @iconiq/code-block",
      "registryPath": "code-block.json",
      "registryUrl": "https://iconiqui.com/r/code-block.json",
      "summary": "Editor-style code block with a filename tab, a top-right spring-crossfade copy button, a bottom status bar with language and line count, line numbers, built-in theme-aware syntax highlighting, and line emphasis.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "contribution-graph",
      "name": "Contribution Graph",
      "href": "/blocks/contribution-graph",
      "url": "https://iconiqui.com/blocks/contribution-graph",
      "installPackage": "@iconiq/contribution-graph",
      "installCommand": "npx shadcn@latest add @iconiq/contribution-graph",
      "registryPath": "contribution-graph.json",
      "registryUrl": "https://iconiqui.com/r/contribution-graph.json",
      "summary": "GitHub-style contribution calendar with compound calendar, block, total-count, and legend parts — pass raw Activity data or just a GitHub username and it fetches and caches the last year of contributions itself, shimmers a skeleton grid while loading, then fades the muted grid in and lights the greens up level by level — lightest to darkest — with springy pops, plus custom per-day tooltips and reduced-motion aware behavior.",
      "apiSections": [],
      "dependencies": [
        "date-fns"
      ]
    },
    {
      "slug": "feedback-form",
      "name": "Feedback Form",
      "href": "/blocks/feedback-form",
      "url": "https://iconiqui.com/blocks/feedback-form",
      "installPackage": "@iconiq/feedback-form",
      "installCommand": "npx shadcn@latest add @iconiq/feedback-form",
      "registryPath": "feedback-form.json",
      "registryUrl": "https://iconiqui.com/r/feedback-form.json",
      "summary": "Feedback Form component documentation.",
      "apiSections": [],
      "dependencies": []
    },
    {
      "slug": "logo-carousel",
      "name": "Logo Carousel",
      "href": "/blocks/logo-carousel",
      "url": "https://iconiqui.com/blocks/logo-carousel",
      "installPackage": "@iconiq/logo-carousel",
      "installCommand": "npx shadcn@latest add @iconiq/logo-carousel",
      "registryPath": "logo-carousel.json",
      "registryUrl": "https://iconiqui.com/r/logo-carousel.json",
      "summary": "Logo Carousel component documentation.",
      "apiSections": [],
      "dependencies": []
    },
    {
      "slug": "message",
      "name": "Message",
      "href": "/blocks/message",
      "url": "https://iconiqui.com/blocks/message",
      "installPackage": "@iconiq/message",
      "installCommand": "npx shadcn@latest add @iconiq/message",
      "registryPath": "message.json",
      "registryUrl": "https://iconiqui.com/r/message.json",
      "summary": "Composable chat message primitives — group, row, avatar, bubble, header, and footer — where each message slides in beside its composer with a bouncy spring: sent messages arrive from the right, received from the left, morphing up from the bubble's tail corner and bouncing back once as they land, plus reduced-motion aware behavior.",
      "apiSections": [],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "reasoning-steps",
      "name": "Reasoning Steps",
      "href": "/blocks/reasoning-steps",
      "url": "https://iconiqui.com/blocks/reasoning-steps",
      "installPackage": "@iconiq/reasoning-steps",
      "installCommand": "npx shadcn@latest add @iconiq/reasoning-steps",
      "registryPath": "reasoning-steps.json",
      "registryUrl": "https://iconiqui.com/r/reasoning-steps.json",
      "summary": "Base UI collapsible reasoning trace for AI replies with a shimmering trigger label and no status icon, per-step dots that pop into checkmarks once done, a self-timing elapsed-seconds readout, a crossfading collapsed preview of the current step, and a staggered vertical timeline once expanded.",
      "apiSections": [],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "scroll-progress",
      "name": "Scroll Progress",
      "href": "/blocks/scroll-progress",
      "url": "https://iconiqui.com/blocks/scroll-progress",
      "installPackage": "@iconiq/scroll-progress",
      "installCommand": "npx shadcn@latest add @iconiq/scroll-progress",
      "registryPath": "scroll-progress.json",
      "registryUrl": "https://iconiqui.com/r/scroll-progress.json",
      "summary": "Ruler-style scroll indicator with tick marks that fill in as the page scrolls and a live percentage readout, dockable to either side or bottom corner of the viewport or a scrollable container.",
      "apiSections": [],
      "dependencies": []
    },
    {
      "slug": "setup-checklist",
      "name": "Setup Checklist",
      "href": "/blocks/setup-checklist",
      "url": "https://iconiqui.com/blocks/setup-checklist",
      "installPackage": "@iconiq/setup-checklist",
      "installCommand": "npx shadcn@latest add @iconiq/setup-checklist",
      "registryPath": "setup-checklist.json",
      "registryUrl": "https://iconiqui.com/r/setup-checklist.json",
      "summary": "Animated onboarding checklist card with staggered task rows, a drawn checkmark badge, and a floating progress pill with a spring-smoothed pie.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "streaming-text",
      "name": "Streaming Text",
      "href": "/blocks/streaming-text",
      "url": "https://iconiqui.com/blocks/streaming-text",
      "installPackage": "@iconiq/streaming-text",
      "installCommand": "npx shadcn@latest add @iconiq/streaming-text",
      "registryPath": "streaming-text.json",
      "registryUrl": "https://iconiqui.com/r/streaming-text.json",
      "summary": "Word-by-word AI text streaming where each word fades in crisply wearing a blue gradient, then crossfades into the theme foreground once settled — black in light mode, white in dark — with a pulsing gradient dot at the stream head, natural prose wrapping, sr-only full-text announcement, and reduced-motion aware behavior.",
      "apiSections": [],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "team-invitation",
      "name": "Team Invitation",
      "href": "/blocks/team-invitation",
      "url": "https://iconiqui.com/blocks/team-invitation",
      "installPackage": "@iconiq/team-invitation",
      "installCommand": "npx shadcn@latest add @iconiq/team-invitation",
      "registryPath": "team-invitation.json",
      "registryUrl": "https://iconiqui.com/r/team-invitation.json",
      "summary": "Team invitation block with fluid morphing variants for inviting members, managing the team, assigning roles, and tracking pending invites.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "testimonials",
      "name": "Testimonials",
      "href": "/blocks/testimonials",
      "url": "https://iconiqui.com/blocks/testimonials",
      "installPackage": "@iconiq/testimonials",
      "installCommand": "npx shadcn@latest add @iconiq/testimonials",
      "registryPath": "testimonials.json",
      "registryUrl": "https://iconiqui.com/r/testimonials.json",
      "summary": "Inline testimonial wall where hovering one quote blurs and dims the rest while the author attribution reveals beside the highlighted quote. Pure CSS :has()-driven hover state — no per-frame JS animation.",
      "apiSections": [],
      "dependencies": []
    },
    {
      "slug": "thinking-indicator",
      "name": "Thinking Indicator",
      "href": "/blocks/thinking-indicator",
      "url": "https://iconiqui.com/blocks/thinking-indicator",
      "installPackage": "@iconiq/thinking-indicator",
      "installCommand": "npx shadcn@latest add @iconiq/thinking-indicator",
      "registryPath": "thinking-indicator.json",
      "registryUrl": "https://iconiqui.com/r/thinking-indicator.json",
      "summary": "AI loading state with a sparkle glyph that wobbles through liquid blob keyframes into a circle while a companion twinkle blooms on the same timeline, cycling status words that slide through a soft blur, a per-word shimmer sweep, layout-stable width, and reduced-motion aware behavior.",
      "apiSections": [],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "b-button",
      "name": "Button",
      "href": "/buttons-and-actions/button",
      "url": "https://iconiqui.com/buttons-and-actions/button",
      "installPackage": "@iconiq/b-button",
      "installCommand": "npx shadcn@latest add @iconiq/b-button",
      "registryPath": "b-button.json",
      "registryUrl": "https://iconiqui.com/r/b-button.json",
      "summary": "Base UI button with embedded Iconiq theme tokens, shadcn-style variants, spring press feedback, optional loading state, link rendering, and Motion ripple layer.",
      "apiSections": [
        {
          "id": "button",
          "title": "Button",
          "summary": "Base UI button with embedded Iconiq theme tokens, shadcn-style variants, spring press feedback, optional loading state, link rendering, and Motion ripple layer.",
          "notes": [
            "The component ships embedded Iconiq theme tokens so primary, border, accent, and destructive colors resolve correctly without a separate theme install.",
            "Standard button attributes such as onClick, aria-*, name, form, and data-* are forwarded to the rendered button or anchor.",
            "href mode renders a motion-enhanced anchor; button mode renders Base UI Button with a motion.button surface via the render prop.",
            "The local pointer-down handler calls your onPointerDown first, then respects e.defaultPrevented before deciding whether to enter the pressed state or spawn a ripple.",
            "Pointer, keyboard, and blur handlers keep the pressed state in sync so Space and Enter get the same immediate feedback as pointer input.",
            "animateSize works best on intrinsically sized buttons rather than width-constrained layouts such as w-full.",
            "Icon-only sizes log a development warning when neither iconLabel nor aria-label is provided."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"",
              "defaultValue": "default",
              "required": false,
              "description": "Chooses the visual recipe from the exported buttonVariants map."
            },
            {
              "name": "linkUnderline",
              "type": "\"motion\" | \"static\"",
              "defaultValue": "\"motion\" (when variant is link)",
              "required": false,
              "description": "Link variant only. motion keeps foreground text with a grey baseline underline that fills darker on hover. static uses the same text size as other variants with hover:underline."
            },
            {
              "name": "size",
              "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\"",
              "defaultValue": "default",
              "required": false,
              "description": "Controls the shadcn-style height, padding, gap, radius, and icon sizing for text and icon-only buttons."
            },
            {
              "name": "animateSize",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Animates the button width with a spring as its intrinsic content changes, which is useful for labels like Continue, Saving..., and Saved on the same control."
            },
            {
              "name": "loading",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Locks the control, sets aria-busy, crossfades the label and icon into a spring-animated spinner, and suppresses ripples until loading finishes."
            },
            {
              "name": "loadingIcon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional spinner or status icon shown while loading is true. Defaults to a Lucide Loader2 icon with animate-spin."
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "When set, renders an animated anchor instead of a button. Disabled and loading states use aria-disabled, tabIndex -1, and click prevention."
            },
            {
              "name": "target",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Anchor target such as \"_blank\". When the target opens a new tab, rel automatically gains noopener and noreferrer unless you already supplied them."
            },
            {
              "name": "rel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional anchor rel attribute. Merged with noopener noreferrer when target includes _blank."
            },
            {
              "name": "disableRipple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Skips the pointer ripple when you want only the press-state feedback. Link buttons also skip the ripple by default to avoid a contained splash on text-only actions."
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\"",
              "defaultValue": "button",
              "required": false,
              "description": "Passed to the underlying button element so the component does not submit forms accidentally by default. Ignored for href links."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Label content rendered above the ripple layer inside a z-10 span."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional icon rendered inline with the label. Nested SVGs inherit the built-in size utility and variant-aware icon color."
            },
            {
              "name": "iconLabel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Convenience prop that sets aria-label, which is required for icon-only sizes when no visible text children are present."
            },
            {
              "name": "iconPosition",
              "type": "\"start\" | \"end\"",
              "defaultValue": "\"start\"",
              "required": false,
              "description": "Chooses whether the optional icon renders before or after the button text inside the same inline content row. Loading always renders at the start."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged after the generated CVA classes, making it the main escape hatch for one-off layout changes."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Native disabled state. Combines with loading to lock interaction and prevent ripple creation."
            }
          ]
        },
        {
          "id": "button-variants",
          "title": "buttonVariants",
          "summary": "The CVA recipe exported alongside the component so matching button classes can be reused on links or custom wrappers.",
          "notes": [
            "Variants ship with six visual states and eight size tokens, including icon-only sizes.",
            "Because buttonVariants is a plain CVA export, you can compose it independently from the Button component when you do not want a motion.button element.",
            "The recipe includes the same embedded Iconiq theme tokens as the Button root."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Visual recipe passed to the CVA helper when composing classes outside the Button component."
            },
            {
              "name": "linkUnderline",
              "type": "\"motion\" | \"static\"",
              "defaultValue": "\"motion\" (when variant is link)",
              "required": false,
              "description": "Link variant only. Pass through the same underline mode used by the Button component."
            },
            {
              "name": "size",
              "type": "\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Size token passed to the CVA helper for text and icon-only button recipes."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional classes merged after the generated variant and size classes."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "lucide-react",
        "motion"
      ]
    },
    {
      "slug": "button-group",
      "name": "Button Group",
      "href": "/buttons-and-actions/button-group",
      "url": "https://iconiqui.com/buttons-and-actions/button-group",
      "installPackage": "@iconiq/button-group",
      "installCommand": "npx shadcn@latest add @iconiq/button-group",
      "registryPath": "button-group.json",
      "registryUrl": "https://iconiqui.com/r/button-group.json",
      "summary": "Compact bordered action button with muted idle text, darker hover text, optional ripple feedback, variants, and shadcn-style size controls.",
      "apiSections": [
        {
          "id": "button-group-button",
          "title": "Button",
          "summary": "Compact bordered action button with muted idle text, darker hover text, optional ripple feedback, variants, and shadcn-style size controls.",
          "notes": [
            "Most standard button props such as type, disabled, onClick, name, value, aria-*, and data-* are forwarded to the underlying motion button.",
            "Inside ButtonGroup, individual borders are omitted so default and ghost variants sit flush in one connected surface.",
            "The public prop surface intentionally leaves out the native drag and CSS animation callback props because they conflict with Motion's own handler names."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Button content rendered inside an inline span so icon-and-label pairs keep consistent spacing across sizes."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root button. Use it for local width, spacing, or surface overrides."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Compacts or expands the control. Inherits the ButtonGroup size when the button is rendered inside a group."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\" | \"ghost\" | \"outline\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Visual treatment for the action. Destructive is useful for delete or irreversible actions inside a toolbar."
            },
            {
              "name": "disableRipple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Turns off the click ripple while preserving the rest of the hover and focus styling."
            },
            {
              "name": "showBorder",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Adds a standalone border when the button is used outside ButtonGroup. Inside ButtonGroup, the wrapper supplies the outer border and dividers instead."
            }
          ]
        },
        {
          "id": "button-group-icon-button",
          "title": "IconButton",
          "summary": "Icon-only toolbar action that shares the same compact border, muted idle tone, variants, and optional ripple behavior as Button.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Icon content rendered inside the inline content span. SVG children inherit the built-in size utilities for the active size variant."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the icon button root for size or surface overrides."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Controls the square footprint of the icon button. Inherits the ButtonGroup size when rendered inside a group."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\" | \"ghost\" | \"outline\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Matches the Button variant surface for icon-only actions."
            },
            {
              "name": "disableRipple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the click ripple for quieter toolbar actions."
            },
            {
              "name": "showBorder",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Removes the outer border when set to false so the icon action can sit more quietly beside a borderless group."
            }
          ]
        },
        {
          "id": "button-group-layout",
          "title": "ButtonGroup",
          "summary": "Slot-aware flex wrapper for arranging adjacent controls with horizontal or vertical rounding rules and shared size context.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Buttons, icon buttons, ButtonGroupText, ButtonGroupSeparator, ButtonGroupItems, or any other data-slot controls you want to keep together."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Chooses the grouped rounding and shared-border direction used by buttonGroupVariants."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Shared density for Button, IconButton, and ButtonGroupText children unless a child overrides size locally."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer group. Use it for wrapping, alignment, or local spacing overrides."
            }
          ]
        },
        {
          "id": "button-group-text",
          "title": "ButtonGroupText",
          "summary": "Non-interactive text segment for labeling a group without leaving the shared button-group surface.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Short label or inline content rendered inside the grouped text segment."
            },
            {
              "name": "render",
              "type": "useRender render prop",
              "defaultValue": "",
              "required": false,
              "description": "Optional Base UI render override when you need a different element while keeping the same merged props."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default muted bordered text segment classes."
            }
          ]
        },
        {
          "id": "button-group-separator",
          "title": "ButtonGroupSeparator",
          "summary": "Separator segment for splitting labels, buttons, inputs, and grouped actions inside ButtonGroup.",
          "notes": [],
          "fields": [
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"vertical\"",
              "required": false,
              "description": "Controls the separator axis. Vertical separators are the default for horizontal button groups."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the self-stretching separator classes for custom color or spacing."
            }
          ]
        },
        {
          "id": "button-group-items",
          "title": "ButtonGroupItems",
          "summary": "Segmented button shell that converts valid child elements into compact internal buttons with muted idle text and darker hover states.",
          "notes": [
            "Only valid React elements are rendered. Non-element children are ignored and warned about in development.",
            "The child node itself is not preserved; ButtonGroupItems reads each child's props and children, then renders a fresh motion button for that slot.",
            "When showDividers is false, hover feedback moves as a shared spring layer between items and re-measures on resize.",
            "Uses data-slot=\"button-group-items\" so it can sit inside ButtonGroup without breaking connected layout rules."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Pass plain button-like elements as children. Their props and children are hoisted into the internal motion buttons rendered by the group."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer segmented wrapper for width or surface overrides."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Sets the shared height, padding, and typography of the grouped buttons."
            },
            {
              "name": "showDividers",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Removes the internal separator lines and the outer wrapper border when set to false, then switches the group to a smoother shared hover surface."
            },
            {
              "name": "disableRipple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Turns off the ripple for every internal button rendered by the group."
            }
          ]
        },
        {
          "id": "segmented-control",
          "title": "SegmentedControl",
          "summary": "Segmented selector with string or rich option objects, compact sizing, keyboard support, RTL-aware navigation, form name support, and a spring-driven selected indicator.",
          "notes": [
            "The control uses radiogroup semantics with arrow-key, Home, and End navigation.",
            "Arrow-left and arrow-right reverse automatically in RTL layouts.",
            "Disabled options are skipped while moving selection with the keyboard."
          ],
          "fields": [
            {
              "name": "options",
              "type": "Array<string | { value: string; label?: ReactNode; disabled?: boolean; icon?: ReactNode }>",
              "defaultValue": "",
              "required": true,
              "description": "Ordered list of segments. Each entry can be a plain string or an object with a stable value, optional label, icon, and disabled flag."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value. When provided, the internal state syncs to this prop through an effect."
            },
            {
              "name": "onChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the selected value whenever a segment is pressed or moved to with the keyboard."
            },
            {
              "name": "ariaLabel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the radiogroup. Provide this or ariaLabelledBy so screen readers can identify the control."
            },
            {
              "name": "ariaLabelledBy",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "ID of an external label element that names the radiogroup. Use when a visible label already exists in the page."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "When provided, renders a hidden input so the selected value can participate in native form submission."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the entire control and every segment inside it."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Layout direction for the segmented shell and the primary arrow-key axis."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the segmented wrapper for width, alignment, or spacing overrides."
            },
            {
              "name": "layoutId",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional Motion layout id for the selected indicator. When omitted, a unique id is generated per instance so multiple controls on one page do not share indicator motion."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Controls the overall density of the segmented control shell and each segment inside it."
            }
          ]
        },
        {
          "id": "button-group-motion",
          "title": "Motion and interaction",
          "summary": "Each export keeps the same tactile feel, but the default presentation is now much more compact and toolbar-like.",
          "notes": [
            "Button, IconButton, and ButtonGroupItems all default to muted text that darkens on hover, which better matches compact shadcn-style controls.",
            "ButtonGroup applies embedded theme tokens once at the group root so nested buttons do not repeat the full token block.",
            "The ButtonGroup wrapper uses the exported buttonGroupVariants CVA recipe, while existing motion-powered controls keep their ripple and shared-hover behavior.",
            "Ripple feedback can now be turned off per surface, which is useful when you want a quieter desktop toolbar feel.",
            "SegmentedControl keeps motion focused on selection changes rather than entrance effects, so the control feels faster and less oversized."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "class-variance-authority"
      ]
    },
    {
      "slug": "flux-button",
      "name": "Flux Button",
      "href": "/buttons-and-actions/flux-button",
      "url": "https://iconiqui.com/buttons-and-actions/flux-button",
      "installPackage": "@iconiq/flux-button",
      "installCommand": "npx shadcn@latest add @iconiq/flux-button",
      "registryPath": "flux-button.json",
      "registryUrl": "https://iconiqui.com/r/flux-button.json",
      "summary": "Async button with idle, loading, and success states, plus b-button visual variants.",
      "apiSections": [
        {
          "id": "flux-button",
          "title": "FluxButton",
          "summary": "Async button with idle, loading, and success states, plus b-button visual variants.",
          "notes": [
            "Built on `@base-ui/react/button` with a Motion render surface, matching the b-button integration pattern.",
            "Locks interaction while loading or showing success without applying disabled opacity, using aria-disabled and pointer-events-none instead.",
            "Motion transitions start only after the first click, so the button renders statically on page load.",
            "Install path is `components/ui/flux-button.tsx` with the `FluxButton` export."
          ],
          "fields": [
            {
              "name": "idleLabel",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Label shown before the action starts."
            },
            {
              "name": "loadingLabel",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Label shown with the built-in loader while onAction is in progress."
            },
            {
              "name": "successLabel",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Label shown after onAction resolves."
            },
            {
              "name": "successIcon",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional icon shown on success. Pass any node, such as a Lucide checkmark. Omit for text-only success."
            },
            {
              "name": "onAction",
              "type": "() => void | Promise<void>",
              "defaultValue": "",
              "required": true,
              "description": "Runs when the button is pressed, drives loading and success states, then returns to idle after successHold."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"outline\" | \"secondary\" | \"ghost\" | \"destructive\" | \"link\"",
              "defaultValue": "default",
              "required": false,
              "description": "Visual style variant. Matches the b-button variant set."
            },
            {
              "name": "successHold",
              "type": "number",
              "defaultValue": "1000",
              "required": false,
              "description": "Milliseconds to hold the success state before returning to the idle label."
            },
            {
              "name": "size",
              "type": "\"xs\" | \"sm\" | \"default\" | \"lg\"",
              "defaultValue": "default",
              "required": false,
              "description": "Height and horizontal padding preset. Matches b-button sizes."
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\"",
              "defaultValue": "button",
              "required": false,
              "description": "Native button type. Use submit inside forms; defaults to button so the control does not submit unless you opt in."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Native disabled state. Also blocks the action flow while true."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the root button element."
            },
            {
              "name": "onClick",
              "type": "React.MouseEventHandler<HTMLButtonElement>",
              "defaultValue": "",
              "required": false,
              "description": "Native click handler forwarded to the underlying button."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/button",
        "class-variance-authority",
        "lucide-react",
        "motion"
      ]
    },
    {
      "slug": "icon-bar",
      "name": "Icon Bar",
      "href": "/buttons-and-actions/icon-bar",
      "url": "https://iconiqui.com/buttons-and-actions/icon-bar",
      "installPackage": "@iconiq/icon-bar",
      "installCommand": "npx shadcn@latest add @iconiq/icon-bar",
      "registryPath": "icon-bar.json",
      "registryUrl": "https://iconiqui.com/r/icon-bar.json",
      "summary": "Horizontal toolbar of compact icon chips. Hover or focus previews labels; clicking selects one item and keeps it expanded.",
      "apiSections": [
        {
          "id": "icon-bar",
          "title": "IconBar",
          "summary": "Horizontal toolbar of compact icon chips. Hover or focus previews labels; clicking selects one item and keeps it expanded.",
          "notes": [],
          "fields": [
            {
              "name": "value",
              "type": "string | null",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected item value. Pair with onValueChange for fully controlled selection."
            },
            {
              "name": "defaultValue",
              "type": "string | null",
              "defaultValue": "",
              "required": false,
              "description": "Optional initial selected item when uncontrolled. Omit to start with every chip collapsed until the user clicks one."
            },
            {
              "name": "onValueChange",
              "type": "(value: string | null) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when selection changes. Receives null when the active chip is clicked again to deselect."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the outer flex container."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "One or more IconBarItem elements rendered in a single row with consistent spacing."
            }
          ]
        },
        {
          "id": "icon-bar-item",
          "title": "IconBarItem",
          "summary": "Individual pill chip with a Lucide icon and animated label reveal on hover, focus, or selection.",
          "notes": [
            "Only one item stays expanded at a time. Clicking a chip selects it; clicking another moves selection; clicking the active chip again collapses it.",
            "Hover and keyboard focus preview labels on non-selected chips. Give each item a unique value when labels repeat.",
            "In controlled mode, update value from onValueChange (including null on deselect) for the UI to stay in sync."
          ],
          "fields": [
            {
              "name": "icon",
              "type": "LucideIcon",
              "defaultValue": "",
              "required": true,
              "description": "Lucide icon component rendered inside the fixed 36px icon well."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Short text revealed when the chip expands. Keep labels concise so the width animation stays smooth."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Selection identity for this chip. Defaults to label when omitted."
            },
            {
              "name": "onClick",
              "type": "(event: React.MouseEvent<HTMLButtonElement>) => void",
              "defaultValue": "",
              "required": false,
              "description": "Optional click handler fired after selection updates."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables interaction, hover preview, and selection."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the chip button."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/toggle",
        "@base-ui/react/toggle-group",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "toggle",
      "name": "Toggle",
      "href": "/buttons-and-actions/toggle",
      "url": "https://iconiqui.com/buttons-and-actions/toggle",
      "installPackage": "@iconiq/toggle",
      "installCommand": "npx shadcn@latest add @iconiq/toggle",
      "registryPath": "toggle.json",
      "registryUrl": "https://iconiqui.com/r/toggle.json",
      "summary": "Two-state button with spring press feedback and a muted fill that bounces in when pressed.",
      "apiSections": [
        {
          "id": "toggle",
          "title": "Toggle",
          "summary": "Two-state button with spring press feedback and a muted fill that bounces in when pressed.",
          "notes": [
            "Use aria-label when the toggle contains only an icon. Visible text or icon-plus-label children do not need a separate aria-label.",
            "Off-state copy uses muted foreground; pressed state shifts to foreground for clearer toolbar contrast.",
            "Use className to adjust footprint for icon-only controls, such as fixed square dimensions in toolbars.",
            "Additional primitive props such as value, name, and form attributes are forwarded to the root button."
          ],
          "fields": [
            {
              "name": "pressed",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled pressed state. Pass this when the parent owns whether the toggle is on."
            },
            {
              "name": "defaultPressed",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Initial pressed state for uncontrolled usage. The component manages future toggles internally."
            },
            {
              "name": "onPressedChange",
              "type": "(pressed: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the next pressed state whenever the toggle is activated or deactivated."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"outline\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Visual treatment. Outline adds a border for toolbar or segmented layouts."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables interaction and dims the control while preserving its pressed appearance."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Icon, text label, or icon-plus-label content. Children sit in normal document flow so labels expand the control width naturally."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root button for local spacing, width, or color overrides."
            }
          ]
        },
        {
          "id": "toggle-motion",
          "title": "Motion and interaction behavior",
          "summary": "Pressed state drives a horizontal liquid wipe, a one-shot light sheen, and tactile icon motion.",
          "notes": [
            "The muted fill wipes in from the left when pressed and retracts to the right on release with a heavy spring.",
            "Each state change sends a diagonal sheen across the surface once. Outline keeps the same outer border in both states.",
            "Icons scale and squash on press with a spring settle."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "motion"
      ]
    },
    {
      "slug": "toggle-group",
      "name": "Toggle Group",
      "href": "/buttons-and-actions/toggle-group",
      "url": "https://iconiqui.com/buttons-and-actions/toggle-group",
      "installPackage": "@iconiq/toggle-group",
      "installCommand": "npx shadcn@latest add @iconiq/toggle-group",
      "registryPath": "toggle-group.json",
      "registryUrl": "https://iconiqui.com/r/toggle-group.json",
      "summary": "Root container for toggle buttons with shared variant, spacing, and orientation. Use spacing={0} for a connected segmented layout.",
      "apiSections": [
        {
          "id": "toggle-group",
          "title": "ToggleGroup",
          "summary": "Root container for toggle buttons with shared variant, spacing, and orientation. Use spacing={0} for a connected segmented layout.",
          "notes": [
            "Default spacing is 4px between items. Pass spacing={0} for a connected outline shell with one outer border and internal dividers between items.",
            "Each item uses the same fluid wipe fill, sheen sweep, and icon press feedback as the standalone Toggle component.",
            "Group items inherit variant from context but can override it locally. Use className on items to adjust footprint for icon-only controls.",
            "Radix installs use type; Base UI installs use multiple. Both default to multi-select."
          ],
          "fields": [
            {
              "name": "type",
              "type": "\"single\" | \"multiple\"",
              "defaultValue": "\"multiple\"",
              "required": false,
              "description": "Radix selection mode. Multiple allows several active items by default; single keeps one pressed item at a time."
            },
            {
              "name": "multiple",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Base UI selection mode. Pass multiple={false} for single selection; true keeps several active items."
            },
            {
              "name": "value",
              "type": "string | string[]",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selection. Radix uses a string in single mode and a string array in multiple mode. Base UI always uses a string array."
            },
            {
              "name": "defaultValue",
              "type": "string | string[]",
              "defaultValue": "",
              "required": false,
              "description": "Initial selection for uncontrolled usage. Match the selection mode and value shape for your installed primitive."
            },
            {
              "name": "onValueChange",
              "type": "(value: string | string[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the next selection whenever an item is pressed or released."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"outline\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Shared visual treatment applied to every item unless an item overrides it locally."
            },
            {
              "name": "spacing",
              "type": "number",
              "defaultValue": "1",
              "required": false,
              "description": "Gap between items in spacing units. Defaults to 1 (4px). Set to 0 for a connected outline shell with one outer border and internal dividers."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Layout direction for the group. Also sets aria-orientation and connected divider direction when spacing={0}."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables the entire group and all nested items."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the group. Required when items are icon-only and no visible group label is present."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root group wrapper for local layout or width overrides."
            }
          ]
        },
        {
          "id": "toggle-group-item",
          "title": "ToggleGroupItem",
          "summary": "Individual toggle button inside the group with the same fluid motion as the standalone toggle.",
          "notes": [
            "Items share the standalone toggle fluid motion system: liquid wipe fill, sheen sweep, and icon press squeeze.",
            "Supports aria-invalid styling for form validation parity with the standalone Toggle component."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable identifier used when reading or updating the group selection."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"outline\"",
              "defaultValue": "",
              "required": false,
              "description": "Optional local override for the shared group variant treatment."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables this item without affecting the rest of the group."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for icon-only items. Omit when the item already contains visible text."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the item button for local width, color, or spacing overrides."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Icon or label content rendered inside the item."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "motion"
      ]
    },
    {
      "slug": "avatar",
      "name": "Avatar",
      "href": "/display-and-content/avatar",
      "url": "https://iconiqui.com/display-and-content/avatar",
      "installPackage": "@iconiq/avatar",
      "installCommand": "npx shadcn@latest add @iconiq/avatar",
      "registryPath": "avatar.json",
      "registryUrl": "https://iconiqui.com/r/avatar.json",
      "summary": "Base UI avatar root with shared sizing and an optional tooltip for hover or focus status hints.",
      "apiSections": [
        {
          "id": "avatar",
          "title": "Avatar",
          "summary": "Base UI avatar root with shared sizing and an optional tooltip for hover or focus status hints.",
          "notes": [
            "The root renders data-slot=\"avatar\" and data-size so grouped stacks and badges can respond to the selected size.",
            "The root keeps a circular border overlay with dark/light blend handling and accepts the full Base UI Root props surface.",
            "Put tooltip on Avatar when the whole avatar should expose the status hint. Put tooltip on AvatarBadge when only the badge should be interactive."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Compose AvatarImage, AvatarFallback, and an optional AvatarBadge inside the root."
            },
            {
              "name": "size",
              "type": "\"default\" | \"sm\" | \"lg\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Controls the root size and drives badge/fallback sizing through data-size selectors."
            },
            {
              "name": "tooltip",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional short label shown in the Iconiq tooltip surface when the entire avatar is hovered or focused."
            },
            {
              "name": "tooltipSide",
              "type": "\"top\" | \"bottom\" | \"left\" | \"right\"",
              "defaultValue": "\"right\"",
              "required": false,
              "description": "Preferred side for the avatar tooltip bubble. The default collision order is right, left, top, then bottom."
            },
            {
              "name": "tooltipDelay",
              "type": "number",
              "defaultValue": "0.15",
              "required": false,
              "description": "Delay in seconds before the avatar tooltip opens."
            },
            {
              "name": "tooltipClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the tooltip bubble when the avatar tooltip is enabled."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional display name used by AvatarFallback to auto-generate initials when children are omitted."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Merge avatar props onto the child element via Radix Slot, useful for link or button triggers."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the avatar. Defaults to the tooltip string when tooltip is set."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the Base UI avatar root. Use it for local radius, ring, or size overrides."
            }
          ]
        },
        {
          "id": "avatar-image",
          "title": "AvatarImage",
          "summary": "Image slot for the compound avatar, backed by Base UI's image loading behavior.",
          "notes": [],
          "fields": [
            {
              "name": "src",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Image URL passed to the underlying Base UI image primitive."
            },
            {
              "name": "alt",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible text for the image. Pass an empty string only when the avatar is decorative."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the full-size rounded image classes."
            }
          ]
        },
        {
          "id": "avatar-fallback",
          "title": "AvatarFallback",
          "summary": "Fallback slot shown by Base UI while the image is loading, missing, or failed.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Initials, icon, or other compact fallback content centered inside the avatar."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the muted circular fallback classes."
            }
          ]
        },
        {
          "id": "avatar-badge",
          "title": "AvatarBadge",
          "summary": "Absolute status badge that scales with the root Avatar size. Use variant for preset presence colors or tooltip for badge-only status hints.",
          "notes": [],
          "fields": [
            {
              "name": "variant",
              "type": "\"online\" | \"offline\" | \"busy\" | \"away\"",
              "defaultValue": "\"online\"",
              "required": false,
              "description": "Preset status color mapped to theme-friendly green, muted, destructive, and amber tokens."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible status label. Defaults to the tooltip string or the variant label such as Online or Busy."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional icon or status mark. Icons scale down on small avatars instead of disappearing."
            },
            {
              "name": "tooltip",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional short label shown in the Iconiq tooltip surface when only the badge should be the trigger."
            },
            {
              "name": "tooltipSide",
              "type": "\"top\" | \"bottom\" | \"left\" | \"right\"",
              "defaultValue": "\"right\"",
              "required": false,
              "description": "Preferred side for the tooltip bubble. The default collision order is right, left, top, then bottom."
            },
            {
              "name": "tooltipDelay",
              "type": "number",
              "defaultValue": "0.15",
              "required": false,
              "description": "Delay in seconds before the tooltip opens."
            },
            {
              "name": "tooltipClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the tooltip bubble when the badge tooltip is enabled."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the green status badge background, foreground, and ring classes."
            }
          ]
        },
        {
          "id": "avatar-group",
          "title": "AvatarGroup",
          "summary": "Stack wrapper for overlapping avatars and matching overflow count chips.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Avatar and AvatarGroupCount children rendered in an overlapping row."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the negative-space group classes and child avatar rings."
            }
          ]
        },
        {
          "id": "avatar-group-count",
          "title": "AvatarGroupCount",
          "summary": "Overflow count part that follows the largest avatar size used in the group.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Count label or icon shown after the visible avatars."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the muted circular count chip classes."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "@radix-ui/react-slot",
        "motion"
      ]
    },
    {
      "slug": "badge",
      "name": "Badge",
      "href": "/display-and-content/badge",
      "url": "https://iconiqui.com/display-and-content/badge",
      "installPackage": "@iconiq/badge",
      "installCommand": "npx shadcn@latest add @iconiq/badge",
      "registryPath": "badge.json",
      "registryUrl": "https://iconiqui.com/r/badge.json",
      "summary": "Compact label pill with tinted fills, a shimmer-enabled default variant, a quieter dot variant, semantic color aliases, and optional icon or dismiss controls.",
      "apiSections": [
        {
          "id": "badge",
          "title": "Badge",
          "summary": "Compact label pill with tinted fills, a shimmer-enabled default variant, a quieter dot variant, semantic color aliases, and optional icon or dismiss controls.",
          "notes": [
            "The root renders `data-slot=\"badge\"` and spreads remaining span props, so ids, data attributes, and click handlers can be attached directly.",
            "Interactive badges with `onClick` receive `role=\"button\"`, `tabIndex={0}`, and Enter/Space keyboard activation. The dismiss button is a separate focusable control.",
            "When `asChild` is true, badge styles merge onto the single child element without shimmer, dot, icon, or dismiss layers.",
            "`icon` and `onDismiss` are mutually exclusive on the default variant.",
            "Use Badge for inline labels and chips. Use Status Dot for deployment-style ripple states. Use AvatarBadge for avatar presence dots.",
            "Install path is `components/ui/badge.tsx` with named and default `Badge` exports. Requires `@/lib/utils` (`cn`)."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Badge content rendered above the optional shimmer layer so labels stay readable while the default variant animates."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "\"\"",
              "required": false,
              "description": "Appended directly to the root badge element. Useful for radius, spacing, or local border overrides."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"dot\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Chooses between the animated filled badge and the quieter outlined badge with a leading status dot."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Controls height, horizontal padding, gap, and label size for denser or roomier badge treatments."
            },
            {
              "name": "color",
              "type": "BadgeColorProp",
              "defaultValue": "\"gray\"",
              "required": false,
              "description": "Picks a preset palette token or semantic alias (`success`, `warning`, `error`, `info`). Each token sets matched background and foreground tones for light and dark mode."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional leading icon rendered before the label on the default variant only. Ignored when `variant=\"dot\"` or when `onDismiss` is provided."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "When provided on the default variant, renders a dismiss button after the label for removable filter chips. Ignored when `variant=\"dot\"` or when `icon` is provided."
            },
            {
              "name": "dismissLabel",
              "type": "string",
              "defaultValue": "\"Remove\"",
              "required": false,
              "description": "Accessible label for the dismiss button when `onDismiss` is enabled."
            },
            {
              "name": "animate",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls the default variant mount fade/scale entrance and the dot variant status pulse. Use with `shimmer={false}` on the default variant when you want a one-time entrance without the looping sweep. Automatically disabled when `prefers-reduced-motion` is set."
            },
            {
              "name": "shimmer",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls the default variant shimmer sweep independently of the mount entrance. Automatically disabled when `prefers-reduced-motion` is set."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Merges badge styles onto the child element, such as an anchor, via Radix Slot."
            },
            {
              "name": "waveColor",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional shimmer midpoint override for the default variant. When omitted, the sweep derives a subtle tone from the current text color."
            }
          ]
        },
        {
          "id": "badge-variants",
          "title": "badgeVariants",
          "summary": "CVA recipe exported alongside Badge for reusing badge layout, color tokens, and interactive focus styles on custom elements.",
          "notes": [],
          "fields": [
            {
              "name": "variant",
              "type": "\"default\" | \"dot\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Chooses between the filled badge and dot badge recipes."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Controls height, padding, gap, and label size."
            },
            {
              "name": "color",
              "type": "BadgeColor",
              "defaultValue": "",
              "required": false,
              "description": "Resolved palette token passed to `getBadgeColorVariables()` when reusing badge color tokens outside the component."
            },
            {
              "name": "interactive",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Adds pointer cursor and focus ring styles for clickable badge roots."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional classes merged after the generated recipe classes."
            }
          ]
        },
        {
          "id": "badge-colors",
          "title": "badgeColors",
          "summary": "Preset color hex map used by Badge tone generation for palette-consistent fills and dot treatments.",
          "notes": [
            "Use the exported `BadgeColor`, `BadgeSemanticColor`, and `BadgeColorProp` types for compile-time checks.",
            "`badgeSemanticColors` maps `success`, `warning`, `error`, and `info` to palette tokens. Prefer the semantic names in UI pickers instead of their duplicate palette entries (`green`, `amber`, `red`, `blue`).",
            "`getBadgePlaygroundColorOptions()` filters palette colors that already have a semantic alias.",
            "`resolveBadgeColor()` normalizes semantic aliases before styling.",
            "`getBadgeColorVariables()` sets `--badge-bg`, `--badge-fg`, `--badge-dot`, and `--badge-border` inline so palette tones apply reliably in light and dark mode."
          ],
          "fields": [
            {
              "name": "keys",
              "type": "BadgeColor",
              "defaultValue": "",
              "required": false,
              "description": "Named palette tokens such as gray, blue, green, amber, red, and purple."
            }
          ]
        },
        {
          "id": "badge-visuals",
          "title": "Visual behavior",
          "summary": "The default variant keeps the spring-in shimmer treatment, while the dot variant adds a subtle status pulse. Motion respects reduced-motion preferences.",
          "notes": [
            "The default badge fades and scales from 0.95 to 1 on mount over 0.3 seconds when `animate` is true.",
            "Its shimmer travels from left to right over 2 seconds, waits 1.5 seconds, then repeats indefinitely when `shimmer` is true.",
            "The dot variant omits the shimmer layer, sizes its leading status dot to match the chosen badge size, and gives it a gentle repeating blink.",
            "All entrance, shimmer, and dot pulse animations are skipped when `prefers-reduced-motion` is enabled."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion",
        "class-variance-authority",
        "@radix-ui/react-slot"
      ]
    },
    {
      "slug": "calendar",
      "name": "Calendar",
      "href": "/display-and-content/calendar",
      "url": "https://iconiqui.com/display-and-content/calendar",
      "installPackage": "@iconiq/calendar",
      "installCommand": "npx shadcn@latest add @iconiq/calendar",
      "registryPath": "calendar.json",
      "registryUrl": "https://iconiqui.com/r/calendar.json",
      "summary": "Animated monthly calendar with single-day or range selection, bounds, modifiers, locale-aware labels, and direct month/year picking.",
      "apiSections": [
        {
          "id": "calendar",
          "title": "Calendar",
          "summary": "Animated monthly calendar with single-day or range selection, bounds, modifiers, locale-aware labels, and direct month/year picking.",
          "notes": [
            "Controlled mode: pass selected/month or range/month and respond to the matching change handlers.",
            "Uncontrolled mode: omit the controlled value props and optionally seed with defaultSelected, defaultRange, or defaultMonth.",
            "Pair with the date-picker registry entry when you need a collapsible trigger instead of an always-visible grid.",
            "Pass stable disabled and modifiers callbacks in production to avoid unnecessary focus resets."
          ],
          "fields": [
            {
              "name": "mode",
              "type": "\"single\" | \"range\"",
              "defaultValue": "\"single\"",
              "required": false,
              "description": "Selection model. Use single for one date or range for start/end selection."
            },
            {
              "name": "selected",
              "type": "Date | null",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected day for single mode. Pass null to clear the highlight."
            },
            {
              "name": "defaultSelected",
              "type": "Date | null",
              "defaultValue": "",
              "required": false,
              "description": "Initial selected day for uncontrolled single mode when selected is not provided."
            },
            {
              "name": "onSelect",
              "type": "(date: Date | null) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the user picks a day in single mode, including visible outside-month days."
            },
            {
              "name": "range",
              "type": "CalendarRange",
              "defaultValue": "",
              "required": false,
              "description": "Controlled range for range mode. Shape is `{ from?: Date; to?: Date }`."
            },
            {
              "name": "defaultRange",
              "type": "CalendarRange",
              "defaultValue": "",
              "required": false,
              "description": "Initial range for uncontrolled range mode."
            },
            {
              "name": "onRangeSelect",
              "type": "(range: CalendarRange) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the user updates the range in range mode."
            },
            {
              "name": "month",
              "type": "Date",
              "defaultValue": "",
              "required": false,
              "description": "Controlled visible month. Prev/next, outside-day, and month/year picker navigation requests flow through onMonthChange."
            },
            {
              "name": "defaultMonth",
              "type": "Date",
              "defaultValue": "",
              "required": false,
              "description": "Initial visible month for uncontrolled usage when month is not provided."
            },
            {
              "name": "onMonthChange",
              "type": "(month: Date) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the user navigates with prev/next, an outside day, or the month/year picker."
            },
            {
              "name": "disabled",
              "type": "(date: Date) => boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks dates as non-interactive in addition to minDate/maxDate bounds."
            },
            {
              "name": "minDate",
              "type": "Date",
              "defaultValue": "",
              "required": false,
              "description": "Earliest selectable day. Also disables month navigation into fully out-of-range months."
            },
            {
              "name": "maxDate",
              "type": "Date",
              "defaultValue": "",
              "required": false,
              "description": "Latest selectable day. Also disables month navigation into fully out-of-range months."
            },
            {
              "name": "locale",
              "type": "Locale",
              "defaultValue": "",
              "required": false,
              "description": "Optional date-fns locale used for month labels, weekday headers, and spoken date labels."
            },
            {
              "name": "labels",
              "type": "Partial<CalendarLabels>",
              "defaultValue": "",
              "required": false,
              "description": "Override built-in English UI and accessibility strings such as Today, Clear, and picker labels."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "",
              "required": false,
              "description": "Controls the overall calendar scale, including the card width, spacing, nav controls, weekday row, and day cell sizing. Defaults to sm."
            },
            {
              "name": "weekStartsOn",
              "type": "0 | 1 | 2 | 3 | 4 | 5 | 6",
              "defaultValue": "",
              "required": false,
              "description": "Overrides the first day of the week for both the weekday header and rendered month grid."
            },
            {
              "name": "minYear",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Optional lower bound for selectable years in the year picker."
            },
            {
              "name": "maxYear",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Optional upper bound for selectable years in the year picker."
            },
            {
              "name": "showOutsideDays",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Whether leading and trailing days from adjacent months are rendered in the grid."
            },
            {
              "name": "fixedWeeks",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Pads the month grid to six weeks for consistent height. Only applies when showOutsideDays is true."
            },
            {
              "name": "modifiers",
              "type": "Record<string, (date: Date) => boolean>",
              "defaultValue": "",
              "required": false,
              "description": "Named matchers that render marker dots under matching days."
            },
            {
              "name": "modifierLabels",
              "type": "Record<string, string>",
              "defaultValue": "",
              "required": false,
              "description": "Human-readable names for modifier keys, appended to spoken day labels."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional root id used for heading and live-region relationships."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional native form field name. Renders a hidden input in single mode."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the root surface."
            }
          ]
        },
        {
          "id": "calendar-grid",
          "title": "Date math and layout behavior",
          "summary": "The grid is rebuilt with date-fns whenever the visible month changes.",
          "notes": [
            "The rendered range runs from startOfWeek(startOfMonth(currentMonth)) through endOfWeek(endOfMonth(currentMonth)). fixedWeeks pads the grid to six rows only when showOutsideDays is enabled.",
            "Days outside the active month remain visible by default and can still be selected. Choosing one switches the visible month and selects that day, unless the date is unavailable.",
            "Weekday headers and the grid start day follow the provided locale and weekStartsOn settings.",
            "Selected days are highlighted even when they appear as outside-month cells in the current grid."
          ],
          "fields": []
        },
        {
          "id": "calendar-motion-a11y",
          "title": "Motion and accessibility",
          "summary": "Motion, keyboard support, and screen-reader semantics are built into the grid and picker overlays.",
          "notes": [
            "The root uses role=application with a role=grid date table, aria-selected day buttons, and a polite live selection summary.",
            "Keyboard users can move through days with arrow keys, Home/End, PageUp/PageDown, and select with Enter or Space.",
            "Month and year overlays trap focus, support arrow-key grid navigation, and return focus to the trigger on Escape.",
            "Theme colors come from CSS variables, so the surface follows light/dark mode without client-side palette hydration.",
            "Animations respect prefers-reduced-motion through useReducedMotion()."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion",
        "lucide-react",
        "date-fns"
      ]
    },
    {
      "slug": "card",
      "name": "Card",
      "href": "/display-and-content/card",
      "url": "https://iconiqui.com/display-and-content/card",
      "installPackage": "@iconiq/card",
      "installCommand": "npx shadcn@latest add @iconiq/card",
      "registryPath": "card.json",
      "registryUrl": "https://iconiqui.com/r/card.json",
      "summary": "Compound card surface with slot-based sections, optional interactive lift, and layout-aware motion between content states.",
      "apiSections": [
        {
          "id": "card",
          "title": "Card",
          "summary": "Compound card surface with slot-based sections, optional interactive lift, and layout-aware motion between content states.",
          "notes": [
            "The root forwards standard div props, so you can attach ids, aria attributes, data attributes, and event handlers directly.",
            "Cards with a direct leading image automatically remove top padding and inherit the root radius on the first and last image edges.",
            "Footer-aware padding is handled by the card itself, so adding CardFooter trims the bottom padding without extra wrapper logic.",
            "For whole-card navigation, prefer asChild with a single anchor or button child instead of nesting interactive controls inside a second clickable wrapper.",
            "Keep nested buttons or links inside a non-wrapped card shell to avoid invalid interactive nesting."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose CardHeader, CardContent, CardFooter, media, or custom blocks inside the shared card shell."
            },
            {
              "name": "interactive",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Enables the restrained hover lift and stronger surface response intended for clickable or focusable cards."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Merges the card surface classes and interaction handlers onto the single child element, which is useful for link or button cards."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root card surface for local spacing, border, or layout adjustments without replacing the slot API."
            },
            {
              "name": "onHoverStart",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when interactive hover feedback begins from pointer, focus, or keyboard focus within the card."
            },
            {
              "name": "onHoverEnd",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when interactive hover feedback ends after pointer leave and focus exits the card."
            }
          ]
        },
        {
          "id": "card-header",
          "title": "CardHeader",
          "summary": "Top header grid for title, description, and an optional trailing CardAction.",
          "notes": [
            "The header uses a compact grid so status pills and actions align naturally without extra wrappers."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose CardTitle, CardDescription, and optional CardAction inside the header grid."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the header grid wrapper."
            }
          ]
        },
        {
          "id": "card-title",
          "title": "CardTitle",
          "summary": "Primary heading slot with default title typography.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Heading content for the card. Works with links, badges, metrics, or richer inline content."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default title typography classes."
            },
            {
              "name": "as",
              "type": "\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"div\" | \"span\"",
              "defaultValue": "\"h3\"",
              "required": false,
              "description": "Semantic heading element used for the title. Defaults to h3 for accessible card headings."
            }
          ]
        },
        {
          "id": "card-description",
          "title": "CardDescription",
          "summary": "Secondary supporting copy beneath the title.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Supporting description or excerpt text rendered with muted body styling."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the muted description typography classes."
            },
            {
              "name": "as",
              "type": "\"p\" | \"div\" | \"span\"",
              "defaultValue": "\"p\"",
              "required": false,
              "description": "Semantic text element used for the description. Defaults to p for accessible supporting copy."
            }
          ]
        },
        {
          "id": "card-action",
          "title": "CardAction",
          "summary": "Optional trailing action slot aligned to the top-right of CardHeader.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Action content such as a menu trigger, status pill, or compact control."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default action placement classes."
            }
          ]
        },
        {
          "id": "card-content",
          "title": "CardContent",
          "summary": "Flexible middle section for body copy, media, stats, and custom layouts.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Main card body content rendered inside the padded content slot."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default horizontal padding classes."
            }
          ]
        },
        {
          "id": "card-footer",
          "title": "CardFooter",
          "summary": "Bottom section for supporting actions, metadata, or contextual labels.",
          "notes": [
            "Adding CardFooter trims the root card bottom padding automatically."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Footer content rendered on a quieter separated surface beneath the body."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default footer surface and spacing classes."
            }
          ]
        },
        {
          "id": "card-image",
          "title": "CardImage",
          "summary": "Next.js Image slot with the shared inset media frame, default fill sizing, and card-aware radius handling. Always renders next/image.",
          "notes": [
            "CardImage always renders next/image and requires a Next.js app.",
            "Use CardMedia instead for video, charts, embeds, or other non-image leading media.",
            "Fill images default to a 16:10 aspect ratio unless you override it with className."
          ],
          "fields": [
            {
              "name": "alt",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible alternative text for the image."
            },
            {
              "name": "src",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Image source passed through to next/image."
            },
            {
              "name": "inset",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, wraps the image in the padded card media frame. Set false for edge-to-edge media."
            },
            {
              "name": "fill",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Uses fill layout when true. Defaults to fill when width and height are both omitted."
            },
            {
              "name": "sizes",
              "type": "string",
              "defaultValue": "\"(max-width: 768px) 100vw, 400px\"",
              "required": false,
              "description": "Responsive sizes hint forwarded to next/image for better loading performance."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered image element."
            }
          ]
        },
        {
          "id": "card-media",
          "title": "CardMedia",
          "summary": "Media slot for video, charts, embeds, or other custom leading media blocks.",
          "notes": [
            "Use CardImage for static card artwork and photos.",
            "Both CardImage and CardMedia use the card-image slot so the root card can trim top padding automatically."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Non-image media content such as video, a chart container, or an embed."
            },
            {
              "name": "inset",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, wraps children in the padded card media frame. Set false for edge-to-edge media."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer media wrapper."
            }
          ]
        },
        {
          "id": "card-clickable",
          "title": "Clickable card recipes",
          "summary": "Patterns for whole-card navigation and cards that contain separate interactive controls.",
          "notes": [
            "Whole-card link: <Card asChild interactive><a href=\"/post\">...</a></Card>.",
            "Whole-card button: <Card asChild interactive><button type=\"button\">...</button></Card>.",
            "Card with its own CTA: keep Card unwrapped and place buttons or links inside CardContent or CardFooter.",
            "Do not wrap a card that already contains buttons or links in another anchor or button via asChild."
          ],
          "fields": []
        },
        {
          "id": "card-motion",
          "title": "Motion and interaction model",
          "summary": "Layout changes are animated through Motion so expanding or swapping card content feels fluid rather than abrupt.",
          "notes": [
            "When interactive is enabled, hover drives a spring-smoothed motion value so lift, scale, and shadow ease in and out as one fluid surface; compound slots only animate layout when content changes.",
            "interactive only changes the visible surface response: border, shadow, and a very small hover lift. The component does not add button semantics on its own.",
            "prefers-reduced-motion disables spring hover and layout transitions. Interactive cards still get border and surface feedback through CSS.",
            "asChild cards use CSS-based hover lift instead of spring transforms so the merged anchor or button remains the interactive root. Lift is also skipped when prefers-reduced-motion is enabled."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion",
        "@radix-ui/react-slot"
      ]
    },
    {
      "slug": "carousel",
      "name": "Carousel",
      "href": "/display-and-content/carousel",
      "url": "https://iconiqui.com/display-and-content/carousel",
      "installPackage": "@iconiq/carousel",
      "installCommand": "npx shadcn@latest add @iconiq/carousel",
      "registryPath": "carousel.json",
      "registryUrl": "https://iconiqui.com/r/carousel.json",
      "summary": "Root carousel region wired to Embla. Exposes scroll state through `useCarousel`, supports responsive nav placement, optional autoplay, and keyboard navigation for horizontal and vertical layouts.",
      "apiSections": [
        {
          "id": "carousel",
          "title": "Carousel",
          "summary": "Root carousel region wired to Embla. Exposes scroll state through `useCarousel`, supports responsive nav placement, optional autoplay, and keyboard navigation for horizontal and vertical layouts.",
          "notes": [
            "Install path is `components/ui/carousel.tsx`. Exports include `Carousel`, `CarouselContent`, `CarouselItem`, `CarouselPrevious`, `CarouselNext`, `useCarousel`, `CarouselApi`, `CarouselOptions`, and `CarouselPlugin`.",
            "Navigation controls are self-contained icon buttons — no separate button registry item is required.",
            "The root region is focusable (`tabIndex={0}`) and announces the active slide through an `aria-live` region.",
            "Custom aspect ratios are applied with inline `aspect-ratio` styles so Tailwind does not need safelisted arbitrary classes.",
            "With `navPlacement=\"outside\"` or `\"responsive\"` at `sm+`, add horizontal padding to the carousel wrapper so controls stay visible."
          ],
          "fields": [
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "horizontal",
              "required": false,
              "description": "Sets the Embla scroll axis and the spacing applied between slides."
            },
            {
              "name": "aspectRatio",
              "type": "\"square\" | \"video\" | \"4/3\" | \"3/2\" | \"portrait\" | string",
              "defaultValue": "video",
              "required": false,
              "description": "Sets the slide viewport shape on `CarouselContent`. Use presets like `video` (16:9) and `square`, or pass a custom ratio string such as `21/9`."
            },
            {
              "name": "navPlacement",
              "type": "\"outside\" | \"responsive\"",
              "defaultValue": "responsive",
              "required": false,
              "description": "Positions previous and next controls. `responsive` places controls below the carousel on the right on mobile and outside the track from `sm` upward."
            },
            {
              "name": "autoplay",
              "type": "boolean | number",
              "defaultValue": "",
              "required": false,
              "description": "When enabled, advances slides on a timer. Pass a number for the delay in milliseconds. Pair with `opts={{ loop: true }}` for continuous playback."
            },
            {
              "name": "opts",
              "type": "CarouselOptions",
              "defaultValue": "",
              "required": false,
              "description": "Forwarded Embla options such as `align`, `loop`, or `slidesToScroll`. The root merges `axis` from `orientation`."
            },
            {
              "name": "plugins",
              "type": "CarouselPlugin",
              "defaultValue": "",
              "required": false,
              "description": "Optional Embla plugins passed to `useEmblaCarousel`, such as `embla-carousel-autoplay`."
            },
            {
              "name": "setApi",
              "type": "(api: CarouselApi) => void",
              "defaultValue": "",
              "required": false,
              "description": "Optional callback that receives the Embla API instance after mount for external index or dot indicators."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "Carousel",
              "required": false,
              "description": "Accessible label for the root `role=\"region\"` carousel wrapper."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the root `role=\"region\"` wrapper."
            }
          ]
        },
        {
          "id": "carousel-content",
          "title": "CarouselContent",
          "summary": "Overflow-hidden viewport that hosts the Embla ref and the flex track of slides.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the inner flex container that holds slides."
            }
          ]
        },
        {
          "id": "carousel-item",
          "title": "CarouselItem",
          "summary": "Single slide wrapper sized to `basis-full` with directional padding between siblings. Inactive slides are marked `aria-hidden`.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto each slide group."
            }
          ]
        },
        {
          "id": "carousel-navigation",
          "title": "CarouselPrevious / CarouselNext",
          "summary": "Self-contained icon buttons that call `scrollPrev` and `scrollNext` and disable when Embla cannot scroll further.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the control for local offsets or sizing."
            }
          ]
        },
        {
          "id": "use-carousel",
          "title": "useCarousel",
          "summary": "Hook for custom indicators or synced UI. Must be used inside `Carousel`.",
          "notes": [],
          "fields": [
            {
              "name": "selectedIndex",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Zero-based index of the active scroll snap."
            },
            {
              "name": "scrollSnapCount",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Total number of scroll snaps reported by Embla."
            },
            {
              "name": "scrollTo",
              "type": "(index: number) => void",
              "defaultValue": "",
              "required": false,
              "description": "Scrolls directly to the requested snap index."
            },
            {
              "name": "scrollPrev / scrollNext",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Moves to the previous or next snap."
            },
            {
              "name": "api",
              "type": "CarouselApi",
              "defaultValue": "",
              "required": false,
              "description": "Underlying Embla API instance when you need lower-level control."
            }
          ]
        }
      ],
      "dependencies": [
        "embla-carousel-react",
        "lucide-react"
      ]
    },
    {
      "slug": "charts",
      "name": "Charts",
      "href": "/display-and-content/charts",
      "url": "https://iconiqui.com/display-and-content/charts",
      "installPackage": "@iconiq/charts",
      "installCommand": "npx shadcn@latest add @iconiq/charts",
      "registryPath": "charts.json",
      "registryUrl": "https://iconiqui.com/r/charts.json",
      "summary": "Theme-aware Recharts shell that maps ChartConfig tokens to CSS variables, applies registry chart colors, and fades the surface in on mount.",
      "apiSections": [
        {
          "id": "chart-container",
          "title": "ChartContainer",
          "summary": "Theme-aware Recharts shell that maps ChartConfig tokens to CSS variables, applies registry chart colors, and fades the surface in on mount.",
          "notes": [
            "ChartContainer ships its own local --chart-1 through --chart-5 defaults, so chart installs do not need a shared theme helper.",
            "Pair ChartContainer with Recharts primitives and ChartTooltip / ChartLegend helpers rather than Radix UI or Base UI wrappers.",
            "Set accessibilityLayer on Recharts cartesian charts to improve keyboard and screen-reader support."
          ],
          "fields": [
            {
              "name": "config",
              "type": "ChartConfig",
              "defaultValue": "",
              "required": true,
              "description": "Series labels, optional icons, and colors. Use var(--chart-1) style tokens or per-key theme overrides; scoped --color-{key} variables are generated for this chart instance."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Recharts chart markup, usually a BarChart, LineChart, AreaChart, PieChart, RadarChart, or RadialBarChart rendered inside ResponsiveContainer."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional stable id for the generated data-chart attribute and scoped CSS variables."
            },
            {
              "name": "seriesCount",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Overrides inferred series count for animation timing when ChartConfig keys do not match plotted series."
            },
            {
              "name": "initialDimension",
              "type": "{ width: number; height: number }",
              "defaultValue": "",
              "required": false,
              "description": "Optional fallback size for ResponsiveContainer before the first measure. By default the chart fills its parent with a debounced resize handler."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the chart shell alongside the chart component's local theme tokens."
            }
          ]
        },
        {
          "id": "chart-bar",
          "title": "ChartBar",
          "summary": "Thin Recharts Bar wrapper with restrained ease-out growth timing tuned for the Iconiq motion profile.",
          "notes": [
            "Use fill=\"var(--color-desktop)\" (or your config key) so bars pick up ChartConfig colors.",
            "Series growth runs once on first paint; resize uses a debounced container and skips repeat animations so narrowing the viewport stays stable."
          ],
          "fields": [
            {
              "name": "seriesIndex",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Offsets bar growth start time for multi-series charts so each series eases in with a short stagger."
            },
            {
              "name": "...props",
              "type": "Recharts Bar props",
              "defaultValue": "",
              "required": false,
              "description": "Forwards the full Bar API. animationDuration (~480ms), ease-out easing, and isAnimationActive inherit calm defaults unless you override them."
            }
          ]
        },
        {
          "id": "chart-line",
          "title": "ChartLine",
          "summary": "Recharts Line wrapper that shares the same ease-out timing and stagger defaults as ChartBar.",
          "notes": [],
          "fields": [
            {
              "name": "seriesIndex",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Offsets line draw start time for multi-series charts so each stroke eases in with a short stagger."
            },
            {
              "name": "...props",
              "type": "Recharts Line props",
              "defaultValue": "",
              "required": false,
              "description": "Forwards the full Line API. animationDuration, easing, and isAnimationActive inherit calm defaults unless you override them."
            }
          ]
        },
        {
          "id": "chart-area",
          "title": "ChartArea",
          "summary": "Recharts Area wrapper that shares the same ease-out timing and stagger defaults as ChartBar.",
          "notes": [],
          "fields": [
            {
              "name": "seriesIndex",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Offsets area reveal start time for multi-series charts so each fill eases in with a short stagger."
            },
            {
              "name": "...props",
              "type": "Recharts Area props",
              "defaultValue": "",
              "required": false,
              "description": "Forwards the full Area API. animationDuration, easing, and isAnimationActive inherit calm defaults unless you override them."
            }
          ]
        },
        {
          "id": "chart-tooltip",
          "title": "ChartTooltip",
          "summary": "Recharts tooltip primitive that defaults to ChartTooltipContent when content is omitted.",
          "notes": [],
          "fields": [
            {
              "name": "content",
              "type": "ReactNode | ComponentType",
              "defaultValue": "",
              "required": false,
              "description": "Tooltip renderer. Defaults to ChartTooltipContent when omitted."
            },
            {
              "name": "cursor",
              "type": "boolean | object",
              "defaultValue": "",
              "required": false,
              "description": "Recharts cursor configuration for hover feedback."
            }
          ]
        },
        {
          "id": "chart-tooltip-content",
          "title": "ChartTooltipContent",
          "summary": "Styled tooltip content shell with a calm fade entrance and dashed, dot, or line indicators.",
          "notes": [],
          "fields": [
            {
              "name": "indicator",
              "type": "\"dot\" | \"line\" | \"dashed\"",
              "defaultValue": "\"dot\"",
              "required": false,
              "description": "Marker style rendered beside each tooltip row."
            },
            {
              "name": "hideLabel",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Suppresses the formatted label block above the value rows."
            },
            {
              "name": "hideIndicator",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Hides the color marker when you only want text values."
            },
            {
              "name": "nameKey",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Payload key used to resolve ChartConfig labels and colors for each tooltip row."
            },
            {
              "name": "labelKey",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Payload key used to resolve the tooltip label row from ChartConfig."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional label key override when you want the tooltip header to read from ChartConfig directly."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the tooltip label row."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the tooltip shell."
            },
            {
              "name": "color",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional shared indicator color override for every tooltip row."
            },
            {
              "name": "labelFormatter",
              "type": "(value, payload) => ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Custom formatter for the tooltip label row."
            },
            {
              "name": "formatter",
              "type": "Recharts formatter",
              "defaultValue": "",
              "required": false,
              "description": "Optional per-row formatter; when omitted, the default label and value layout is used."
            }
          ]
        },
        {
          "id": "chart-legend",
          "title": "ChartLegend",
          "summary": "Recharts legend primitive that defaults to ChartLegendContent when content is omitted.",
          "notes": [],
          "fields": [
            {
              "name": "content",
              "type": "ReactNode | ComponentType",
              "defaultValue": "",
              "required": false,
              "description": "Legend renderer. Defaults to ChartLegendContent when omitted."
            },
            {
              "name": "verticalAlign",
              "type": "\"top\" | \"bottom\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Adjusts legend spacing relative to the chart."
            }
          ]
        },
        {
          "id": "chart-legend-content",
          "title": "ChartLegendContent",
          "summary": "Legend content shell with a quiet fade-and-rise entrance that matches the chart surface motion.",
          "notes": [],
          "fields": [
            {
              "name": "hideIcon",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Hides config icons and falls back to the color swatch derived from the series color."
            },
            {
              "name": "nameKey",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Payload key used to resolve ChartConfig labels and swatch colors for each legend row."
            },
            {
              "name": "verticalAlign",
              "type": "\"top\" | \"bottom\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Adjusts legend spacing relative to the chart."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the legend shell."
            }
          ]
        },
        {
          "id": "chart-empty-state",
          "title": "ChartEmptyState",
          "summary": "Centered empty placeholder for charts with no data yet or while a dataset is loading.",
          "notes": [
            "Render ChartEmptyState inside ChartContainer when your query returns zero rows or while async data is still loading."
          ],
          "fields": [
            {
              "name": "label",
              "type": "ReactNode",
              "defaultValue": "\"No data available\"",
              "required": false,
              "description": "Primary empty-state message."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional supporting copy beneath the label."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the empty-state shell."
            }
          ]
        },
        {
          "id": "use-chart",
          "title": "useChart",
          "summary": "Reads ChartContainer context, including ChartConfig and whether the initial series animation is still active.",
          "notes": [
            "Use this hook inside custom tooltip, legend, or annotation content rendered within ChartContainer."
          ],
          "fields": [
            {
              "name": "config",
              "type": "ChartConfig",
              "defaultValue": "",
              "required": false,
              "description": "The ChartConfig passed to ChartContainer."
            },
            {
              "name": "chartAnimationActive",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "True during the first ease-out series animation window, then false after resize-safe timing completes."
            }
          ]
        }
      ],
      "dependencies": [
        "recharts",
        "motion"
      ]
    },
    {
      "slug": "date-picker",
      "name": "Date Picker",
      "href": "/display-and-content/date-picker",
      "url": "https://iconiqui.com/display-and-content/date-picker",
      "installPackage": "@iconiq/date-picker",
      "installCommand": "npx shadcn@latest add @iconiq/date-picker",
      "registryPath": "date-picker.json",
      "registryUrl": "https://iconiqui.com/r/date-picker.json",
      "summary": "Collapsible date field with a read-only Base UI input trigger and a portaled Iconiq Calendar panel.",
      "apiSections": [
        {
          "id": "date-picker",
          "title": "DatePicker",
          "summary": "Collapsible date field with a read-only Base UI input trigger and a portaled Iconiq Calendar panel.",
          "notes": [
            "Also exported as `AnimatedDatePicker` for backwards compatibility.",
            "The trigger formats the selected date with `dateFormat` and toggles the portaled panel open and closed.",
            "Choosing a date closes the panel by default while keeping the visible month aligned with the selected value.",
            "Click outside or press Escape to close the panel. Focus returns to the trigger and the embedded Calendar stays mounted after the first open to avoid repeat entrance motion.",
            "Install the `calendar` registry entry alongside `date-picker` so `@/components/ui/calendar` resolves in consumer apps."
          ],
          "fields": [
            {
              "name": "value",
              "type": "Date | null",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected date. When provided, the trigger and embedded Calendar both reflect this value."
            },
            {
              "name": "defaultValue",
              "type": "Date | null",
              "defaultValue": "null",
              "required": false,
              "description": "Initial selected date for uncontrolled usage when `value` is omitted."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "Select a date",
              "required": false,
              "description": "Copy shown in the trigger when no date is selected."
            },
            {
              "name": "onChange",
              "type": "(date: Date | null) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the user picks or clears a date from the embedded Calendar or clear control."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the outer wrapper."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Whether the Calendar panel starts expanded on first render."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state for the Calendar panel. Pair with `onOpenChange`."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the panel opens or closes from the trigger, selection, Escape, or outside click."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the trigger and prevents the panel from opening."
            },
            {
              "name": "clearable",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows a clear button when a date is selected so users can reset to `null`."
            },
            {
              "name": "closeOnSelect",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Whether picking a date closes the panel automatically."
            },
            {
              "name": "dateFormat",
              "type": "string",
              "defaultValue": "EEE, MMM d, yyyy",
              "required": false,
              "description": "date-fns format string for the trigger label. Uses `calendarProps.locale` when provided."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional form field name. Renders a hidden input with the selected ISO date."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional id applied to the trigger button."
            },
            {
              "name": "aria-invalid",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the trigger as invalid for assistive tech and applies error styling."
            },
            {
              "name": "side",
              "type": "\"top\" | \"bottom\"",
              "defaultValue": "bottom",
              "required": false,
              "description": "Preferred panel side relative to the trigger. Flips when there is not enough space."
            },
            {
              "name": "align",
              "type": "\"start\" | \"end\"",
              "defaultValue": "start",
              "required": false,
              "description": "Horizontal alignment of the portaled panel to the trigger."
            },
            {
              "name": "calendarProps",
              "type": "Omit<CalendarProps, 'selected' | 'defaultSelected' | 'onSelect' | 'month' | 'onMonthChange' | 'mode' | 'range' | 'defaultRange' | 'onRangeSelect'>",
              "defaultValue": "",
              "required": false,
              "description": "Props forwarded to the embedded Calendar, such as size, locale, disabled, bounds, modifiers, weekStartsOn, minYear, and maxYear. Range mode is not supported on DatePicker."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/input",
        "motion",
        "lucide-react",
        "date-fns"
      ]
    },
    {
      "slug": "favicon-badge",
      "name": "Favicon Badge",
      "href": "/display-and-content/favicon-badge",
      "url": "https://iconiqui.com/display-and-content/favicon-badge",
      "installPackage": "@iconiq/favicon-badge",
      "installCommand": "npx shadcn@latest add @iconiq/favicon-badge",
      "registryPath": "favicon-badge.json",
      "registryUrl": "https://iconiqui.com/r/favicon-badge.json",
      "summary": "Inline circular badge that resolves a website favicon from a domain or URL, with an optional text label and spring entrance animation.",
      "apiSections": [
        {
          "id": "favicon-badge",
          "title": "FaviconBadge",
          "summary": "Inline circular badge that resolves a website favicon from a domain or URL, with an optional text label and spring entrance animation.",
          "notes": [
            "Extends native `span` props (`id`, `onClick`, `data-*`, and other `aria-*` attributes) via prop spreading on the root.",
            "Favicons are resolved from Google and DuckDuckGo icon services after `extractDomain` normalizes the `website` value.",
            "While resolving, the badge shows a pulsing skeleton and sets `aria-busy` on the root. Failed resolution uses a muted globe with a destructive-tinted border.",
            "Google placeholder icons (16×16 defaults) are skipped automatically before falling back to the next provider.",
            "Favicon images use `referrerPolicy=\"no-referrer\"` and a single in-DOM `<img>` load path to avoid duplicate network requests.",
            "When `label` is omitted, the root uses `role=\"img\"` with an `aria-label` derived from the label, domain, or raw `website` value.",
            "Exports `extractDomain`, `getFaviconCandidates`, `getFaviconUrl`, `isLikelyDefaultFavicon`, and `FaviconBadgeSize` for reuse in search fields or attribution rows.",
            "Install path is `components/ui/favicon-badge.tsx` with named and default `FaviconBadge` exports. Requires `@/lib/utils` (`cn`).",
            "External favicon requests require `img-src` allowances for `https://www.google.com` and `https://icons.duckduckgo.com` unless `faviconUrl` is used."
          ],
          "fields": [
            {
              "name": "website",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Domain or full URL used to resolve the favicon. Values such as `iconiqui.com` or `https://www.iconiqui.com` are normalized to a hostname."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional label rendered beside the circular favicon badge. When omitted, only the badge is shown and the domain is exposed to screen readers."
            },
            {
              "name": "faviconUrl",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional favicon URL that bypasses Google and DuckDuckGo resolution. Use for self-hosted icons or strict CSP environments."
            },
            {
              "name": "faviconSize",
              "type": "16 | 32 | 64 | 128",
              "defaultValue": "64",
              "required": false,
              "description": "Pixel size requested from Google's favicon service. Higher values can improve clarity on retina displays."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Visual scale for the circular favicon badge container. Label text scales with size: `text-sm` on small, `text-base` on medium, and `text-lg` on large."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root inline-flex wrapper."
            },
            {
              "name": "badgeClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the circular favicon container for local border, background, or sizing overrides."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the optional label when `label` is provided."
            },
            {
              "name": "onFaviconLoad",
              "type": "(url: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called after a favicon URL resolves successfully, including when `faviconUrl` is provided."
            },
            {
              "name": "onFaviconError",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when every provider fails or an override URL fails to load."
            }
          ]
        }
      ],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "marker",
      "name": "Marker",
      "href": "/display-and-content/marker",
      "url": "https://iconiqui.com/display-and-content/marker",
      "installPackage": "@iconiq/marker",
      "installCommand": "npx shadcn@latest add @iconiq/marker",
      "registryPath": "marker.json",
      "registryUrl": "https://iconiqui.com/r/marker.json",
      "summary": "Hand-drawn text annotations — wavy, circle, highlight, underline, and more — that draw themselves in like ink as they scroll into view, with an optional animate prop for a fully static render.",
      "apiSections": [],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "progress",
      "name": "Progress",
      "href": "/display-and-content/progress",
      "url": "https://iconiqui.com/display-and-content/progress",
      "installPackage": "@iconiq/progress",
      "installCommand": "npx shadcn@latest add @iconiq/progress",
      "registryPath": "progress.json",
      "registryUrl": "https://iconiqui.com/r/progress.json",
      "summary": "Determinate and indeterminate progress—with subtle motion.",
      "apiSections": [
        {
          "id": "progress",
          "title": "Progress",
          "summary": "Determinate and indeterminate progress—with subtle motion.",
          "notes": [
            "The component clamps numeric values into the min/max range before calculating the fill width.",
            "The visible value readout animates from the same motion value as the fill width, so the text and the bar stay visually locked together while values change.",
            "There is no controlled versus uncontrolled split here; value is simply rendered as the current state of the task.",
            "Helper copy is linked to the progressbar through aria-describedby on both Radix and Base UI installs."
          ],
          "fields": [
            {
              "name": "value",
              "type": "number | null",
              "defaultValue": "0",
              "required": false,
              "description": "Current progress value. Pass null to switch into the indeterminate motion state instead of rendering a measured fill width."
            },
            {
              "name": "min",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Lower bound used to normalize the fill width and the visible value text."
            },
            {
              "name": "max",
              "type": "number",
              "defaultValue": "100",
              "required": false,
              "description": "Upper bound used to normalize the fill width and the visible value text."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional title rendered above the bar and linked to the progress semantics when present."
            },
            {
              "name": "helper",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional supporting copy rendered near the label for extra task context. When omitted, the header collapses down to just the label and trailing value readout."
            },
            {
              "name": "showValue",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether the trailing inline readout with the live formatted value or indeterminate label is shown."
            },
            {
              "name": "formatValue",
              "type": "(value: number, percent: number) => string",
              "defaultValue": "",
              "required": false,
              "description": "Optional formatter for the visible value readout. Receives the current normalized value and percent so you can render units, fractions, or custom labels."
            },
            {
              "name": "getValueLabel",
              "type": "(value: number, percent: number) => string",
              "defaultValue": "",
              "required": false,
              "description": "Optional formatter for screen-reader announcements when the accessible text should be more explicit than the visible readout."
            },
            {
              "name": "indeterminateLabel",
              "type": "string",
              "defaultValue": "\"In progress\"",
              "required": false,
              "description": "Text used for the visible value readout and accessible status when value is null."
            },
            {
              "name": "ariaLabel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name used when no visible label is rendered. When omitted, unlabeled installs fall back to a generic Progress label."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root wrapper so you can control width, spacing, or placement in your layout."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"circular\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Linear bar (default) or circular gauge layout with a dual-stroke ring, 5% gap, and CSS-smoothed arc transitions. Circular mode renders the value readout centered inside the ring."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Track height preset for the default bar, or ring diameter preset for the circular variant."
            },
            {
              "name": "tone",
              "type": "\"default\" | \"brand\" | \"destructive\" | \"success\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Fill color preset for neutral, brand, destructive, or success emphasis."
            },
            {
              "name": "trackClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the track element for custom track styling."
            },
            {
              "name": "indicatorClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the fill element for custom indicator styling."
            },
            {
              "name": "headerClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the label, helper, and value readout row above the track."
            }
          ]
        },
        {
          "id": "progress-motion",
          "title": "Motion and semantics",
          "summary": "Headless progress semantics from the provider primitive with a spring-smoothed fill and restrained indeterminate motion layered on top.",
          "notes": [
            "Determinate mode uses a spring-smoothed width animation instead of a hard width jump, which keeps status updates feeling more fluid when values change rapidly.",
            "Indeterminate mode uses one minimal left-to-right flow band with a soft fade at the start and end of each pass, so the restart stays visually quiet."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@radix-ui/react-progress",
        "motion"
      ]
    },
    {
      "slug": "rating",
      "name": "Rating",
      "href": "/display-and-content/rating",
      "url": "https://iconiqui.com/display-and-content/rating",
      "installPackage": "@iconiq/rating",
      "installCommand": "npx shadcn@latest add @iconiq/rating",
      "registryPath": "rating.json",
      "registryUrl": "https://iconiqui.com/r/rating.json",
      "summary": "Compound star rating built from Rating and RatingButton — hover to preview, click or use arrow keys to set the value, with configurable size on the root, a springy scale pop, and color fade that ripples across the stars.",
      "apiSections": [],
      "dependencies": [
        "@radix-ui/react-use-controllable-state",
        "motion"
      ]
    },
    {
      "slug": "rolling-digits",
      "name": "Rolling Digits",
      "href": "/display-and-content/rolling-digits",
      "url": "https://iconiqui.com/display-and-content/rolling-digits",
      "installPackage": "@iconiq/rolling-digits",
      "installCommand": "npx shadcn@latest add @iconiq/rolling-digits",
      "registryPath": "rolling-digits.json",
      "registryUrl": "https://iconiqui.com/r/rolling-digits.json",
      "summary": "Inline animated counter that swaps digits with spring-driven transform, opacity, and vertical motion while exiting the previous character.",
      "apiSections": [
        {
          "id": "rolling-digits",
          "title": "RollingDigits",
          "summary": "Inline animated counter that swaps digits with spring-driven transform, opacity, and vertical motion while exiting the previous character.",
          "notes": [
            "Export `RollingDigitsText` when you already have a formatted string such as `12:34:56`.",
            "Non-digit characters from locale separators or custom formatters render as static spans and do not animate.",
            "The visual layer is `aria-hidden`; screen readers receive the formatted number through an `sr-only` span with `aria-live`.",
            "When `startOnView` is enabled, the ticker displays zero until the container crosses the viewport threshold (`once: true`, `amount: 0.6`).",
            "Digit positions use right-aligned stable keys so rolls stay tied to place value when separators appear.",
            "Digit rolls use transform and opacity only so Safari and other WebKit browsers avoid filter-blur compositing glitches.",
            "Layer symbols such as `%` or `$` beside the component in your layout, or include them through `format`."
          ],
          "fields": [
            {
              "name": "value",
              "type": "number",
              "defaultValue": "",
              "required": true,
              "description": "Target number to display. The component rounds to the nearest integer before formatting."
            },
            {
              "name": "pad",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Minimum digit count. Applied with `padStart` for plain numbers, or through `minimumIntegerDigits` when `locale` is enabled."
            },
            {
              "name": "animationDelay",
              "type": "number",
              "defaultValue": "80",
              "required": false,
              "description": "Milliseconds between queued value steps when `value` changes faster than the animation can finish."
            },
            {
              "name": "stagger",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Deprecated. Seconds between queued steps. Use `animationDelay` in milliseconds instead."
            },
            {
              "name": "coalesceUpdates",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, rapid `value` updates replace the pending queue with the latest value instead of stepping through every intermediate update."
            },
            {
              "name": "onAnimationComplete",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the displayed value catches up to the latest `value` prop."
            },
            {
              "name": "ariaLive",
              "type": "boolean | \"polite\" | \"assertive\" | \"off\"",
              "defaultValue": "true",
              "required": false,
              "description": "Controls `aria-live` on the screen-reader layer. `true` maps to `polite`; `false` and `off` disable announcements."
            },
            {
              "name": "startOnView",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, playback waits until the component enters the viewport once before animating from zero."
            },
            {
              "name": "locale",
              "type": "true | string | Intl.NumberFormatOptions",
              "defaultValue": "",
              "required": false,
              "description": "Locale formatting. `locale` uses the runtime default locale, a string sets the locale tag, and an object is passed to `Intl.NumberFormat`. When combined with `pad`, padding is applied through `minimumIntegerDigits`."
            },
            {
              "name": "format",
              "type": "(value: number) => string",
              "defaultValue": "",
              "required": false,
              "description": "Custom formatter that runs after rounding. Overrides `locale` when both are provided."
            },
            {
              "name": "gap",
              "type": "number",
              "defaultValue": "2",
              "required": false,
              "description": "Pixel gap between rendered characters in the digit row."
            },
            {
              "name": "direction",
              "type": "\"dynamic\" | \"up\" | \"down\"",
              "defaultValue": "dynamic",
              "required": false,
              "description": "Controls whether incoming digits slide up or down. `dynamic` compares the previous and next digit values."
            },
            {
              "name": "enterStiffness",
              "type": "number",
              "defaultValue": "170",
              "required": false,
              "description": "Spring stiffness for incoming digit motion."
            },
            {
              "name": "enterDamping",
              "type": "number",
              "defaultValue": "10",
              "required": false,
              "description": "Spring damping for incoming digit motion."
            },
            {
              "name": "exitStiffness",
              "type": "number",
              "defaultValue": "170",
              "required": false,
              "description": "Spring stiffness for outgoing digit motion."
            },
            {
              "name": "exitDamping",
              "type": "number",
              "defaultValue": "15",
              "required": false,
              "description": "Spring damping for outgoing digit motion."
            },
            {
              "name": "enterY",
              "type": "number",
              "defaultValue": "32",
              "required": false,
              "description": "Vertical offset in pixels used when a digit enters."
            },
            {
              "name": "enterBlur",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Deprecated. Blur is no longer applied; digit motion uses transform and opacity for Safari-safe rendering."
            },
            {
              "name": "enterScale",
              "type": "number",
              "defaultValue": "0.84",
              "required": false,
              "description": "Starting scale applied when a digit enters."
            },
            {
              "name": "exitScale",
              "type": "number",
              "defaultValue": "0.84",
              "required": false,
              "description": "Ending scale applied when a digit exits."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer inline-flex span that wraps the readable and visual layers."
            },
            {
              "name": "digitClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto each animated digit cell wrapper for per-digit styling."
            }
          ]
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "skeleton",
      "name": "Skeleton",
      "href": "/display-and-content/skeleton",
      "url": "https://iconiqui.com/display-and-content/skeleton",
      "installPackage": "@iconiq/skeleton",
      "installCommand": "npx shadcn@latest add @iconiq/skeleton",
      "registryPath": "skeleton.json",
      "registryUrl": "https://iconiqui.com/r/skeleton.json",
      "summary": "Loading placeholder that renders a muted block with shimmer or fade animation, sensible defaults, and preset helpers for common shapes.",
      "apiSections": [
        {
          "id": "skeleton",
          "title": "Skeleton",
          "summary": "Loading placeholder that renders a muted block with shimmer or fade animation, sensible defaults, and preset helpers for common shapes.",
          "notes": [
            "The root defaults to `h-4 w-full`, so skeletons work without extra sizing for simple text lines.",
            "Decorative skeletons render `aria-hidden`. Standalone loading blocks can set `decorative={false}` to expose `role=\"status\"`, `aria-live=\"polite\"`, and a label.",
            "Theme tokens are embedded on the root node, so colors resolve out of the box without installing iconiq-theme separately.",
            "Shimmer and fade styles are injected once on the client through a scoped keyframe helper, so lists of skeletons do not duplicate `<style>` tags.",
            "Animations pause automatically when `prefers-reduced-motion: reduce` is enabled.",
            "Preset exports `SkeletonAvatar`, `SkeletonText`, and `SkeletonButton` cover the most common placeholder shapes.",
            "`ShimmerSkeleton` remains available as a backwards-compatible alias."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"shimmer\" | \"fade\"",
              "defaultValue": "shimmer",
              "required": false,
              "description": "Chooses between the moving shimmer sweep and a softer opacity fade."
            },
            {
              "name": "rounded",
              "type": "\"none\" | \"sm\" | \"md\" | \"lg\" | \"full\"",
              "defaultValue": "md",
              "required": false,
              "description": "Chooses the corner radius utility applied to the placeholder surface."
            },
            {
              "name": "animate",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether the selected animation variant is rendered. Set it to false for a static loading block."
            },
            {
              "name": "duration",
              "type": "number",
              "defaultValue": "1.6",
              "required": false,
              "description": "Animation cycle duration in seconds. Defaults to 1.6s for shimmer and 2.4s for fade."
            },
            {
              "name": "decorative",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, the skeleton is hidden from assistive tech so grouped placeholders do not repeat loading announcements."
            },
            {
              "name": "label",
              "type": "string | null",
              "defaultValue": "",
              "required": false,
              "description": "Accessible label used when `decorative={false}`. Pass `null` to force a hidden decorative skeleton."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root div so you can control width, height, spacing, colors, and any extra local styling."
            },
            {
              "name": "HTML div props",
              "type": "HTMLAttributes<HTMLDivElement>",
              "defaultValue": "",
              "required": false,
              "description": "Standard div attributes such as style, data-*, aria-*, id, and event handlers are forwarded to the root element."
            }
          ]
        },
        {
          "id": "skeleton-presets",
          "title": "Preset helpers",
          "summary": "Opinionated wrappers around the base skeleton for avatar, text-line, and button placeholders.",
          "notes": [
            "Each preset accepts the same props as `Skeleton` except where the shape is fixed by the helper."
          ],
          "fields": [
            {
              "name": "SkeletonAvatar",
              "type": "Component",
              "defaultValue": "",
              "required": false,
              "description": "Renders a circular `size-10` avatar placeholder."
            },
            {
              "name": "SkeletonText",
              "type": "Component",
              "defaultValue": "",
              "required": false,
              "description": "Renders a `h-3` text-line placeholder."
            },
            {
              "name": "SkeletonButton",
              "type": "Component",
              "defaultValue": "",
              "required": false,
              "description": "Renders a `h-9 w-24` button placeholder with `rounded=\"lg\"`."
            }
          ]
        }
      ],
      "dependencies": []
    },
    {
      "slug": "spinner",
      "name": "Spinner",
      "href": "/display-and-content/spinner",
      "url": "https://iconiqui.com/display-and-content/spinner",
      "installPackage": "@iconiq/spinner",
      "installCommand": "npx shadcn@latest add @iconiq/spinner",
      "registryPath": "spinner.json",
      "registryUrl": "https://iconiqui.com/r/spinner.json",
      "summary": "Default export for a lightweight loading indicator with ring, dots, or matrix variants, size presets, and accessibility controls.",
      "apiSections": [
        {
          "id": "spinner",
          "title": "Spinner",
          "summary": "Default export for a lightweight loading indicator with ring, dots, or matrix variants, size presets, and accessibility controls.",
          "notes": [
            "The root element is a span with role=\"status\" when the spinner announces loading on its own.",
            "Use decorative spinners inside buttons or busy containers that already expose aria-busy and aria-label.",
            "Ring, dots, and matrix variants share the same ref, DOM prop forwarding, and accessibility resolver.",
            "Matrix renders a fixed 5x5 dot grid with a smooth diagonal wave driven by phase-offset CSS animation.",
            "Prefer size over manual width classes so border thickness stays proportional."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"ring\" | \"dots\" | \"matrix\"",
              "defaultValue": "ring",
              "required": false,
              "description": "Chooses between the rotating ring, three bouncing dots, or a square dot-matrix sweep."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "md",
              "required": false,
              "description": "Scales the spinner footprint and ring border thickness together."
            },
            {
              "name": "decorative",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, hides the spinner from assistive tech so a parent can announce loading once."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root span so you can fine-tune color, spacing, or layout with Tailwind utilities."
            }
          ]
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "status-dot",
      "name": "Status Dot",
      "href": "/display-and-content/status-dot",
      "url": "https://iconiqui.com/display-and-content/status-dot",
      "installPackage": "@iconiq/status-dot",
      "installCommand": "npx shadcn@latest add @iconiq/status-dot",
      "registryPath": "status-dot.json",
      "registryUrl": "https://iconiqui.com/r/status-dot.json",
      "summary": "Inline status indicator with optional rippling halo, deployment presets, generic tones, and dot-only accessibility defaults.",
      "apiSections": [
        {
          "id": "status-dot",
          "title": "StatusDot",
          "summary": "Inline status indicator with optional rippling halo, deployment presets, generic tones, and dot-only accessibility defaults.",
          "notes": [
            "Dot-only mode announces changes with `role=\"status\"` and `aria-live=\"polite\"`.",
            "Colors use embedded Iconiq CSS variables, so the dot works after registry install without extra theme setup.",
            "Ripple motion uses CSS keyframes and disables when `prefers-reduced-motion: reduce` is enabled.",
            "Use `getStatusDotConfig`, `statusDotStates`, and `statusDotStateConfig` when mapping app data to presets."
          ],
          "fields": [
            {
              "name": "state",
              "type": "\"QUEUED\" | \"BUILDING\" | \"ERROR\" | \"READY\" | \"CANCELED\"",
              "defaultValue": "",
              "required": false,
              "description": "Deployment preset that maps to tone, default label, and default animation. Use this or `tone`."
            },
            {
              "name": "tone",
              "type": "\"neutral\" | \"active\" | \"success\" | \"warning\" | \"error\"",
              "defaultValue": "",
              "required": false,
              "description": "Generic presence tone when you do not need deployment vocabulary. Use this or `state`."
            },
            {
              "name": "showLabel",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows visible label text beside the dot. Defaults to dot-only for inline copy."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional label override used for visible copy and screen reader naming."
            },
            {
              "name": "animate",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Overrides ripple animation. Defaults to active states only, such as `BUILDING` or `tone=\"active\"`."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Scales the dot, ripple spread, and hit area together."
            },
            {
              "name": "inline",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Uses an inline-flex root for embedding inside sentences and compact rows."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes applied to the root element."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes applied to the visible label when `showLabel` is enabled."
            }
          ]
        }
      ],
      "dependencies": []
    },
    {
      "slug": "table",
      "name": "Table",
      "href": "/display-and-content/table",
      "url": "https://iconiqui.com/display-and-content/table",
      "installPackage": "@iconiq/table",
      "installCommand": "npx shadcn@latest add @iconiq/table",
      "registryPath": "table.json",
      "registryUrl": "https://iconiqui.com/r/table.json",
      "summary": "Root provider for the animated table primitives. It sets the shared column template so header and body rows stay aligned.",
      "apiSections": [
        {
          "id": "table",
          "title": "Table",
          "summary": "Root provider for the animated table primitives. It sets the shared column template so header and body rows stay aligned.",
          "notes": [
            "The canonical JSX export is `Table`, and the lowercase `table` alias still ships for backward compatibility.",
            "The file also exports `TABLE_DEFAULT_COLUMNS`, `TableAlign`, `TableRowVariant`, `TableSize`, `TableSortDirection`, and `TableSortState` for stronger TypeScript reuse in app code.",
            "The registry component no longer owns demo data, search state, or add/remove actions. Those behaviors are expected to live in app code.",
            "In development, TableRow warns when the rendered cell count does not match the configured columns string."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, and optional helper primitives inside the root."
            },
            {
              "name": "columns",
              "type": "string",
              "defaultValue": "\"minmax(0,1.4fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1fr)\"",
              "required": false,
              "description": "Shared grid-template-columns value applied to every header and body row so the native table semantics still keep the custom grid layout aligned."
            },
            {
              "name": "size",
              "type": "\"default\" | \"compact\"",
              "defaultValue": "default",
              "required": false,
              "description": "Controls row density by tightening header and body cell padding across the table."
            },
            {
              "name": "stickyHeader",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, TableHeader stays pinned while the surrounding scroll container moves."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the native table element when you need to adjust width, spacing, or placement."
            }
          ]
        },
        {
          "id": "table-toolbar",
          "title": "TableToolbar",
          "summary": "Optional layout helper for the control row above the table, matching the original spacing and alignment treatment.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually a search field, actions, filters, or bulk controls placed above the table."
            },
            {
              "name": "tableId",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional id of the related table, exposed through aria-controls for toolbar controls."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the toolbar wrapper."
            }
          ]
        },
        {
          "id": "table-header",
          "title": "TableHeader",
          "summary": "Native table head wrapper for the column labels and sort controls.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually one header TableRow."
            },
            {
              "name": "sticky",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Overrides the root stickyHeader setting for this header section."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the header wrapper."
            }
          ]
        },
        {
          "id": "table-body",
          "title": "TableBody",
          "summary": "Native table body wrapper that adds LayoutGroup and AnimatePresence so row insertions, removals, and reordering stay animated.",
          "notes": [
            "Exit animations for removed rows only run when body rows are rendered as direct children of TableBody.",
            "Row motion respects prefers-reduced-motion automatically."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "One or more TableRow elements, plus optional TableEmpty or TableLoading when no rows are visible or data is still loading."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the body wrapper."
            }
          ]
        },
        {
          "id": "table-footer",
          "title": "TableFooter",
          "summary": "Native table footer wrapper for totals, pagination, and bulk actions below the body rows.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually one footer TableRow containing TablePagination or summary cells."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the footer wrapper."
            }
          ]
        },
        {
          "id": "table-row",
          "title": "TableRow",
          "summary": "Motion-enabled native table row used for both header and body layouts.",
          "notes": [
            "Every row reads the shared columns string from Table and applies it as grid-template-columns.",
            "Rows expose `data-slot=\"table-row\"`, plus `data-variant`, `data-hoverable`, and `data-selected`, which makes local styling overrides easier after installation."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"header\" | \"body\"",
              "defaultValue": "body",
              "required": false,
              "description": "Header rows skip mount and exit motion, while body rows keep the original motion defaults."
            },
            {
              "name": "index",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Optional row index used to apply a subtle stagger to body row entry motion."
            },
            {
              "name": "hoverable",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "When true, body rows get the muted hover wash. Defaults to false so informational rows do not imply clickability."
            },
            {
              "name": "selected",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies selected styling and exposes data-state=\"selected\" for active row selection."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the row shell for spacing or color overrides."
            },
            {
              "name": "Motion tr props",
              "type": "ComponentPropsWithoutRef<typeof motion.tr>",
              "defaultValue": "",
              "required": false,
              "description": "Additional motion.tr props such as layout, transition, whileHover, and exit can still be passed directly."
            }
          ]
        },
        {
          "id": "table-head",
          "title": "TableHead",
          "summary": "Native header cell wrapper for labels, sort buttons, and aligned controls.",
          "notes": [],
          "fields": [
            {
              "name": "align",
              "type": "\"left\" | \"center\" | \"right\"",
              "defaultValue": "left",
              "required": false,
              "description": "Controls left, center, or right alignment for the header cell content."
            },
            {
              "name": "sortDirection",
              "type": "\"asc\" | \"desc\" | \"none\"",
              "defaultValue": "",
              "required": false,
              "description": "Explicit aria-sort source for sortable columns. Pass \"none\" on inactive sortable headers."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Header label or a custom control such as TableSortButton."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the header cell wrapper."
            }
          ]
        },
        {
          "id": "table-cell",
          "title": "TableCell",
          "summary": "Native body cell wrapper for row content, status pills, numeric values, and row actions.",
          "notes": [],
          "fields": [
            {
              "name": "align",
              "type": "\"left\" | \"center\" | \"right\"",
              "defaultValue": "left",
              "required": false,
              "description": "Controls left, center, or right alignment for the cell content."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Rendered cell content."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the cell wrapper."
            }
          ]
        },
        {
          "id": "table-select-head",
          "title": "TableSelectHead",
          "summary": "Checkbox header cell helper for select-all row selection columns.",
          "notes": [],
          "fields": [
            {
              "name": "checked",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Controlled checked state for the select-all checkbox."
            },
            {
              "name": "indeterminate",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows the mixed selection state when only some visible rows are selected."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the select-all checkbox toggles."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "\"Select all rows\"",
              "required": false,
              "description": "Accessible name for the select-all checkbox."
            }
          ]
        },
        {
          "id": "table-select-cell",
          "title": "TableSelectCell",
          "summary": "Checkbox body cell helper for per-row selection columns.",
          "notes": [],
          "fields": [
            {
              "name": "checked",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Controlled checked state for the row checkbox."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the row checkbox toggles."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Accessible name for the row checkbox, such as the row title."
            }
          ]
        },
        {
          "id": "table-caption",
          "title": "TableCaption",
          "summary": "Low-emphasis native table caption below the table, matching the original entry count styling.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Caption copy, summary text, or count information."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the caption paragraph."
            }
          ]
        },
        {
          "id": "table-empty",
          "title": "TableEmpty",
          "summary": "Animated empty-state row for zero-result or no-data states inside TableBody.",
          "notes": [
            "The empty row uses the same grid column template as body rows so the message stays aligned with the table layout."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Empty-state copy or a richer no-data message."
            },
            {
              "name": "colSpan",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Overrides the automatically derived column span when the empty row should cover a different number of columns."
            },
            {
              "name": "Motion tr props",
              "type": "ComponentPropsWithoutRef<typeof motion.tr>",
              "defaultValue": "",
              "required": false,
              "description": "You can still override animate, initial, transition, or className when customizing the empty state row."
            }
          ]
        },
        {
          "id": "table-loading",
          "title": "TableLoading",
          "summary": "Placeholder body rows with pulse bars for async loading states inside TableBody.",
          "notes": [],
          "fields": [
            {
              "name": "rows",
              "type": "number",
              "defaultValue": "3",
              "required": false,
              "description": "Number of placeholder rows to render."
            },
            {
              "name": "TableRow props",
              "type": "Omit<TableRowProps, \"children\" | \"variant\">",
              "defaultValue": "",
              "required": false,
              "description": "Optional TableRow props such as index or className passed to each loading row."
            }
          ]
        },
        {
          "id": "table-sort-button",
          "title": "TableSortButton",
          "summary": "Optional header helper with a larger hit area, clearer active state, and direction animation.",
          "notes": [
            "The helper defaults to type='button', so it stays safe inside forms.",
            "When children is plain text, an aria-label is generated automatically from the active sort direction."
          ],
          "fields": [
            {
              "name": "active",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Strengthens the visual treatment and enables the active sort direction state for the parent column header."
            },
            {
              "name": "direction",
              "type": "\"asc\" | \"desc\"",
              "defaultValue": "asc",
              "required": false,
              "description": "Rotates the chevron when the current active sort direction is descending."
            },
            {
              "name": "align",
              "type": "\"left\" | \"center\" | \"right\"",
              "defaultValue": "left",
              "required": false,
              "description": "Keeps the sort button aligned with the header cell it lives in, including full-width right-aligned targets."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Visible sort label."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional override for the generated sort label announced to screen readers."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the button wrapper."
            }
          ]
        },
        {
          "id": "table-pagination",
          "title": "TablePagination",
          "summary": "Pagination helper with previous/next controls and optional range copy, placed below the table.",
          "notes": [],
          "fields": [
            {
              "name": "align",
              "type": "\"left\" | \"center\" | \"right\"",
              "defaultValue": "right",
              "required": false,
              "description": "Aligns the page summary and previous/next controls as a group below the table."
            },
            {
              "name": "page",
              "type": "number",
              "defaultValue": "",
              "required": true,
              "description": "Current one-based page index."
            },
            {
              "name": "pageCount",
              "type": "number",
              "defaultValue": "",
              "required": true,
              "description": "Total number of available pages."
            },
            {
              "name": "onPageChange",
              "type": "(page: number) => void",
              "defaultValue": "",
              "required": true,
              "description": "Called when the previous or next control changes pages."
            },
            {
              "name": "pageSize",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Used with totalItems to render a range label such as 1–5 of 12."
            },
            {
              "name": "totalItems",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Total item count shown in the optional range label."
            },
            {
              "name": "showPageInfo",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Toggles the range or page summary text."
            }
          ]
        }
      ],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "timezone",
      "name": "Timezone",
      "href": "/display-and-content/timezone",
      "url": "https://iconiqui.com/display-and-content/timezone",
      "installPackage": "@iconiq/timezone",
      "installCommand": "npx shadcn@latest add @iconiq/timezone",
      "registryPath": "timezone.json",
      "registryUrl": "https://iconiqui.com/r/timezone.json",
      "summary": "Inline live clock that resolves friendly city names or IANA timezone strings, then animates digit changes with fluid spring rolls and pulsing separators.",
      "apiSections": [
        {
          "id": "timezone",
          "title": "Timezone",
          "summary": "Inline live clock that resolves friendly city names or IANA timezone strings, then animates digit changes with fluid spring rolls and pulsing separators.",
          "notes": [
            "City aliases normalize spacing and casing, so values like `San fransico` still resolve to `America/Los_Angeles`.",
            "Curated aliases such as `portland`, `la`, and `uk` intentionally resolve to specific regional zones and may not match every user expectation.",
            "Use `resolveTimezone(zone)` to validate user input and `getWorldTimezones()` to list every IANA timezone from the current runtime.",
            "All IANA timezones from the runtime environment are indexed automatically, including full paths like `Pacific/Kiritimati` and unique city slugs like `Africa/Abidjan`.",
            "The clock uses `suppressHydrationWarning` and client-side ticking so SSR and hydration stay stable in Next.js apps.",
            "Multiple clocks share one global minute or second timer and pause while the document is hidden.",
            "Digit motion and zone transitions automatically disable when `prefers-reduced-motion: reduce` is enabled.",
            "Digit rolls use transform and opacity only so Safari and other WebKit browsers avoid filter-blur compositing glitches.",
            "Colon separators pulse in `live` mode. The visual layer is `aria-hidden` when `ariaLive` is enabled.",
            "The component renders a semantic `time` element with a machine-readable `dateTime` value in the target timezone.",
            "By default the clock refreshes once per minute. Pass `live` for second-level updates in dashboards or hero copy.",
            "Unknown zones render a compact destructive fallback label instead of throwing during render."
          ],
          "fields": [
            {
              "name": "zone",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "City alias such as `San Francisco`, common shorthand like `NYC`, region/city IANA paths such as `Africa/Cairo`, or any of the 400+ IANA timezones from `Intl.supportedValuesOf('timeZone')`."
            },
            {
              "name": "format",
              "type": "\"12h\" | \"24h\"",
              "defaultValue": "\"12h\"",
              "required": false,
              "description": "Controls whether the clock renders with a 12-hour or 24-hour display."
            },
            {
              "name": "showZoneLabel",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, appends a timezone label after the clock."
            },
            {
              "name": "showAbbreviation",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Deprecated alias for `showZoneLabel`. Prefer `showZoneLabel` in new code."
            },
            {
              "name": "zoneName",
              "type": "\"abbreviation\" | \"offset\"",
              "defaultValue": "\"abbreviation\"",
              "required": false,
              "description": "Controls the label style when `showZoneLabel` is true. `abbreviation` renders IST, EST, or PST. `offset` renders GMT-style labels such as GMT+5:30."
            },
            {
              "name": "live",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, updates every second and includes seconds in the formatted output."
            },
            {
              "name": "locale",
              "type": "string",
              "defaultValue": "\"en-US\"",
              "required": false,
              "description": "Locale passed to `Intl.DateTimeFormat` for number and time formatting."
            },
            {
              "name": "fallback",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Custom content rendered when `zone` cannot be resolved. Defaults to `Unknown timezone: {zone}`."
            },
            {
              "name": "onError",
              "type": "(zone: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when `zone` cannot be resolved. Useful for logging or analytics."
            },
            {
              "name": "animate",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When false, disables digit and separator motion even if reduced motion is off."
            },
            {
              "name": "ariaLive",
              "type": "boolean | \"polite\" | \"assertive\" | \"off\"",
              "defaultValue": "",
              "required": false,
              "description": "Adds `aria-live` to a screen-reader-only layer. Defaults to `polite` for minute clocks and off for `live` second clocks."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the rendered `time` element."
            }
          ]
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "verified-badge",
      "name": "Verified Badge",
      "href": "/display-and-content/verified-badge",
      "url": "https://iconiqui.com/display-and-content/verified-badge",
      "installPackage": "@iconiq/verified-badge",
      "installCommand": "npx shadcn@latest add @iconiq/verified-badge",
      "registryPath": "verified-badge.json",
      "registryUrl": "https://iconiqui.com/r/verified-badge.json",
      "summary": "Inline X-style verified scallop with a check. Use shimmer or static variants, size presets, and brand/gold/neutral tones.",
      "apiSections": [
        {
          "id": "verified-badge",
          "title": "VerifiedBadge",
          "summary": "Inline X-style verified scallop with a check. Use shimmer or static variants, size presets, and brand/gold/neutral tones.",
          "notes": [
            "Extends native `span` props (`id`, `style`, `onClick`, `data-*`, tooltips, and other `aria-*` attributes) via prop spreading on the root.",
            "Scallop paths use `currentColor`, so tone tokens and `className` color utilities both work.",
            "The `shimmer` variant uses Motion to sweep a highlight across the scallop (0.5s pass, 1.5s pause between repeats), mounts only after hydration, and automatically falls back to static when `prefers-reduced-motion` is enabled.",
            "Non-decorative badges use `role=\"img\"` with `aria-label`; inner SVG shapes are `aria-hidden`.",
            "Check stroke width scales with badge size for crisp rendering at `sm` through custom pixel values.",
            "Install path is `components/ui/verified-badge.tsx` with the `VerifiedBadge` export."
          ],
          "fields": [
            {
              "name": "variant",
              "type": "\"shimmer\" | \"static\"",
              "defaultValue": "shimmer",
              "required": false,
              "description": "Use `shimmer` for a sweeping highlight across the scallop or `static` for a fixed badge."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\" | number",
              "defaultValue": "md",
              "required": false,
              "description": "Preset sizes map to 18px, 22px, and 28px. Pass a number for an explicit pixel width and height."
            },
            {
              "name": "tone",
              "type": "\"brand\" | \"gold\" | \"neutral\"",
              "defaultValue": "brand",
              "required": false,
              "description": "Brand uses `--verified-badge-color` (defaults to `--ic-brand`). Gold and neutral provide alternate trust-indicator palettes."
            },
            {
              "name": "decorative",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, hides the badge from assistive tech. Use when visible copy already announces verification."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root span. Pass a `text-*` class to override the tone color."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "Verified",
              "required": false,
              "description": "Announced to screen readers when `decorative` is false. Override when the badge conveys a different status."
            }
          ]
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "week-calendar",
      "name": "Week Calendar",
      "href": "/display-and-content/week-calendar",
      "url": "https://iconiqui.com/display-and-content/week-calendar",
      "installPackage": "@iconiq/week-calendar",
      "installCommand": "npx shadcn@latest add @iconiq/week-calendar",
      "registryPath": "week-calendar.json",
      "registryUrl": "https://iconiqui.com/r/week-calendar.json",
      "summary": "Week strip that morphs into a full month grid, with a shared-layout spring pill and a draggable grabber handle.",
      "apiSections": [],
      "dependencies": [
        "motion",
        "lucide-react",
        "date-fns"
      ]
    },
    {
      "slug": "alert",
      "name": "Alert",
      "href": "/feedback-and-alerts/alert",
      "url": "https://iconiqui.com/feedback-and-alerts/alert",
      "installPackage": "@iconiq/alert",
      "installCommand": "npx shadcn@latest add @iconiq/alert",
      "registryPath": "alert.json",
      "registryUrl": "https://iconiqui.com/r/alert.json",
      "summary": "Root container for a single notice. Uses a compact grid layout with optional leading icon, compound title and description slots, legacy prop support, and inline or toast behavior.",
      "apiSections": [
        {
          "id": "alert",
          "title": "Alert",
          "summary": "Root container for a single notice. Uses a compact grid layout with optional leading icon, compound title and description slots, legacy prop support, and inline or toast behavior.",
          "notes": [
            "Use size for preset widths or pass width for a custom max width. md defaults to 400px.",
            "Every positioned alert snaps to a full-width top placement on small screens, then switches to the requested corner at the sm breakpoint.",
            "Inline alerts use role=\"alert\"; toast alerts use role=\"status\" with aria-live=\"polite\" and keep title and message linked with aria-labelledby and aria-describedby.",
            "The alert keeps its own visible state internally when dismissal is enabled, so toast usage is designed for fire-and-forget notifications unless you pass open and onOpenChange.",
            "Hovering or focusing the alert pauses auto-dismiss, which gives people more time to read and makes the close target less stressful to hit.",
            "Dismissible alerts also close on Escape. Toast alerts stack vertically per corner with a soft shadow for contrast over page content.",
            "Motion falls back to opacity-only transitions when prefers-reduced-motion is enabled."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Preferred compound API. Pass an optional leading icon followed by AlertTitle and AlertDescription."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Legacy leading visual prop. Compound children can also provide the leading icon as the first child."
            },
            {
              "name": "title",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Legacy title prop rendered with the same AlertTitle styling. Prefer AlertTitle for new code."
            },
            {
              "name": "message",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Legacy description prop rendered with the same AlertDescription styling. Prefer AlertDescription for new code."
            },
            {
              "name": "action",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional action row rendered beneath the message, useful for a single follow-up button or link such as Undo or View details."
            },
            {
              "name": "appearance",
              "type": "\"default\" | \"success\" | \"info\" | \"destructive\" | \"warning\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Visual tone for the alert surface. Success and info use semantic green and blue surfaces; destructive shifts toward error colors; warning uses a warm amber surface with muted description text."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\" | \"xl\"",
              "defaultValue": "\"md\"",
              "required": false,
              "description": "Preset max width for inline and toast alerts. sm is 320px, md is 400px, lg is 480px, and xl is 560px."
            },
            {
              "name": "width",
              "type": "string | number",
              "defaultValue": "",
              "required": false,
              "description": "Custom max width. Pass a CSS length such as 28rem or a pixel number. Overrides size when set."
            },
            {
              "name": "dismissible",
              "type": "boolean",
              "defaultValue": "legacy: true; compound inline: false",
              "required": false,
              "description": "Controls whether the close button is rendered. Compound inline alerts are static by default; toast and legacy prop alerts remain dismissible unless you opt out."
            },
            {
              "name": "variant",
              "type": "\"inline\" | \"toast\"",
              "defaultValue": "\"inline\"",
              "required": false,
              "description": "Explicitly chooses layout behavior. Toasts portal to document.body and use fixed viewport positioning, while inline alerts stay in normal document flow."
            },
            {
              "name": "position",
              "type": "\"top-left\" | \"top-center\" | \"top-right\" | \"bottom-left\" | \"bottom-center\" | \"bottom-right\"",
              "defaultValue": "",
              "required": false,
              "description": "Optional toast placement. Providing a position also upgrades the component to toast behavior, and omitted toast positions default to top-right."
            },
            {
              "name": "timeout",
              "type": "number",
              "defaultValue": "legacy/toast: 5000; compound inline: 0",
              "required": false,
              "description": "Auto-dismiss delay in milliseconds. Passing 0 disables the timer; compound inline alerts default to no timer so static notices stay visible."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled visibility. Pair with onOpenChange when parent state should own whether the alert is shown."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Initial visibility for uncontrolled usage. Ignored when open is provided."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when visibility changes from dismissal, timeout, Escape, or the close button."
            },
            {
              "name": "titleLines",
              "type": "1 | 2 | 3 | \"none\"",
              "defaultValue": "1",
              "required": false,
              "description": "Maximum title lines before truncation. Pass none to allow the title to wrap freely."
            },
            {
              "name": "onDismiss",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called after the component finishes its exit transition, regardless of whether dismissal came from the close button or the timeout effect."
            }
          ]
        },
        {
          "id": "alert-title",
          "title": "AlertTitle",
          "summary": "Primary line for the compound alert API. Renders in the second grid column beside the optional icon.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Short title or inline formatted heading content."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the title typography classes for one-off styling."
            }
          ]
        },
        {
          "id": "alert-description",
          "title": "AlertDescription",
          "summary": "Secondary line for the compound alert API. Renders beneath the title in the second grid column and links to the root with aria-describedby.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Supporting message content. Keep it concise for compact inline notices and toast updates."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the description typography classes for one-off styling."
            }
          ]
        },
        {
          "id": "alert-action",
          "title": "AlertAction",
          "summary": "Optional action row for the compound alert API. Renders beneath the description in the content column.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Follow-up controls such as a single button or text link. Keep actions concise."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the action row layout classes."
            }
          ]
        },
        {
          "id": "alert-lifecycle",
          "title": "Motion and lifecycle",
          "summary": "Alert uses AnimatePresence for mount and exit, with separate variants for the container, icon, and text stack.",
          "notes": [
            "Entry uses long fluid easing on opacity, vertical drift, scale, and blur so the alert settles in rather than snapping.",
            "Exit keeps the same direction with a softer, slightly slower fade so dismissal still feels continuous.",
            "Child text and the icon only fade on exit, which keeps the container motion cohesive.",
            "prefers-reduced-motion swaps blur, scale, and drift for short opacity fades on the container, text, and icon.",
            "The timeout effect is cleared on cleanup, so unmounting or rerendering the alert does not leak timers.",
            "When position is set, the component waits until after mount before calling createPortal to avoid touching document during server render.",
            "Dismissal callbacks wait until the exit transition completes, so parent cleanup does not cut off the visual exit early."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion",
        "class-variance-authority"
      ]
    },
    {
      "slug": "b-autocomplete",
      "name": "Autocomplete",
      "href": "/inputs-and-forms/autocomplete",
      "url": "https://iconiqui.com/inputs-and-forms/autocomplete",
      "installPackage": "@iconiq/b-autocomplete",
      "installCommand": "npx shadcn@latest add @iconiq/b-autocomplete",
      "registryPath": "b-autocomplete.json",
      "registryUrl": "https://iconiqui.com/r/b-autocomplete.json",
      "summary": "Root autocomplete controller. Compose AutocompleteInput, AutocompleteContent, AutocompleteList, and AutocompleteItem inside it.",
      "apiSections": [
        {
          "id": "autocomplete",
          "title": "Autocomplete",
          "summary": "Root autocomplete controller. Compose AutocompleteInput, AutocompleteContent, AutocompleteList, and AutocompleteItem inside it.",
          "notes": [
            "Built on Base UI Autocomplete with list filtering, keyboard navigation, empty-state support, and a sliding highlight treatment.",
            "Radix UI does not ship a dedicated autocomplete primitive, so this install is Base UI only.",
            "Pass value and onValueChange for controlled input text. The popup opens while typing by default, not on focus.",
            "Object items require itemToStringValue. Use isItemEqualToValue if selection highlight behaves incorrectly.",
            "Use useAutocompleteFilter and useFilteredAutocompleteItems when you need custom locale or filter behavior.",
            "Popup and highlight motion honor prefers-reduced-motion automatically."
          ],
          "fields": [
            {
              "name": "items",
              "type": "readonly Item[]",
              "defaultValue": "",
              "required": false,
              "description": "Item collection used for list filtering. Pass a flat array or grouped items for sectioned results."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled input text shown in the field."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial input text for uncontrolled usage."
            },
            {
              "name": "onValueChange",
              "type": "(value: string, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the input text changes from typing or when a suggestion is accepted."
            },
            {
              "name": "itemToStringValue",
              "type": "(item: Item) => string",
              "defaultValue": "",
              "required": false,
              "description": "Maps each item to the string used for filtering and the committed input value."
            },
            {
              "name": "autoHighlight",
              "type": "boolean | \"always\"",
              "defaultValue": "true",
              "required": false,
              "description": "Automatically highlights the first matching item while typing."
            },
            {
              "name": "keepHighlight",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, keeps the highlighted item when the pointer leaves the list."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled popup state. Pair with onOpenChange."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the suggestion panel opens or closes. Use with open for controlled popup state."
            },
            {
              "name": "onItemHighlighted",
              "type": "(item: Item | undefined, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the highlighted suggestion changes from keyboard, pointer, or programmatic updates."
            },
            {
              "name": "openOnInputClick",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, clicking the input opens the suggestion panel even before typing."
            },
            {
              "name": "submitOnItemClick",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, selecting an item submits the owning form. Useful for search inputs."
            },
            {
              "name": "modal",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, traps focus inside the popup. Pair with AutocompleteBackdrop for a dimmed overlay."
            },
            {
              "name": "isItemEqualToValue",
              "type": "(item: Item, value: Item) => boolean",
              "defaultValue": "",
              "required": false,
              "description": "Custom equality for object items. Use when items are recreated on each render."
            }
          ]
        },
        {
          "id": "autocomplete-input",
          "title": "AutocompleteInput",
          "summary": "Styled input shell with border, focus ring, optional clear control, and invalid-state styling via aria-invalid. The field control uses Base UI Input.",
          "notes": [],
          "fields": [
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional field label rendered above the input and linked with htmlFor."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the field label."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Shown when the input is empty."
            },
            {
              "name": "showClear",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether AutocompleteClear is rendered."
            },
            {
              "name": "showTrigger",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, renders a chevron trigger that toggles the suggestion panel."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the input, clear button, and trigger."
            },
            {
              "name": "aria-invalid",
              "type": "boolean | 'true' | 'false'",
              "defaultValue": "",
              "required": false,
              "description": "When true, applies destructive border and ring styling to the input shell."
            }
          ]
        },
        {
          "id": "autocomplete-clear",
          "title": "AutocompleteClear",
          "summary": "Clears the current input text. Rendered automatically when AutocompleteInput showClear is true.",
          "notes": [],
          "fields": [
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the clear button."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the clear button."
            }
          ]
        },
        {
          "id": "autocomplete-trigger",
          "title": "AutocompleteTrigger",
          "summary": "Chevron button that toggles the suggestion panel. Includes aria-expanded and aria-label for screen readers.",
          "notes": [],
          "fields": [
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the trigger button."
            }
          ]
        },
        {
          "id": "autocomplete-content",
          "title": "AutocompleteContent",
          "summary": "Portaled suggestion panel with a subtle fade-slide entrance and anchored width.",
          "notes": [
            "The popup stays open when filtering returns no matches so AutocompleteEmpty can render.",
            "The panel width matches the input anchor and the list scrolls at the same max height as the combobox install."
          ],
          "fields": [
            {
              "name": "side",
              "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Preferred side for the popup."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "\"start\"",
              "required": false,
              "description": "Popup alignment relative to the input anchor."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "6",
              "required": false,
              "description": "Distance between the input and the popup."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the animated popup panel."
            }
          ]
        },
        {
          "id": "autocomplete-list",
          "title": "AutocompleteList",
          "summary": "Scrollable suggestion list rendered inside AutocompleteContent.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode | ((item, index) => ReactNode)",
              "defaultValue": "",
              "required": true,
              "description": "Render explicit AutocompleteItem children or a render function when using the root items prop."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default list spacing and scroll classes."
            }
          ]
        },
        {
          "id": "autocomplete-item",
          "title": "AutocompleteItem",
          "summary": "Suggestion row with optional description and a spring-driven highlight fill.",
          "notes": [],
          "fields": [
            {
              "name": "value",
              "type": "Item",
              "defaultValue": "",
              "required": true,
              "description": "Item value passed to Base UI for selection handling."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional secondary line below the primary label."
            }
          ]
        },
        {
          "id": "autocomplete-empty",
          "title": "AutocompleteEmpty",
          "summary": "Empty-state message shown when filtering returns no matches. Place inside AutocompleteContent after AutocompleteList.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "\"No results found.\"",
              "required": false,
              "description": "Message shown when the filtered list is empty."
            }
          ]
        },
        {
          "id": "autocomplete-status",
          "title": "AutocompleteStatus",
          "summary": "Live status region for async loading or result counts. Keep mounted and update children instead of conditionally removing the component.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Status text announced politely to screen readers, such as Loading or No matches."
            }
          ]
        },
        {
          "id": "autocomplete-group",
          "title": "AutocompleteGroup",
          "summary": "Groups related suggestions inside AutocompleteList.",
          "notes": [],
          "fields": [
            {
              "name": "items",
              "type": "readonly Item[]",
              "defaultValue": "",
              "required": false,
              "description": "Items rendered inside this group when using grouped root items."
            }
          ]
        },
        {
          "id": "autocomplete-label",
          "title": "AutocompleteLabel",
          "summary": "Section label rendered above a group of suggestions.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Group heading text."
            }
          ]
        },
        {
          "id": "autocomplete-separator",
          "title": "AutocompleteSeparator",
          "summary": "Horizontal divider between suggestion groups or rows.",
          "notes": [],
          "fields": []
        },
        {
          "id": "autocomplete-collection",
          "title": "AutocompleteCollection",
          "summary": "Renders the current filtered collection when not using AutocompleteList render props.",
          "notes": [],
          "fields": []
        },
        {
          "id": "autocomplete-value",
          "title": "AutocompleteValue",
          "summary": "Reads the current input value from context for custom display layouts.",
          "notes": [],
          "fields": []
        },
        {
          "id": "autocomplete-icon",
          "title": "AutocompleteIcon",
          "summary": "Leading icon slot rendered inside AutocompleteInput.",
          "notes": [],
          "fields": []
        },
        {
          "id": "autocomplete-backdrop",
          "title": "AutocompleteBackdrop",
          "summary": "Dimmed overlay for modal autocomplete usage. Render as a sibling of AutocompleteContent when modal is true.",
          "notes": [],
          "fields": []
        },
        {
          "id": "autocomplete-row",
          "title": "AutocompleteRow",
          "summary": "Row wrapper for multi-column or complex suggestion layouts.",
          "notes": [],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "b-checkbox",
      "name": "Checkbox",
      "href": "/inputs-and-forms/checkbox",
      "url": "https://iconiqui.com/inputs-and-forms/checkbox",
      "installPackage": "@iconiq/b-checkbox",
      "installCommand": "npx shadcn@latest add @iconiq/b-checkbox",
      "registryPath": "b-checkbox.json",
      "registryUrl": "https://iconiqui.com/r/b-checkbox.json",
      "summary": "Provider-switchable single checkbox layered over Base UI or Radix primitives with optional label, description, and form-field props.",
      "apiSections": [
        {
          "id": "checkbox",
          "title": "Checkbox",
          "summary": "Provider-switchable single checkbox layered over Base UI or Radix primitives with optional label, description, and form-field props.",
          "notes": [
            "Install b-checkbox.json for Base UI or r-checkbox.json for Radix UI. Both expose the same Iconiq API.",
            "When label or description is present, the row uses a native label element with htmlFor instead of manual click forwarding.",
            "Base UI renders a hidden native input beside the animated button, so name, value, required, and form work out of the box.",
            "Radix readOnly is enforced in the component so the visual state cannot be toggled while still looking active."
          ],
          "fields": [
            {
              "name": "checked",
              "type": "boolean | \"indeterminate\"",
              "defaultValue": "",
              "required": false,
              "description": "Controlled checked state. Pass true, false, or \"indeterminate\" for partial selection rows such as select-all headers."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | \"indeterminate\"",
              "defaultValue": "false",
              "required": false,
              "description": "Initial state for uncontrolled usage. It is only read on the first render."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called with the next boolean value whenever the user toggles the checkbox. Indeterminate clicks resolve to true."
            },
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional label rendered beside the control. When provided with description, both sit inside a native label element linked by htmlFor."
            },
            {
              "name": "description",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper copy rendered under the label and linked through aria-describedby."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the label text wrapper."
            },
            {
              "name": "descriptionClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the description text wrapper."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables interaction and applies reduced opacity to the full row."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows the current state without allowing toggles. Useful for locked consent rows."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Forwards native required validation to the hidden checkbox input and appends a visual asterisk to the label."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies destructive border styling and aria-invalid for form validation feedback."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Input name submitted with native forms."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Value submitted when the checkbox is checked."
            },
            {
              "name": "form",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Associates the hidden input with a form element by id when the checkbox renders outside the form."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\" | \"lg\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Adjusts box, icon, label, and row spacing together."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Stable id for the control. When omitted, the component generates one and uses it for label association."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer row wrapper so you can position the checkbox in your layout."
            }
          ]
        },
        {
          "id": "checkbox-motion",
          "title": "Motion and accessibility",
          "summary": "Visual feedback comes from Motion while checkbox semantics travel through the underlying primitive and hidden input.",
          "notes": [
            "The box animates its border and fill between theme tokens, then the checkmark or minus icon draws based on the next state.",
            "Tap feedback briefly compresses the control unless disabled, readOnly, or prefers-reduced-motion is active.",
            "The label subtly dims when the row is fully checked. Indeterminate rows keep full label opacity.",
            "Checkbox groups for multi-select lists are available via b-checkbox-group. There is no r-checkbox-group registry entry yet."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-checkbox-group",
      "name": "Checkbox Group",
      "href": "/inputs-and-forms/checkbox-group",
      "url": "https://iconiqui.com/inputs-and-forms/checkbox-group",
      "installPackage": "@iconiq/b-checkbox-group",
      "installCommand": "npx shadcn@latest add @iconiq/b-checkbox-group",
      "registryPath": "b-checkbox-group.json",
      "registryUrl": "https://iconiqui.com/r/b-checkbox-group.json",
      "summary": "A single checkbox row composed as a child of CheckboxGroup or CheckboxGroupSection.",
      "apiSections": [
        {
          "id": "checkbox-group-item",
          "title": "CheckboxGroupItem",
          "summary": "A single checkbox row composed as a child of CheckboxGroup or CheckboxGroupSection.",
          "notes": [],
          "fields": [
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Primary copy shown for the row."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable identifier used when checking whether the row is selected and when producing the next selection array."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional stable id used for label and description associations. Falls back to a generated id when omitted."
            },
            {
              "name": "description",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional secondary text rendered below the label and linked through aria-describedby."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables this row only. Use CheckboxGroupSection disabled to disable an entire section."
            },
            {
              "name": "disabledReason",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional explainer rendered below disabled rows and linked through aria-describedby."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Shows this row without allowing toggles and keeps it checked. Pair with CheckboxGroup value for mixed read-only and interactive rows."
            }
          ]
        },
        {
          "id": "checkbox-group-section",
          "title": "CheckboxGroupSection",
          "summary": "Named fieldset wrapper for a cluster of CheckboxGroupItem children. Mirrors how ButtonGroup composes child buttons.",
          "notes": [],
          "fields": [
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional section heading rendered as a fieldset legend. Required for maxVisible section collapse."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables every checkbox row inside this section and applies native fieldset disabled semantics."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "CheckboxGroupItem elements to render inside the section."
            }
          ]
        },
        {
          "id": "checkbox-option",
          "title": "CheckboxGroupOption",
          "summary": "Legacy options-array shape. Prefer CheckboxGroupItem children for new installs.",
          "notes": [],
          "fields": [
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Primary copy shown for the row."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable identifier used when checking whether the row is selected and when producing the next selection array."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional stable id used for label and description associations. Falls back to a generated id when omitted."
            },
            {
              "name": "description",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional secondary text rendered below the label and linked through aria-describedby."
            },
            {
              "name": "group",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional section label used to chunk long lists into named fieldset groups when adjacent options share the same value."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables the row button and blocks hover, active, and toggle behavior for that option. Works inside grouped sections as well as flat lists."
            },
            {
              "name": "disabledReason",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional explainer rendered below disabled rows and linked through aria-describedby."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Shows the row state without allowing toggles. Useful for locked consent or audit views."
            }
          ]
        },
        {
          "id": "checkbox-group",
          "title": "CheckboxGroup",
          "summary": "Animated multi-select list composed with CheckboxGroupSection and CheckboxGroupItem children, with optional legacy options prop support.",
          "notes": [
            "The component previews the next state immediately after a click, then re-syncs with whatever value the parent sends back.",
            "Compose rows with CheckboxGroupSection and CheckboxGroupItem, similar to ButtonGroup child buttons.",
            "Named sections render as fieldset and legend pairs. Unlabeled sections render as plain fieldsets.",
            "maxVisible only applies when at least one CheckboxGroupSection includes a label.",
            "Collapsed grouped sections stay mounted but hidden so Base UI selection state is preserved. Sections with selected values auto-expand.",
            "Returns null when no items are provided."
          ],
          "fields": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Preferred composition API. Pass CheckboxGroupItem rows directly or nest them inside CheckboxGroupSection wrappers."
            },
            {
              "name": "options",
              "type": "CheckboxGroupOption[]",
              "defaultValue": "",
              "required": false,
              "description": "Legacy array-based configuration. Ignored when children are provided."
            },
            {
              "name": "value",
              "type": "string[]",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected values. When provided, the parent remains the source of truth while the component renders an immediate optimistic preview after each click."
            },
            {
              "name": "defaultValue",
              "type": "string[]",
              "defaultValue": "[]",
              "required": false,
              "description": "Initial selected values for uncontrolled usage. Ignored when value is provided."
            },
            {
              "name": "onChange",
              "type": "(value: string[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Receives the next selected values array after a row is toggled, normalized back into the original display order."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Forwarded to each hidden checkbox input for native form submission."
            },
            {
              "name": "form",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Associates the hidden checkbox inputs with a distant form element by id."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables every row in the group. Prefer CheckboxGroupSection disabled or CheckboxGroupItem disabled for partial disable."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies destructive border styling and aria-invalid for form validation feedback."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\" | \"lg\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Controls row padding, checkbox box size, and label typography."
            },
            {
              "name": "maxVisible",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "When labeled CheckboxGroupSection children are used, limits how many sections stay visible before a show more control appears."
            },
            {
              "name": "showMoreLabel",
              "type": "string",
              "defaultValue": "\"Show more\"",
              "required": false,
              "description": "Button label when grouped sections are collapsed. Appends the hidden section count in parentheses."
            },
            {
              "name": "showLessLabel",
              "type": "string",
              "defaultValue": "\"Show less\"",
              "required": false,
              "description": "Button label when grouped sections are expanded."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the checkbox group when no visible label is present."
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Id of an external element that labels the checkbox group."
            },
            {
              "name": "aria-describedby",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Id of an external element that describes the checkbox group."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root flex column wrapper."
            }
          ]
        },
        {
          "id": "checkbox-motion",
          "title": "Motion and accessibility",
          "summary": "Base UI supplies role='group', checkbox semantics, and hidden native inputs underneath the animated row shell.",
          "notes": [
            "Selection is represented by an SVG checkmark draw instead of a filled checkbox background.",
            "Row hover, active, tap spring, and label fade match the core Iconiq checkbox-group.",
            "Motion honors prefers-reduced-motion for checkmark draw and label fade transitions."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "color-picker",
      "name": "Color Picker",
      "href": "/inputs-and-forms/color-picker",
      "url": "https://iconiqui.com/inputs-and-forms/color-picker",
      "installPackage": "@iconiq/color-picker",
      "installCommand": "npx shadcn@latest add @iconiq/color-picker",
      "registryPath": "color-picker.json",
      "registryUrl": "https://iconiqui.com/r/color-picker.json",
      "summary": "Self-contained HSV panel with saturation field, hue/alpha sliders, multi-format readouts, presets, popover mode, and EyeDropper.",
      "apiSections": [
        {
          "id": "color-picker",
          "title": "ColorPicker",
          "summary": "Self-contained HSV panel with saturation field, hue/alpha sliders, multi-format readouts, presets, popover mode, and EyeDropper.",
          "notes": [
            "Install with npx shadcn@latest add https://iconiqui.com/r/color-picker.json (requires @base-ui/react, lucide-react, motion, and a cn helper).",
            "Theme tokens are embedded on the panel node so the picker works without iconiq-theme, though it still maps cleanly to shadcn semantic colors.",
            "The saturation square, hue slider, and alpha slider share one RGB source of truth. Slider drags emit on pointer up to stay stable in controlled mode.",
            "Format switching exposes editable HEX, RGB, HSL, and OKLCH channels with labeled inputs. Values commit on blur or Enter so partial typing does not fight the live color state.",
            "HEX input accepts 3-, 6-, and 8-digit values. Invalid hex shows inline feedback on blur.",
            "OKLCH chroma max adapts to the current lightness and hue so vivid sRGB colors stay reachable.",
            "EyeDropper support depends on the browser API (Chrome/Edge). Use onEyedropperUnsupported for user-facing feedback.",
            "FluidColorPicker remains exported as a backward-compatible alias for older imports."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled hex color such as #3B82F6 or #3B82F680. When provided, the picker syncs its internal state to this value."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "#3B82F6",
              "required": false,
              "description": "Starting color for uncontrolled usage (3-, 6-, or 8-digit hex). Ignored when value is supplied."
            },
            {
              "name": "onChange",
              "type": "(color: string, detail: ColorPickerChangeDetail) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the color settles (pointer up on sliders, blur/Enter on inputs). Emits #RRGGBB, or #RRGGBBAA when alpha is below 100%, plus CSS strings in detail."
            },
            {
              "name": "onValueCommit",
              "type": "(color: string, detail: ColorPickerChangeDetail) => void",
              "defaultValue": "",
              "required": false,
              "description": "Fires alongside onChange when the color settles. Useful for form commit handlers."
            },
            {
              "name": "defaultAlpha",
              "type": "number",
              "defaultValue": "100",
              "required": false,
              "description": "Starting alpha percentage (0–100) for uncontrolled usage when defaultValue has no alpha channel."
            },
            {
              "name": "defaultFormat",
              "type": "\"HEX\" | \"RGB\" | \"HSL\" | \"OKLCH\"",
              "defaultValue": "HEX",
              "required": false,
              "description": "Initial readout format for the footer row."
            },
            {
              "name": "variant",
              "type": "\"inline\" | \"popover\" | \"swatch\"",
              "defaultValue": "inline",
              "required": false,
              "description": "Inline panel (default), field popover trigger, or compact swatch trigger that opens the picker on click."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state when variant is popover."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Initial open state for uncontrolled popover usage."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the popover panel opens or closes."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "Pick a color",
              "required": false,
              "description": "Placeholder text for the popover trigger label."
            },
            {
              "name": "presets",
              "type": "string[]",
              "defaultValue": "",
              "required": false,
              "description": "Quick-select swatch colors shown above the saturation field."
            },
            {
              "name": "swatchShape",
              "type": "\"default\" | \"circle\"",
              "defaultValue": "default",
              "required": false,
              "description": "Corner style for swatch triggers and preset chips. Use circle for a fully round swatch."
            },
            {
              "name": "showAlpha",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Shows or hides alpha controls and keeps output opaque when false."
            },
            {
              "name": "showCopy",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows a copy-to-clipboard control for the active format string."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables picker interaction and lowers shell opacity."
            },
            {
              "name": "showEyedropper",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Shows or hides the pipette control in the footer row."
            },
            {
              "name": "onEyedropperUnsupported",
              "type": "() => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when EyeDropper is unavailable. No alert dialog is shown by default."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Root element id used for internal aria wiring."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Hidden input name for native form submission."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "Color picker",
              "required": false,
              "description": "Accessible label when not using aria-labelledby."
            },
            {
              "name": "aria-labelledby",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "ID of an external label element."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer shell for width, shadow, or layout overrides."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "lucide-react",
        "motion"
      ]
    },
    {
      "slug": "b-combobox",
      "name": "Combobox",
      "href": "/inputs-and-forms/combobox",
      "url": "https://iconiqui.com/inputs-and-forms/combobox",
      "installPackage": "@iconiq/b-combobox",
      "installCommand": "npx shadcn@latest add @iconiq/b-combobox",
      "registryPath": "b-combobox.json",
      "registryUrl": "https://iconiqui.com/r/b-combobox.json",
      "summary": "Root combobox controller. Compose ComboboxInput, ComboboxContent, ComboboxList, and ComboboxItem inside it.",
      "apiSections": [
        {
          "id": "combobox",
          "title": "Combobox",
          "summary": "Root combobox controller. Compose ComboboxInput, ComboboxContent, ComboboxList, and ComboboxItem inside it.",
          "notes": [
            "The root wraps Base UI's combobox primitive with the same Iconiq motion layer used by the previous wrapper.",
            "Filtering, selection, typeahead, keyboard navigation, and clear behavior are delegated to Base UI while the visual treatment stays Iconiq.",
            "Popup, item, and highlight motion honor prefers-reduced-motion automatically."
          ],
          "fields": [
            {
              "name": "items",
              "type": "readonly Item[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional item collection used by Base UI for filtering and render-function lists."
            },
            {
              "name": "value",
              "type": "Item | Item[] | null",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value. Use an array when multiple is true."
            },
            {
              "name": "defaultValue",
              "type": "Item | Item[] | null",
              "defaultValue": "",
              "required": false,
              "description": "Initial selected value for uncontrolled usage."
            },
            {
              "name": "onValueChange",
              "type": "(value, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when an item is selected, a chip is removed, or the clear action resets the selection."
            },
            {
              "name": "multiple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Allows selecting multiple items. Pair with ComboboxChips, ComboboxChip, and ComboboxChipsInput."
            },
            {
              "name": "itemToStringLabel",
              "type": "(item: Item) => string",
              "defaultValue": "",
              "required": false,
              "description": "Maps object values to the label shown in the input and used for text filtering."
            },
            {
              "name": "itemToStringValue",
              "type": "(item: Item) => string",
              "defaultValue": "",
              "required": false,
              "description": "Maps object values to the hidden form value."
            },
            {
              "name": "isItemEqualToValue",
              "type": "(item, value) => boolean",
              "defaultValue": "",
              "required": false,
              "description": "Custom equality check for object values. Defaults to Object.is."
            },
            {
              "name": "inputValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled search text. Leave uncontrolled for Base UI to manage query state."
            },
            {
              "name": "onInputValueChange",
              "type": "(inputValue, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the typed query changes."
            },
            {
              "name": "autoHighlight",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Automatically highlights the first matching item while filtering."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled popup state. Pair with onOpenChange."
            },
            {
              "name": "onOpenChange",
              "type": "(open, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the popup opens or closes."
            },
            {
              "name": "openOnInputClick",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, clicking the input shell opens the popup. Otherwise only focus is moved."
            },
            {
              "name": "onItemHighlighted",
              "type": "(value, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the highlighted item changes from keyboard or pointer navigation."
            }
          ]
        },
        {
          "id": "combobox-input",
          "title": "ComboboxInput",
          "summary": "Styled input shell with border, focus ring, optional label, clear button, and rotating trigger icon.",
          "notes": [],
          "fields": [
            {
              "name": "label",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional label rendered above the input shell with an associated htmlFor."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Shown when no item is selected and the input is empty."
            },
            {
              "name": "showClear",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether ComboboxClear is rendered in the input."
            },
            {
              "name": "showTrigger",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether the rotating trigger icon is rendered in the input."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Controls the input shell height."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the wrapper when label is set, otherwise onto the input shell."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the input, clear button, and trigger while applying reduced-opacity presentation."
            },
            {
              "name": "aria-invalid",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "When true, applies destructive border and ring styling to the input shell."
            }
          ]
        },
        {
          "id": "combobox-clear",
          "title": "ComboboxClear",
          "summary": "Clears the current selection. Rendered automatically inside ComboboxInput when showClear is true.",
          "notes": [
            "Visibility is managed by Base UI and only appears when a value can be cleared."
          ],
          "fields": [
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Prevents clearing while disabled."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the clear button."
            }
          ]
        },
        {
          "id": "combobox-trigger",
          "title": "ComboboxTrigger",
          "summary": "Opens or closes the popup. Rendered automatically inside ComboboxInput when showTrigger is true.",
          "notes": [],
          "fields": [
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Prevents toggling while disabled."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger button."
            }
          ]
        },
        {
          "id": "combobox-status",
          "title": "ComboboxStatus",
          "summary": "Announces async loading or empty-state copy politely to screen readers.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Status message content. Keep the root mounted and update children instead of conditionally rendering the component."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the status container."
            }
          ]
        },
        {
          "id": "combobox-content",
          "title": "ComboboxContent",
          "summary": "Portaled dropdown surface with the previous white/dark panel, border, shadow, and fade-slide motion.",
          "notes": [
            "The popup remains mounted while closing so the motion exit can complete before Base UI unmounts it.",
            "The panel width matches the input anchor and the list scrolls at the same max height as before."
          ],
          "fields": [
            {
              "name": "side",
              "type": "\"top\" | \"right\" | \"bottom\" | \"left\" | \"inline-start\" | \"inline-end\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Preferred side for the popup."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "\"start\"",
              "required": false,
              "description": "Popup alignment relative to the input anchor."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "4",
              "required": false,
              "description": "Gap between the input shell and dropdown."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the animated popup panel."
            }
          ]
        },
        {
          "id": "combobox-list",
          "title": "ComboboxList",
          "summary": "Scrollable item list rendered inside ComboboxContent with the previous max-height and motion treatment.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode | ((item, index) => ReactNode)",
              "defaultValue": "",
              "required": true,
              "description": "Render explicit children or a render function when using the root items prop."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default list spacing and scroll classes."
            }
          ]
        },
        {
          "id": "combobox-item",
          "title": "ComboboxItem",
          "summary": "Animated row with active highlight, optional description layout, and selected checkmark spring.",
          "notes": [
            "Keyboard highlight follows itemState.highlighted; pointer hover uses the same spring motion layer.",
            "Disabled items render with reduced opacity and ignore pointer interaction.",
            "ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxCollection, ComboboxChips, ComboboxChip, ComboboxChipsInput, ComboboxValue, and useComboboxAnchor are exported for larger compositions."
          ],
          "fields": [
            {
              "name": "value",
              "type": "Item",
              "defaultValue": "",
              "required": true,
              "description": "Stable value used by Base UI for selection."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Primary item label content."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional secondary line rendered below the item label, matching the prior option description UI."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default row layout and motion classes."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "file-upload",
      "name": "File Upload",
      "href": "/inputs-and-forms/file-upload",
      "url": "https://iconiqui.com/inputs-and-forms/file-upload",
      "installPackage": "@iconiq/file-upload",
      "installCommand": "npx shadcn@latest add @iconiq/file-upload",
      "registryPath": "file-upload.json",
      "registryUrl": "https://iconiqui.com/r/file-upload.json",
      "summary": "Drag-and-drop uploader with paste support, validation, optional real upload hooks, controlled queue state, and accessible progress feedback.",
      "apiSections": [
        {
          "id": "file-upload",
          "title": "FileUpload",
          "summary": "Drag-and-drop uploader with paste support, validation, optional real upload hooks, controlled queue state, and accessible progress feedback.",
          "notes": [
            "The drop zone is keyboard accessible and opens the hidden file input on Enter or Space.",
            "Both drag-and-drop, click-to-browse, and paste flow through the same queue logic, so accept filtering and limits stay consistent.",
            "The hidden file input stays synced to the current queue through the DataTransfer API for native form submission.",
            "Motion for drop, list, and progress visuals honors prefers-reduced-motion automatically."
          ],
          "fields": [
            {
              "name": "accept",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional accept string passed to the hidden file input and enforced for dropped or pasted files, including MIME types like image/* and extensions like .pdf."
            },
            {
              "name": "multiple",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Allows selecting or dropping multiple files. When set to false, the next selection replaces the existing queue."
            },
            {
              "name": "maxFiles",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Caps the queue length. New files are prepended, and anything beyond the limit is rejected with inline feedback."
            },
            {
              "name": "maxSize",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Maximum file size in bytes. Files above the limit are rejected with inline feedback."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables click, drag, paste, keyboard activation, remove, clear-all, and the hidden file input."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Forwards required validation to the hidden file input when the queue is empty."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Marks the drop zone with invalid styling for external validation states."
            },
            {
              "name": "preventDuplicates",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Rejects files that match an existing queue item by name, size, and lastModified."
            },
            {
              "name": "simulateUpload",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controls built-in progress simulation. Defaults to true when onUpload is not provided, and false when onUpload is set."
            },
            {
              "name": "showClearAll",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Shows a clear-all action when the queue has files."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Passes a form field name through to the hidden file input. The queue stays synced to the input for native form submission."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Root id used for the hidden file input and internal aria-describedby wiring."
            },
            {
              "name": "ariaLabel",
              "type": "string",
              "defaultValue": "Upload files",
              "required": false,
              "description": "Accessible label for the keyboard-focusable drop zone."
            },
            {
              "name": "ariaDescribedBy",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Additional ids merged into the drop zone aria-describedby list."
            },
            {
              "name": "description",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper text rendered above the drop zone."
            },
            {
              "name": "dropzoneTitle",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Custom primary drop zone label."
            },
            {
              "name": "dropzoneDescription",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Custom secondary drop zone hint. When omitted, a hint is generated from accept, maxFiles, and maxSize."
            },
            {
              "name": "libraryLabel",
              "type": "string",
              "defaultValue": "Library",
              "required": false,
              "description": "Heading label for the queued file list."
            },
            {
              "name": "browseLabel",
              "type": "string",
              "defaultValue": "Browse",
              "required": false,
              "description": "Label for the browse affordance in the drop zone."
            },
            {
              "name": "clearAllLabel",
              "type": "string",
              "defaultValue": "Clear all",
              "required": false,
              "description": "Label for the clear-all action."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Adds classes to the outer wrapper without changing the component internals."
            },
            {
              "name": "defaultValue",
              "type": "File[]",
              "defaultValue": "",
              "required": false,
              "description": "Initial queue files for uncontrolled usage."
            },
            {
              "name": "value",
              "type": "FileUploadItem[]",
              "defaultValue": "",
              "required": false,
              "description": "Controlled queue state including per-file progress and status."
            },
            {
              "name": "validateFile",
              "type": "(file: File) => boolean | string",
              "defaultValue": "",
              "required": false,
              "description": "Custom per-file validator. Return true to accept, false to reject, or a string error message."
            },
            {
              "name": "onFilesChange",
              "type": "(files: File[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when files are added or removed from the queue. It does not fire on every progress tick."
            },
            {
              "name": "onValueChange",
              "type": "(items: FileUploadItem[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the queue changes, including status and progress updates in controlled mode."
            },
            {
              "name": "onFileRemove",
              "type": "(file: File, nextFiles: File[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called after a queued file is removed. The second argument contains the remaining files in queue order."
            },
            {
              "name": "onReject",
              "type": "(files: File[], reason: FileUploadRejectReason, message: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when one or more files fail accept, size, duplicate, max-files, validation, or disabled checks."
            },
            {
              "name": "onUpload",
              "type": "(file: File, context: { setProgress: (progress: number) => void }) => Promise<void>",
              "defaultValue": "",
              "required": false,
              "description": "Optional real upload handler. When provided, built-in progress simulation is disabled unless simulateUpload is explicitly set to true."
            },
            {
              "name": "onUploadComplete",
              "type": "(files: File[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called once every item in the current queue reaches done status."
            }
          ]
        },
        {
          "id": "file-upload-behavior",
          "title": "Built-in behavior",
          "summary": "The component owns preview lifecycle, progress visuals, retry, and inline rejection messaging unless you take over with onUpload or controlled value.",
          "notes": [
            "Preview object URLs are cleaned up on remove, clear-all, trim, and unmount.",
            "Each queue item id is built from the file name, size, lastModified, and a random suffix to reduce collisions between repeated uploads.",
            "FileUploadRejectReason values: accept, max-size, max-files, duplicate, validation, disabled."
          ],
          "fields": [
            {
              "name": "progress state",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "Each added file starts in uploading state. Without onUpload, a simulated progress loop runs until done. With onUpload, progress follows setProgress from your handler."
            },
            {
              "name": "error + retry",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "Failed onUpload calls move a file to error status and expose a retry action that reruns the upload handler or restarts simulation."
            },
            {
              "name": "image and video previews",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "Image and video files receive object URL previews. Upload progress renders as an overlay on thumbnails and as a ring for other file types."
            },
            {
              "name": "remove + clear all",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "Each queued file can be removed individually. Clear all empties the queue and revokes preview URLs immediately."
            }
          ]
        }
      ],
      "dependencies": [
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "input",
      "name": "Input",
      "href": "/inputs-and-forms/input",
      "url": "https://iconiqui.com/inputs-and-forms/input",
      "installPackage": "@iconiq/input",
      "installCommand": "npx shadcn@latest add @iconiq/input",
      "registryPath": "input.json",
      "registryUrl": "https://iconiqui.com/r/input.json",
      "summary": "Input with a spring-animated caret.",
      "apiSections": [
        {
          "id": "input",
          "title": "Input",
          "summary": "Input with a spring-animated caret.",
          "notes": [
            "Built on `@base-ui/react/input` and works with Base UI `Field` for labels, descriptions, and validation state.",
            "Uses a hidden measurement span to position the caret across fonts, password bullets, RTL layout, and horizontal scroll.",
            "Respects `prefers-reduced-motion` by snapping the caret spring when motion is reduced.",
            "Clicking the input shell focuses the native control unless the click lands on a trailing action.",
            "Standard input attributes such as `autoComplete`, `name`, `required`, `aria-*`, and `data-*` are forwarded to the native element."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled input value. Pair with `onValueChange` or `onChange` when the parent owns the text."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial value for uncontrolled usage."
            },
            {
              "name": "onValueChange",
              "type": "(value: string, eventDetails: InputChangeEventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Base UI change handler with the next string value and event metadata. Preferred for controlled forms."
            },
            {
              "name": "onChange",
              "type": "React.ChangeEventHandler<HTMLInputElement>",
              "defaultValue": "",
              "required": false,
              "description": "Native change handler fired after typing, paste, cut, or autofill."
            },
            {
              "name": "type",
              "type": "React.HTMLInputTypeAttribute",
              "defaultValue": "text",
              "required": false,
              "description": "Native input type. Smooth caret is enabled for text-like types only (`text`, `search`, `url`, `email`, `password`, `tel`)."
            },
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional field label rendered above the control with an associated `htmlFor` id."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the optional label element."
            },
            {
              "name": "description",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper text rendered below the input shell and linked with `aria-describedby`."
            },
            {
              "name": "descriptionClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the description element."
            },
            {
              "name": "errorMessage",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Validation message rendered below the field. Also sets `aria-invalid` and links through `aria-describedby`."
            },
            {
              "name": "errorMessageClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the error message element."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies destructive shell styling and forwards `aria-invalid` to the native input."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Forwards native required validation and appends a visual asterisk to the label."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\"",
              "defaultValue": "default",
              "required": false,
              "description": "Controls the input shell height."
            },
            {
              "name": "shellClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the bordered input shell."
            },
            {
              "name": "wrapperClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the outer field wrapper when `label`, `description`, or `errorMessage` is set. Otherwise merged onto the shell."
            },
            {
              "name": "startAdornment",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional leading slot rendered inside the input shell."
            },
            {
              "name": "endAdornment",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional trailing slot rendered inside the input shell after built-in actions."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Additional trailing content rendered inside the input shell after adornments and actions."
            },
            {
              "name": "showClear",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, renders a clear button while the field has a value and is not disabled or read-only."
            },
            {
              "name": "showPasswordToggle",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "When `type=\"password\"`, shows a visibility toggle by default. Pass `false` to hide it."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Placeholder shown when the field is empty."
            },
            {
              "name": "fontSize",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Optional pixel font size override for the inner field. Defaults to the standard `text-sm` input sizing."
            },
            {
              "name": "spring",
              "type": "{ stiffness?: number; damping?: number; mass?: number }",
              "defaultValue": "",
              "required": false,
              "description": "Spring config for caret movement. Defaults to stiffness 500, damping 30, mass 0.5."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional id forwarded to the input. A generated id is used when omitted so labels stay associated."
            },
            {
              "name": "className",
              "type": "string | ((state: InputState) => string)",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the native input element. Base UI also supports a state callback."
            },
            {
              "name": "style",
              "type": "React.CSSProperties | ((state: InputState) => React.CSSProperties)",
              "defaultValue": "",
              "required": false,
              "description": "Inline styles merged onto the native input element. Base UI also supports a state callback."
            },
            {
              "name": "render",
              "type": "React.ReactElement | ((props: React.ComponentProps<'input'>) => React.ReactElement)",
              "defaultValue": "",
              "required": false,
              "description": "Base UI render override for the native input element. Custom renders disable the smooth caret."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables interaction on the native input."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Keeps the field focusable while applying muted shell styling and blocking edits."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/input",
        "motion"
      ]
    },
    {
      "slug": "input-otp",
      "name": "Input OTP",
      "href": "/inputs-and-forms/input-otp",
      "url": "https://iconiqui.com/inputs-and-forms/input-otp",
      "installPackage": "@iconiq/input-otp",
      "installCommand": "npx shadcn@latest add @iconiq/input-otp",
      "registryPath": "input-otp.json",
      "registryUrl": "https://iconiqui.com/r/input-otp.json",
      "summary": "Root wrapper around Base UI OTP Field with optional label, description, error message, size, and invalid styling for complete form-field semantics.",
      "apiSections": [
        {
          "id": "otp",
          "title": "OTP",
          "summary": "Root wrapper around Base UI OTP Field with optional label, description, error message, size, and invalid styling for complete form-field semantics.",
          "notes": [
            "Built on `OTPFieldPreview` from `@base-ui/react/otp-field`.",
            "Prefer `OTPSlots` so slot count always matches `length`, or render one `OTPSlot` per character manually.",
            "Scoped theme tokens ship with the component so registry installs look correct without extra theme setup.",
            "Motion respects `prefers-reduced-motion` by snapping borders, characters, and caret animations.",
            "Pair `label`, `description`, and `errorMessage` for the same form-field pattern used by `Input`."
          ],
          "fields": [
            {
              "name": "length",
              "type": "number",
              "defaultValue": "",
              "required": true,
              "description": "Number of OTP characters. Required so Base UI can clamp values, detect completion, and manage focus order."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled OTP string. Pair with `onValueChange` when the parent owns the code."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial value for uncontrolled usage."
            },
            {
              "name": "onValueChange",
              "type": "(value: string, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the OTP value changes from typing, paste, backspace, or keyboard navigation."
            },
            {
              "name": "onValueComplete",
              "type": "(value: string, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when all slots are filled, including when a complete code is pasted."
            },
            {
              "name": "onValueInvalid",
              "type": "(value: string, eventDetails) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when entered text contains characters rejected by validation or normalization."
            },
            {
              "name": "validationType",
              "type": "\"numeric\" | \"alpha\" | \"alphanumeric\" | \"none\"",
              "defaultValue": "\"numeric\"",
              "required": false,
              "description": "Built-in validation applied before values are stored. Use `alphanumeric` for backup or recovery codes."
            },
            {
              "name": "normalizeValue",
              "type": "(value: string) => string",
              "defaultValue": "",
              "required": false,
              "description": "Normalizes accepted values before state updates, such as uppercasing recovery codes."
            },
            {
              "name": "mask",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Obscures entered characters in the animated slot display and native inputs."
            },
            {
              "name": "autoSubmit",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Submits the owning form automatically when the OTP becomes complete."
            },
            {
              "name": "autoComplete",
              "type": "string",
              "defaultValue": "\"one-time-code\"",
              "required": false,
              "description": "Autocomplete hint applied to the first slot and hidden validation input for SMS autofill."
            },
            {
              "name": "inputMode",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Virtual keyboard hint applied to slot inputs. Override when `validationType` defaults are not ideal."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Identifies the field when a form is submitted."
            },
            {
              "name": "form",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Associates the hidden validation input with a form elsewhere in the document."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Applied to the first input. Subsequent inputs derive ids from it. Used by `label` and `htmlFor`."
            },
            {
              "name": "label",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Visible field label rendered above the OTP group with `htmlFor` wired to the first slot."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Supporting text below the field, linked through `aria-describedby`."
            },
            {
              "name": "errorMessage",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Error text below the field. Also sets invalid styling when present."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Marks the field invalid for `aria-invalid` and destructive slot borders."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Whether the user must enter a value before submitting a form."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables interaction across every slot."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Prevents editing while keeping the value visible."
            },
            {
              "name": "size",
              "type": "\"default\" | \"sm\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Slot dimensions and typography scale."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the root flex container."
            },
            {
              "name": "wrapperClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the outer field wrapper when label or help text is present."
            },
            {
              "name": "containerClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Legacy alias merged onto the root container alongside `className`."
            }
          ]
        },
        {
          "id": "otp-slots",
          "title": "OTPSlots",
          "summary": "Convenience layout that renders the correct number of slots from the parent `OTP` length, with optional separators and placeholder hints.",
          "notes": [
            "Must be rendered inside `OTP` so it can read the configured `length`.",
            "Adds `aria-label` to every slot after the first one for screen reader context."
          ],
          "fields": [
            {
              "name": "separatorAfter",
              "type": "number | number[]",
              "defaultValue": "",
              "required": false,
              "description": "Inserts `OTPSeparator` before each listed zero-based index, such as `3` for 3-3 or `[3, 6]` for 3-3-3 codes."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Hint shown in empty slots until the active slot receives focus."
            },
            {
              "name": "slotClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes forwarded to every rendered `OTPSlot`."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the internal `OTPGroup` wrapper."
            }
          ]
        },
        {
          "id": "otp-slot",
          "title": "OTPSlot",
          "summary": "Animated character cell with spring focus ring, pop-in digit motion, masked bullets, and a pulsing caret on the active empty slot.",
          "notes": [
            "The real input is visually hidden but remains focusable for typing, paste, and mobile one-time-code autofill.",
            "Slot order is determined by render order; the legacy `index` prop is accepted but ignored.",
            "Destructive borders apply when `OTP` is invalid or when Base UI `Field` reports `data-invalid`."
          ],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the animated slot surface."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Per-slot placeholder hint when composing slots manually."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible label for slots after the first one. The first slot inherits the field label from `OTP` or a surrounding `<label>`."
            }
          ]
        },
        {
          "id": "otp-group",
          "title": "OTPGroup",
          "summary": "Optional layout wrapper that groups slots with consistent spacing when you need multiple visual clusters.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the group flex container."
            }
          ]
        },
        {
          "id": "otp-separator",
          "title": "OTPSeparator",
          "summary": "Screen-reader-accessible separator between OTP groups, rendered with the dotted divider used in the Iconiq preview.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the separator element."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Separator orientation passed through to Base UI."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-radio-group",
      "name": "Radio Group",
      "href": "/inputs-and-forms/radio-group",
      "url": "https://iconiqui.com/inputs-and-forms/radio-group",
      "installPackage": "@iconiq/b-radio-group",
      "installCommand": "npx shadcn@latest add @iconiq/b-radio-group",
      "registryPath": "b-radio-group.json",
      "registryUrl": "https://iconiqui.com/r/b-radio-group.json",
      "summary": "Options are plain objects consumed by the RadioGroup component.",
      "apiSections": [
        {
          "id": "radio-option",
          "title": "Radio option shape",
          "summary": "Options are plain objects consumed by the RadioGroup component.",
          "notes": [],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Unique identifier for the option and the selected value reported through onChange."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Primary line shown for the option."
            },
            {
              "name": "description",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional secondary line shown below the label with reduced emphasis."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables this option while keeping it visible in the list."
            }
          ]
        },
        {
          "id": "radio-group",
          "title": "RadioGroup",
          "summary": "Single-choice selector with animated rows, form semantics, and support for both controlled and uncontrolled state.",
          "notes": [
            "If options is empty, the component returns null rather than rendering an empty radiogroup.",
            "In uncontrolled mode, the selected value normalizes to the first enabled option when the current selection disappears or becomes disabled.",
            "In controlled mode, an invalid value leaves no row selected until the parent corrects the value.",
            "Use label with required to show the destructive asterisk. The group is wrapped in a native fieldset with legend for form semantics.",
            "Motion respects prefers-reduced-motion for entrance, hover, and ring transitions."
          ],
          "fields": [
            {
              "name": "options",
              "type": "{ value: string; label: string; description?: string; disabled?: boolean }[]",
              "defaultValue": "",
              "required": true,
              "description": "Available choices in display order."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial uncontrolled selection. If omitted or invalid, the component falls back to the first option."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value. When provided, parent state owns selection and the component only reports changes."
            },
            {
              "name": "onChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever a user selects a row."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables the entire group and all rows."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the group invalid for assistive tech and applies destructive focus styling."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Visible field label rendered above the group. When required is true, a destructive asterisk is appended."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the visible field label."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the native radio inputs as required for form validation and shows a destructive asterisk when label is set."
            },
            {
              "name": "form",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Associates the native radio inputs with a form element by id when the group is rendered outside that form."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "",
              "required": false,
              "description": "Layout direction for the option rows. Defaults to vertical."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Shared radio input name. If omitted, the component generates one per instance."
            },
            {
              "name": "\"aria-describedby\"",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "ID of helper or error text associated with the radiogroup."
            },
            {
              "name": "\"aria-label\"",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the radiogroup when label is omitted. Prefer label when you need a visible field title."
            },
            {
              "name": "\"aria-labelledby\"",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "ID of external text that labels the radiogroup. Use this instead of aria-label when visible copy already exists."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root wrapper for spacing or sizing adjustments."
            }
          ]
        },
        {
          "id": "radio-motion-a11y",
          "title": "Motion and accessibility",
          "summary": "The component wraps native radio inputs in an animated row shell so keyboard, form, and screen-reader behavior stay intact.",
          "notes": [
            "The root keeps radiogroup semantics and each input supports Arrow keys plus Home and End navigation with a single tab stop inside the set.",
            "Disabled rows skip hover and tap motion while remaining visible."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-select",
      "name": "Select",
      "href": "/inputs-and-forms/select",
      "url": "https://iconiqui.com/inputs-and-forms/select",
      "installPackage": "@iconiq/b-select",
      "installCommand": "npx shadcn@latest add @iconiq/b-select",
      "registryPath": "b-select.json",
      "registryUrl": "https://iconiqui.com/r/b-select.json",
      "summary": "Root select controller. Compose SelectTrigger, SelectValue, SelectContent, and SelectItem inside it.",
      "apiSections": [
        {
          "id": "select",
          "title": "Select",
          "summary": "Root select controller. Compose SelectTrigger, SelectValue, SelectContent, and SelectItem inside it.",
          "notes": [
            "The root wraps the provider primitive in the Iconiq motion layer so child parts share one animation setup.",
            "Selection and open state can be controlled or uncontrolled while still preserving primitive keyboard navigation and typeahead."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value. Leave unset with defaultValue for uncontrolled usage."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial selected value for uncontrolled usage."
            },
            {
              "name": "onValueChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a SelectItem is chosen. The menu closes immediately afterward."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled popup state. Pair with onOpenChange when parent state owns the menu."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Initial popup state for uncontrolled usage."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the trigger, keyboard, item choice, or outside interaction opens or closes the menu."
            }
          ]
        },
        {
          "id": "select-trigger",
          "title": "SelectTrigger",
          "summary": "Button that opens the menu and hosts SelectValue plus the animated chevron.",
          "notes": [
            "The trigger keeps the previous press spring, hover color, focus ring, and chevron rotation."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Usually a SelectValue. The chevron icon is appended automatically."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Data attribute hook for compact trigger variants without changing the default Iconiq styling."
            },
            {
              "name": "label",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional field label rendered above the trigger and linked with htmlFor."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper copy rendered above the trigger. Linked to the trigger with aria-describedby."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger button. Use it for local width such as w-full max-w-48."
            }
          ]
        },
        {
          "id": "select-value",
          "title": "SelectValue",
          "summary": "Trigger label driven by the selected value primitive, with optional render-prop children for API-backed labels and icons.",
          "notes": [
            "Without children, the trigger shows the selected value string. Pass a render prop when you need human-readable labels from external data."
          ],
          "fields": [
            {
              "name": "placeholder",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Shown in the trigger when no item is selected."
            },
            {
              "name": "children",
              "type": "ReactNode | (value: string | undefined) => ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom trigger content. Use the render prop to resolve labels or icons from your options array when data is loaded dynamically."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the value span. The default keeps text truncated inside the trigger."
            }
          ]
        },
        {
          "id": "select-overlay",
          "title": "SelectContent",
          "summary": "Portaled menu surface with the previous Iconiq dropdown fade, slide, and viewport clamping.",
          "notes": [
            "The popup is portaled, width-matches the trigger by default, and caps height at 320px before scrolling.",
            "Scroll up/down arrow slots are included for long menus while the panel keeps the same entry and exit animation."
          ],
          "fields": [
            {
              "name": "side",
              "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Preferred side for the menu before collision handling."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "\"start\"",
              "required": false,
              "description": "Horizontal alignment against the trigger or anchor."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "8",
              "required": false,
              "description": "Gap between trigger and menu. The default matches the prior select spacing."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the animated menu panel for local max height, width, or surface overrides."
            }
          ]
        },
        {
          "id": "select-item",
          "title": "SelectItem",
          "summary": "Selectable row with primitive keyboard behavior plus the previous active-row highlight and checkmark motion.",
          "notes": [],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable value reported through onValueChange and used to determine the selected checkmark."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional display label for the item and selected trigger value. Falls back to textValue, string children, then value."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom row content. When omitted, label or value is rendered in the menu."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional leading icon rendered inline with the item label and selected trigger value."
            },
            {
              "name": "textValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional plain-text fallback used for trigger display and typeahead when label is omitted."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Prevents the item from receiving selection."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the row while preserving the animated active highlight and selected checkmark."
            }
          ]
        },
        {
          "id": "select-group",
          "title": "SelectGroup",
          "summary": "Section wrapper for grouped options inside SelectContent.",
          "notes": [
            "SelectGroup adds the same section spacing as the previous grouped option renderer."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "SelectItem rows or nested option content rendered inside the grouped section."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default grouped section spacing classes."
            }
          ]
        },
        {
          "id": "select-label",
          "title": "SelectLabel",
          "summary": "Compact section label rendered above grouped SelectItem rows.",
          "notes": [
            "SelectLabel keeps the compact uppercase section label treatment."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Section label text rendered above a SelectGroup."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the uppercase section label typography classes."
            }
          ]
        },
        {
          "id": "select-separator",
          "title": "SelectSeparator",
          "summary": "Non-interactive divider between item clusters inside the menu.",
          "notes": [
            "SelectSeparator renders a non-interactive border-token divider between item clusters."
          ],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default border-token divider classes."
            }
          ]
        },
        {
          "id": "select-scroll-up",
          "title": "SelectScrollUpButton",
          "summary": "Scroll affordance rendered above long SelectContent lists.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default scroll button layout classes."
            }
          ]
        },
        {
          "id": "select-scroll-down",
          "title": "SelectScrollDownButton",
          "summary": "Scroll affordance rendered below long SelectContent lists.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default scroll button layout classes."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "b-slider",
      "name": "Slider",
      "href": "/inputs-and-forms/slider",
      "url": "https://iconiqui.com/inputs-and-forms/slider",
      "installPackage": "@iconiq/b-slider",
      "installCommand": "npx shadcn@latest add @iconiq/b-slider",
      "registryPath": "b-slider.json",
      "registryUrl": "https://iconiqui.com/r/b-slider.json",
      "summary": "Pointer-driven range control with optional single or dual-thumb value management, field chrome, and formatting helpers.",
      "apiSections": [
        {
          "id": "slider",
          "title": "Slider",
          "summary": "Pointer-driven range control with optional single or dual-thumb value management, field chrome, and formatting helpers.",
          "notes": [
            "When value is undefined, the component stores the current value internally and updates it during drag operations.",
            "The displayed value is derived from the animated motion value, so the readout stays in sync with the spring animation rather than jumping immediately.",
            "Touch interaction keeps vertical page scrolling available with pan-y on horizontal sliders while still supporting dragging on the track itself.",
            "Spring motion honors prefers-reduced-motion and settles instantly when reduced motion is requested."
          ],
          "fields": [
            {
              "name": "value",
              "type": "number | [number, number]",
              "defaultValue": "",
              "required": false,
              "description": "Controlled value. Use a number for single-thumb mode or a tuple when range is enabled."
            },
            {
              "name": "defaultValue",
              "type": "number | [number, number]",
              "defaultValue": "50",
              "required": false,
              "description": "Initial internal value used when value is not supplied. Defaults to [25, 75] when range is true."
            },
            {
              "name": "range",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Renders two thumbs and fills the track between the low and high values."
            },
            {
              "name": "min",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Lower bound used for clamping and display mapping."
            },
            {
              "name": "max",
              "type": "number",
              "defaultValue": "100",
              "required": false,
              "description": "Upper bound used for clamping and display mapping."
            },
            {
              "name": "step",
              "type": "number",
              "defaultValue": "1",
              "required": false,
              "description": "Step size applied after translating pointer position into a raw numeric value."
            },
            {
              "name": "onChange",
              "type": "(value: number | [number, number]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called for live value updates from pointer or keyboard input when the snapped value actually changes."
            },
            {
              "name": "onValueCommit",
              "type": "(value: number | [number, number]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when an interaction is committed, such as releasing a drag or finishing a keyboard step."
            },
            {
              "name": "showValue",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether the live numeric readout is shown on the right side of the label row."
            },
            {
              "name": "valueDecimals",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Controls how many decimal places are shown in the readout when you want precision without custom formatting."
            },
            {
              "name": "formatValue",
              "type": "(value: number) => string",
              "defaultValue": "",
              "required": false,
              "description": "Optional formatter for the visible readout and aria-valuetext, useful for units such as dB, percent, or milliseconds."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional label shown on the left side of the header row above the track."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper text rendered below the track and linked through aria-describedby."
            },
            {
              "name": "errorMessage",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Validation message rendered below the track with alert semantics when present."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the slider as invalid for assistive tech even when no errorMessage is rendered."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Prevents interaction, removes the slider from tab order, and applies disabled styling."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Keeps the slider focusable while blocking pointer and keyboard value changes."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root wrapper so you can constrain width, spacing, or layout."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "md",
              "required": false,
              "description": "Scales the hit area, thumb, and track thickness together while preserving the default md footprint."
            },
            {
              "name": "inverted",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Reverses pointer and keyboard direction. RTL documents also reverse horizontal pointer mapping."
            },
            {
              "name": "marksInteractive",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Turns tick marks into buttons that jump the nearest thumb to the mark value."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "When provided, renders hidden inputs so the current value can participate in native form submission."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional id applied to the focusable slider element and used to derive description and error ids."
            },
            {
              "name": "ariaLabel",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name used when no visible label is rendered for the slider. Falls back to Slider."
            },
            {
              "name": "ariaLabelledBy",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "ID of an external label element that should be announced instead of the built-in label."
            },
            {
              "name": "ariaDescribedBy",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Additional ids merged into aria-describedby alongside description and errorMessage."
            },
            {
              "name": "marks",
              "type": "{ value: number; label?: string }[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional tick marks rendered below or beside the track so large ranges can include landmarks like Low, Medium, and High."
            }
          ]
        },
        {
          "id": "slider-interaction",
          "title": "Interaction model",
          "summary": "Slider supports pointer, keyboard, and screen-reader friendly range semantics.",
          "notes": [
            "The thumb and filled track animate with springs whenever the current value changes.",
            "Pointer capture is taken on pointer down and released on pointer up or cancel, which keeps dragging stable even when the pointer leaves the track.",
            "Keyboard support includes Arrow keys for step changes, Page Up and Page Down for larger jumps, and Home and End for min and max.",
            "Range mode tracks an active thumb during keyboard and pointer interaction so the nearest endpoint moves first."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-switch",
      "name": "Switch",
      "href": "/inputs-and-forms/switch",
      "url": "https://iconiqui.com/inputs-and-forms/switch",
      "installPackage": "@iconiq/b-switch",
      "installCommand": "npx shadcn@latest add @iconiq/b-switch",
      "registryPath": "b-switch.json",
      "registryUrl": "https://iconiqui.com/r/b-switch.json",
      "summary": "Binary on or off control with motion-driven thumb travel, foreground fill sweep, and optional label and description field chrome.",
      "apiSections": [
        {
          "id": "switch",
          "title": "Switch",
          "summary": "Binary on or off control with motion-driven thumb travel, foreground fill sweep, and optional label and description field chrome.",
          "notes": [
            "Additional switch props such as id, aria-label, name, value, required, form, and inputRef are forwarded to the root control.",
            "If you provide label or description, the component wraps the row in a native label element so clicking the text also toggles the switch.",
            "When no label or description is provided, pass aria-label for an accessible name."
          ],
          "fields": [
            {
              "name": "checked",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled checked state. Pass this when the parent owns the current on or off value."
            },
            {
              "name": "defaultChecked",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Initial checked state for uncontrolled usage. The component keeps its local animation state in sync with this mode too."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the switch changes state, after the thumb and fill animation sequence starts."
            },
            {
              "name": "label",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional label rendered beside the switch. When provided with description, both sit inside a native label element linked by htmlFor."
            },
            {
              "name": "description",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional helper copy rendered under the label and linked through aria-describedby."
            },
            {
              "name": "labelSide",
              "type": "\"left\" | \"right\"",
              "defaultValue": "right",
              "required": false,
              "description": "Controls which side of the switch the label and description block appears on."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the label text wrapper."
            },
            {
              "name": "descriptionClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the description text wrapper."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\" | \"lg\"",
              "defaultValue": "default",
              "required": false,
              "description": "Scales the track, thumb, label text, and row gap together."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Disables pointer and keyboard interaction, and dims the switch and optional label together."
            },
            {
              "name": "readOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Shows the current state without allowing toggles. Useful for locked preference rows."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Forwards native required validation to the hidden input and appends a visual asterisk to the label."
            },
            {
              "name": "invalid",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies destructive ring styling and aria-invalid for form validation feedback."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the switch track for local spacing or surface overrides."
            },
            {
              "name": "wrapperClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer label wrapper when label or description text is present."
            }
          ]
        },
        {
          "id": "switch-motion",
          "title": "Motion and interaction behavior",
          "summary": "The switch uses separate motion values for thumb travel, thumb squash, and track fill opacity so the state change feels tactile without becoming noisy.",
          "notes": [
            "Pointer press slightly flattens the thumb before release, then the thumb snaps back with a softer bounce after the state change.",
            "The dark foreground fill fades in as the thumb travels right, rather than swapping track color instantly.",
            "Controlled and uncontrolled usage both keep the thumb animation synchronized with the underlying switch state.",
            "Thumb travel, squash, and fill animations honor prefers-reduced-motion automatically.",
            "The track keeps a fixed left-to-right thumb direction via dir=ltr so RTL layouts do not invert the on state."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "theme-toggle",
      "name": "Theme Toggle",
      "href": "/inputs-and-forms/theme-toggle",
      "url": "https://iconiqui.com/inputs-and-forms/theme-toggle",
      "installPackage": "@iconiq/theme-toggle",
      "installCommand": "npx shadcn@latest add @iconiq/theme-toggle",
      "registryPath": "theme-toggle.json",
      "registryUrl": "https://iconiqui.com/r/theme-toggle.json",
      "summary": "Client-only pill switch that toggles light and dark mode by syncing the `dark` class on `document.documentElement`, persisting to `localStorage`, and falling back to `prefers-color-scheme` when no saved preference exists.",
      "apiSections": [
        {
          "id": "theme-toggle",
          "title": "ThemeToggle",
          "summary": "Client-only pill switch that toggles light and dark mode by syncing the `dark` class on `document.documentElement`, persisting to `localStorage`, and falling back to `prefers-color-scheme` when no saved preference exists.",
          "notes": [
            "On mount, the control resolves theme from `localStorage`, then `prefers-color-scheme` when `enableSystem` is true, then the existing document `dark` class.",
            "User toggles persist as `light` or `dark` in `localStorage` and stop following system changes until storage is cleared or set back to `system`.",
            "For next-themes, use controlled mode with `pressed`, `onPressedChange`, `persist={false}`, and `applyToDocument={false}`.",
            "Install path is `components/ui/theme-toggle.tsx` with the `ThemeToggle` export."
          ],
          "fields": [
            {
              "name": "size",
              "type": "\"sm\" | \"md\" | \"lg\"",
              "defaultValue": "md",
              "required": false,
              "description": "Controls track, knob, and icon dimensions. Use `sm` in compact toolbars and `lg` for hero or settings layouts."
            },
            {
              "name": "pressed",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled dark-mode state. Pair with `onPressedChange` when wiring the toggle to next-themes or another theme provider."
            },
            {
              "name": "defaultPressed",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Initial dark-mode state for uncontrolled usage when no saved preference or system preference is available."
            },
            {
              "name": "onPressedChange",
              "type": "(pressed: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the user toggles theme. Receives `true` for dark mode and `false` for light mode."
            },
            {
              "name": "persist",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When enabled, writes `light` or `dark` to `localStorage` using `storageKey`. Disable when an external theme layer owns persistence."
            },
            {
              "name": "storageKey",
              "type": "string",
              "defaultValue": "\"theme\"",
              "required": false,
              "description": "localStorage key used for saved theme preference. Defaults to `theme` for next-themes compatibility."
            },
            {
              "name": "enableSystem",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When no saved preference exists, resolve the initial theme from `prefers-color-scheme` and keep following system changes until the user toggles manually."
            },
            {
              "name": "applyToDocument",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When enabled, toggles the `dark` class and `color-scheme` style on `document.documentElement`. Disable for controlled integrations that already apply theme changes."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents interaction and dims the control."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "\"Toggle theme\"",
              "required": false,
              "description": "Accessible name for the toggle button."
            },
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Forwarded to the underlying toggle button."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the root button for spacing or layout in your header or settings panel."
            },
            {
              "name": "trackClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the outer track button."
            },
            {
              "name": "knobClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the sliding knob."
            },
            {
              "name": "ref",
              "type": "Ref<HTMLButtonElement>",
              "defaultValue": "",
              "required": false,
              "description": "Ref forwarded to the rendered button element."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/toggle",
        "lucide-react"
      ]
    },
    {
      "slug": "wheel-picker",
      "name": "Wheel Picker",
      "href": "/inputs-and-forms/wheel-picker",
      "url": "https://iconiqui.com/inputs-and-forms/wheel-picker",
      "installPackage": "@iconiq/wheel-picker",
      "installCommand": "npx shadcn@latest add @iconiq/wheel-picker",
      "registryPath": "wheel-picker.json",
      "registryUrl": "https://iconiqui.com/r/wheel-picker.json",
      "summary": "iOS-style wheel picker with a 3D barrel, drag and flick inertia, detent snapping, velocity-driven motion blur, a per-row emphasis morph into the selection lens, optional looping columns, and reduced-motion aware springs.",
      "apiSections": [],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "b-collapsible",
      "name": "Collapsible",
      "href": "/layout-and-toolbars/collapsible",
      "url": "https://iconiqui.com/layout-and-toolbars/collapsible",
      "installPackage": "@iconiq/b-collapsible",
      "installCommand": "npx shadcn@latest add @iconiq/b-collapsible",
      "registryPath": "b-collapsible.json",
      "registryUrl": "https://iconiqui.com/r/b-collapsible.json",
      "summary": "Collapsible with the same Iconiq API layered over Base UI primitives, preserving the same height, icon, and content transitions as the Radix version.",
      "apiSections": [],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "infiniteribbon",
      "name": "Infinite Ribbon",
      "href": "/layout-and-toolbars/infiniteribbon",
      "url": "https://iconiqui.com/layout-and-toolbars/infiniteribbon",
      "installPackage": "@iconiq/infiniteribbon",
      "installCommand": "npx shadcn@latest add @iconiq/infiniteribbon",
      "registryPath": "infiniteribbon.json",
      "registryUrl": "https://iconiqui.com/r/infiniteribbon.json",
      "summary": "Full-width looping ribbon that duplicates content into a seamless marquee track with theme variants, viewport-aware repeat, reduced-motion support, and optional link banners.",
      "apiSections": [
        {
          "id": "infiniteribbon",
          "title": "InfiniteRibbon",
          "summary": "Full-width looping ribbon that duplicates content into a seamless marquee track with theme variants, viewport-aware repeat, reduced-motion support, and optional link banners.",
          "notes": [
            "Non-interactive ribbons render a single screen-reader-only copy of the content while the animated track stays `aria-hidden`.",
            "Keyframes are injected once through a shared style tag, so no global Tailwind animation extension is required.",
            "When `prefers-reduced-motion` is enabled, the ribbon shows a static centered copy instead of animating.",
            "Rotation is applied on an outer wrapper so you can still use transform utilities on the root element."
          ],
          "fields": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Content repeated across the moving ribbon. Short announcement copy works best because it stays legible while scrolling."
            },
            {
              "name": "items",
              "type": "string[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional list of strings rendered with `separator` between each item instead of a single `children` node."
            },
            {
              "name": "separator",
              "type": "React.ReactNode",
              "defaultValue": "\" · \"",
              "required": false,
              "description": "Divider rendered between `items` entries."
            },
            {
              "name": "repeat",
              "type": "number",
              "defaultValue": "5",
              "required": false,
              "description": "Minimum number of copies rendered per half of the seamless track. The component auto-expands this value when the viewport is wider than the measured segment."
            },
            {
              "name": "duration",
              "type": "number",
              "defaultValue": "10",
              "required": false,
              "description": "Loop duration in seconds for one half of the track. Ignored when `speed` is set. Values below 0.1 are clamped."
            },
            {
              "name": "speed",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "Optional scroll speed in pixels per second. When set, loop duration is derived from the measured half-track distance."
            },
            {
              "name": "reverse",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Runs the marquee from left to right instead of the default right-to-left movement."
            },
            {
              "name": "rotation",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Degrees applied to an outer wrapper so additional transforms on the root do not conflict with diagonal banner layouts."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"brand\" | \"warning\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Built-in surface tone mapped to Iconiq theme tokens instead of hard-coded colors."
            },
            {
              "name": "gap",
              "type": "number | string",
              "defaultValue": "\"2rem\"",
              "required": false,
              "description": "Spacing between repeated segments."
            },
            {
              "name": "pauseOnHover",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Pauses the animation while the ribbon is hovered or contains focused interactive content."
            },
            {
              "name": "pauseWhenHidden",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Pauses the animation while the document tab is hidden to reduce unnecessary work."
            },
            {
              "name": "fadeEdges",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies a soft gradient mask at the viewport edges for a polished marquee fade."
            },
            {
              "name": "selectable",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When false, repeated copy uses `select-none` so users cannot highlight moving text."
            },
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Turns each repeated segment into a link. Only the first copy stays tabbable to avoid keyboard traps."
            },
            {
              "name": "interactive",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Keeps the animated track available to assistive tech. Defaults to `true` when `href` is provided."
            },
            {
              "name": "aria-label",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Accessible name for the announcement region. Falls back to joined `items` or plain-text `children`."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the root ribbon for positioning, spacing, or typography overrides."
            }
          ]
        }
      ],
      "dependencies": []
    },
    {
      "slug": "selectiontoolbar",
      "name": "Selection Toolbar",
      "href": "/layout-and-toolbars/selection-toolbar",
      "url": "https://iconiqui.com/layout-and-toolbars/selection-toolbar",
      "installPackage": "@iconiq/selectiontoolbar",
      "installCommand": "npx shadcn@latest add @iconiq/selectiontoolbar",
      "registryPath": "selectiontoolbar.json",
      "registryUrl": "https://iconiqui.com/r/selectiontoolbar.json",
      "summary": "Floating formatting toolbar for editable text. It watches document selection, shows itself only when the selection lives inside the provided container, and exposes bold, italic, and underline actions by default.",
      "apiSections": [
        {
          "id": "selectiontoolbar",
          "title": "SelectionToolbar",
          "summary": "Floating formatting toolbar for editable text. It watches document selection, shows itself only when the selection lives inside the provided container, and exposes bold, italic, and underline actions by default.",
          "notes": [
            "The toolbar listens to document-level selectionchange events and only dismisses on pointerdown outside both the toolbar and the editable container.",
            "Formatting actions run on mousedown instead of click so the active text selection is preserved while commands are applied.",
            "Active states are read from document.queryCommandState for inline formatting commands.",
            "Keyboard shortcuts Ctrl/Cmd+B, Ctrl/Cmd+I, and Ctrl/Cmd+U work while a non-collapsed selection is inside the container.",
            "Toolbar buttons support arrow-key roving focus, Home, and End while the toolbar is visible."
          ],
          "fields": [
            {
              "name": "containerRef",
              "type": "React.RefObject<HTMLElement | null>",
              "defaultValue": "",
              "required": true,
              "description": "Ref pointing at the editable container whose text selection should drive the toolbar. Selections outside this element immediately hide the toolbar."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the portaled toolbar shell."
            },
            {
              "name": "items",
              "type": "SelectionToolbarItem[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional toolbar actions. Defaults to bold, italic, and underline. Use SelectionToolbarPresets for link, copy, and strikethrough helpers."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom toolbar buttons rendered after the configured items."
            },
            {
              "name": "onCommand",
              "type": "(command: SelectionToolbarCommand) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called after a native formatting command succeeds."
            },
            {
              "name": "portalContainer",
              "type": "HTMLElement | null",
              "defaultValue": "document.body",
              "required": false,
              "description": "Portal target for the floating toolbar. Defaults to document.body."
            },
            {
              "name": "offset",
              "type": "number",
              "defaultValue": "10",
              "required": false,
              "description": "Gap in pixels between the selection anchor and the toolbar."
            },
            {
              "name": "side",
              "type": "\"auto\" | \"top\" | \"bottom\"",
              "defaultValue": "\"auto\"",
              "required": false,
              "description": "Preferred placement relative to the selection. Auto flips above or below based on viewport space."
            },
            {
              "name": "zIndex",
              "type": "number",
              "defaultValue": "50",
              "required": false,
              "description": "Stacking order for the portaled toolbar."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, the toolbar stays hidden and actions are ignored."
            },
            {
              "name": "aria-controls",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional id of the editable surface controlled by the toolbar."
            }
          ]
        },
        {
          "id": "selectiontoolbar-positioning",
          "title": "Positioning and editing behavior",
          "summary": "The toolbar positions itself from the live range rectangle returned by the browser selection API and applies formatting through the native rich-text command pipeline.",
          "notes": [
            "Coordinates come from Range.getBoundingClientRect in viewport space and the toolbar uses position: fixed, so it stays anchored while the page scrolls.",
            "Horizontal placement is clamped to the viewport and vertical placement can flip above or below the selection when space is limited.",
            "The toolbar is portaled outside clipping containers by default, which avoids overflow-hidden wrappers trimming the floating shell.",
            "The current implementation depends on document.execCommand for inline formatting. That keeps the install lightweight for native contentEditable text, but apps with a custom text model should replace command handling via items or onCommand."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "lucide-react"
      ]
    },
    {
      "slug": "separator",
      "name": "Separator",
      "href": "/layout-and-toolbars/separator",
      "url": "https://iconiqui.com/layout-and-toolbars/separator",
      "installPackage": "@iconiq/separator",
      "installCommand": "npx shadcn@latest add @iconiq/separator",
      "registryPath": "separator.json",
      "registryUrl": "https://iconiqui.com/r/separator.json",
      "summary": "Horizontal or vertical divider with solid, dashed, and dotted variants plus tone, spacing, and inset helpers.",
      "apiSections": [
        {
          "id": "separator",
          "title": "Separator",
          "summary": "Horizontal or vertical divider with solid, dashed, and dotted variants plus tone, spacing, and inset helpers.",
          "notes": [
            "Vertical separators use self-stretch inside flex rows and keep min-h-4 as a fallback when the parent does not define height.",
            "The dashed variant uses background gradients so horizontal and vertical strokes keep the same dash rhythm. The dotted variant uses border rendering with h-px sizing so dots stay visible in flex layouts.",
            "Every separator root exposes data-slot=\"separator\" for parent styling hooks."
          ],
          "fields": [
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Controls whether the divider spans across the inline axis or separates items inside a fixed-height row."
            },
            {
              "name": "variant",
              "type": "\"line\" | \"dashed\" | \"dotted\"",
              "defaultValue": "\"line\"",
              "required": false,
              "description": "Chooses the visual treatment. The default line variant renders a solid rule, dashed repeats short strokes, and dotted uses native dotted border rendering."
            },
            {
              "name": "tone",
              "type": "\"default\" | \"muted\" | \"brand\" | \"destructive\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Maps the divider color to border, muted, brand, or destructive tokens without overriding className."
            },
            {
              "name": "spacing",
              "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
              "defaultValue": "\"none\"",
              "required": false,
              "description": "Adds orientation-aware margin around the divider for section gutters. Use inset instead for compact menu dividers."
            },
            {
              "name": "inset",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies the compact negative-margin treatment used between menu or list groups."
            },
            {
              "name": "decorative",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Removes the separator from the accessibility tree when true. Set it to false only when the divider communicates structure that needs to be announced."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the primitive root so local width, height, margin, color, or placement can be adjusted without changing the component file."
            }
          ]
        },
        {
          "id": "separator-label",
          "title": "SeparatorLabel",
          "summary": "Centered caption layout that renders matching dividers on both sides of a label.",
          "notes": [
            "SeparatorLabel is included in the same registry file as Separator, so no extra install step is required."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Caption rendered between the two separators."
            },
            {
              "name": "variant",
              "type": "\"line\" | \"dashed\" | \"dotted\"",
              "defaultValue": "\"line\"",
              "required": false,
              "description": "Variant applied to both flanking separators."
            },
            {
              "name": "tone",
              "type": "\"default\" | \"muted\" | \"brand\" | \"destructive\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Tone applied to both flanking separators."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the caption span."
            },
            {
              "name": "separatorClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto both flanking separators."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Classes merged onto the outer flex container."
            }
          ]
        },
        {
          "id": "separator-semantics",
          "title": "Semantics",
          "summary": "The component defaults to decorative presentation, but both primitive versions can opt into separator semantics.",
          "notes": [
            "Pass decorative=false when the divider is meaningful enough to be announced by assistive technology.",
            "Additional primitive props and data attributes are forwarded to the root element for composition with layout or menu surfaces."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react"
      ]
    },
    {
      "slug": "b-accordion",
      "name": "Accordion",
      "href": "/navigation/accordion",
      "url": "https://iconiqui.com/navigation/accordion",
      "installPackage": "@iconiq/b-accordion",
      "installCommand": "npx shadcn@latest add @iconiq/b-accordion",
      "registryPath": "b-accordion.json",
      "registryUrl": "https://iconiqui.com/r/b-accordion.json",
      "summary": "Each row is described by a simple object and rendered as a single-expand accordion item.",
      "apiSections": [
        {
          "id": "accordion-item",
          "title": "AccordionItem",
          "summary": "Each row is described by a simple object and rendered as a single-expand accordion item.",
          "notes": [],
          "fields": [
            {
              "name": "id",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable key used for React rendering, internal open-state comparison, and the generated aria-controls id."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Text shown in the trigger row."
            },
            {
              "name": "content",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Body copy shown inside the open panel with a horizontal masked wipe and a soft lift into place."
            }
          ]
        },
        {
          "id": "accordion",
          "title": "Accordion",
          "summary": "Stateful accordion component with internal open state and no controlled API.",
          "notes": [
            "Clicking an already open row closes it again by removing that item id from the internal open-state list.",
            "Single-open is the default behavior; pass multiple when you want a keep-open FAQ or settings list.",
            "There is no prop for default open or controlled open behavior in this implementation.",
            "The quiet variant keeps the same state model and API, but swaps in a lighter inline disclosure style."
          ],
          "fields": [
            {
              "name": "items",
              "type": "AccordionItem[]",
              "defaultValue": "",
              "required": true,
              "description": "Rows to render in order."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the max-w-2xl root wrapper so you can stretch or reposition the accordion in your layout."
            },
            {
              "name": "multiple",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Allows several rows to stay open at once. When omitted, opening one row closes the previously open row."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"quiet\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Switches between the plain divided list and the quieter inline plus/minus treatment."
            }
          ]
        },
        {
          "id": "accordion-motion",
          "title": "Motion and accessibility",
          "summary": "The accordion uses native buttons and animated height transitions rather than a headless primitive.",
          "notes": [
            "Each trigger button sets aria-expanded and aria-controls, and each open panel receives a matching id.",
            "The quiet variant uses a minimal plus/minus label while preserving the same keyboard, state, and content motion behavior.",
            "The content body reveals through a horizontal clipped wipe while the paragraph settles upward with a soft blur fade.",
            "Keyboard support is limited to standard button tab and click semantics; there is no arrow-key roving between items."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "breadcrumbs",
      "name": "Breadcrumbs",
      "href": "/navigation/breadcrumbs",
      "url": "https://iconiqui.com/navigation/breadcrumbs",
      "installPackage": "@iconiq/breadcrumbs",
      "installCommand": "npx shadcn@latest add @iconiq/breadcrumbs",
      "registryPath": "breadcrumbs.json",
      "registryUrl": "https://iconiqui.com/r/breadcrumbs.json",
      "summary": "Root semantic navigation wrapper for a breadcrumb trail.",
      "apiSections": [
        {
          "id": "breadcrumb",
          "title": "Breadcrumb",
          "summary": "Root semantic navigation wrapper for a breadcrumb trail.",
          "notes": [
            "Compose BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, and BreadcrumbSeparator inside the root."
          ],
          "fields": [
            {
              "name": "ariaLabel",
              "type": "string",
              "defaultValue": "\"Breadcrumb\"",
              "required": false,
              "description": "Accessible label for the root nav landmark. Override for localization."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the nav element for placement inside headers, toolbars, and page shells."
            }
          ]
        },
        {
          "id": "breadcrumbs",
          "title": "Breadcrumbs",
          "summary": "Convenience wrapper that renders a trail from an items array with optional collapse and JSON-LD.",
          "notes": [
            "The final item without an href is treated as the current page.",
            "Pass renderLink when you need router-aware links instead of plain anchors."
          ],
          "fields": [
            {
              "name": "items",
              "type": "BreadcrumbItemData[]",
              "defaultValue": "",
              "required": true,
              "description": "Ordered trail segments with label, optional href, icon, and title fields."
            },
            {
              "name": "maxItems",
              "type": "number",
              "defaultValue": "",
              "required": false,
              "description": "When the trail exceeds this count, middle segments collapse into BreadcrumbEllipsisMenu."
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies max-width truncation to linked and current-page labels."
            },
            {
              "name": "separator",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Custom separator content passed to each BreadcrumbSeparator in the generated trail."
            },
            {
              "name": "renderLink",
              "type": "(props) => ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom link renderer for framework routers such as Next.js Link."
            },
            {
              "name": "siteUrl",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Absolute site origin used when BreadcrumbJsonLd is emitted alongside the trail."
            },
            {
              "name": "currentPath",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Fallback path for the final breadcrumb item in JSON-LD when it has no href."
            },
            {
              "name": "listClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the internal BreadcrumbList element."
            }
          ]
        },
        {
          "id": "breadcrumb-list",
          "title": "BreadcrumbList",
          "summary": "Ordered list that lays out breadcrumb segments and separators with optional Motion.",
          "notes": [
            "Uses AnimatePresence with popLayout for trail insertions and removals."
          ],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default flex wrapping, spacing, and muted text styles."
            }
          ]
        },
        {
          "id": "breadcrumb-item",
          "title": "BreadcrumbItem",
          "summary": "List item wrapper for each breadcrumb segment.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the inline-flex item layout. Dynamic items should receive stable React keys when rendered from arrays."
            }
          ]
        },
        {
          "id": "breadcrumb-link",
          "title": "BreadcrumbLink",
          "summary": "Base UI render-compatible link for navigable breadcrumb segments.",
          "notes": [],
          "fields": [
            {
              "name": "href",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Destination for the linked segment. You can also compose a router link with the render prop."
            },
            {
              "name": "render",
              "type": "ReactElement | render function",
              "defaultValue": "",
              "required": false,
              "description": "Optional Base UI render override for composing with framework-specific links while preserving merged props."
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies responsive max-width truncation with an optional title tooltip."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Native title attribute for truncated or abbreviated link labels."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default focus ring, color transition, and hover foreground treatment."
            }
          ]
        },
        {
          "id": "breadcrumb-page",
          "title": "BreadcrumbPage",
          "summary": "Current page segment rendered with aria-current='page'.",
          "notes": [],
          "fields": [
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies responsive max-width truncation to the label."
            },
            {
              "name": "title",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Native title attribute for truncated labels."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default foreground current-page text style."
            }
          ]
        },
        {
          "id": "breadcrumb-separator",
          "title": "BreadcrumbSeparator",
          "summary": "Visual separator between breadcrumb items, defaulting to a chevron icon.",
          "notes": [
            "Separators render with role='presentation' and aria-hidden."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom separator content. When omitted, ChevronRightIcon is rendered."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default icon sizing class for separator icons."
            }
          ]
        },
        {
          "id": "breadcrumb-ellipsis",
          "title": "BreadcrumbEllipsis",
          "summary": "Decorative overflow marker for manually composed collapsed trails.",
          "notes": [
            "Wrap inside BreadcrumbItem for valid list semantics.",
            "Use BreadcrumbEllipsisMenu when the overflow segment should be interactive."
          ],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default 20px square centered icon layout."
            }
          ]
        },
        {
          "id": "breadcrumb-ellipsis-menu",
          "title": "BreadcrumbEllipsisMenu",
          "summary": "Accessible button-triggered menu for collapsed breadcrumb segments.",
          "notes": [],
          "fields": [
            {
              "name": "items",
              "type": "BreadcrumbEllipsisMenuItem[]",
              "defaultValue": "",
              "required": true,
              "description": "Collapsed segments rendered inside the overflow menu. Each item accepts an optional icon."
            },
            {
              "name": "menuLabel",
              "type": "string",
              "defaultValue": "\"Show collapsed breadcrumb items\"",
              "required": false,
              "description": "Accessible label for the overflow trigger button."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the relative menu wrapper."
            }
          ]
        },
        {
          "id": "breadcrumb-json-ld",
          "title": "BreadcrumbJsonLd",
          "summary": "Emits schema.org BreadcrumbList JSON-LD for SEO when paired with a siteUrl.",
          "notes": [],
          "fields": [
            {
              "name": "items",
              "type": "BreadcrumbJsonLdItem[]",
              "defaultValue": "",
              "required": true,
              "description": "Trail labels and optional href values."
            },
            {
              "name": "siteUrl",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Absolute site origin used to resolve relative breadcrumb URLs."
            },
            {
              "name": "currentPath",
              "type": "string",
              "defaultValue": "\"/\"",
              "required": false,
              "description": "Fallback path for the final breadcrumb when it has no href."
            }
          ]
        },
        {
          "id": "breadcrumbs-a11y",
          "title": "Accessibility and motion",
          "summary": "The compound API keeps semantic breadcrumb structure while layering Motion on top.",
          "notes": [
            "BreadcrumbList wraps the trail in an ordered list.",
            "BreadcrumbLink exposes a visible focus ring for keyboard users.",
            "BreadcrumbPage marks the final segment with aria-current='page'.",
            "BreadcrumbEllipsisMenu uses aria-expanded, aria-haspopup, and Escape to dismiss."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "command-palette",
      "name": "Command Palette",
      "href": "/navigation/command-palette",
      "url": "https://iconiqui.com/navigation/command-palette",
      "installPackage": "@iconiq/command-palette",
      "installCommand": "npx shadcn@latest add @iconiq/command-palette",
      "registryPath": "command-palette.json",
      "registryUrl": "https://iconiqui.com/r/command-palette.json",
      "summary": "Keyboard-first command menu built on Radix Dialog with grouped items, substring search, optional recent commands, async search, and keyboard navigation.",
      "apiSections": [
        {
          "id": "command-palette",
          "title": "CommandPalette",
          "summary": "Keyboard-first command menu built on Radix Dialog with grouped items, substring search, optional recent commands, async search, and keyboard navigation.",
          "notes": [
            "Items with href navigate through onNavigate when provided, otherwise Next.js router.push or router.replace.",
            "External href values and external: true open in a new tab. Items with action run a callback and close the palette.",
            "Search matches every whitespace-separated term against label, keywords, and description.",
            "Icons are optional on items — pass icon only when you want one.",
            "CommandMenuItemDef, CommandMenuTrigger, Kbd, and KbdGroup are exported for custom compositions.",
            "Requires next-themes ThemeProvider only when showThemeGroup is enabled."
          ],
          "fields": [
            {
              "name": "groups",
              "type": "CommandMenuGroupDef[]",
              "defaultValue": "[]",
              "required": false,
              "description": "Grouped command items. Each group has a heading and an items array with label, optional href or action, icon, keywords, description, shortcut, disabled, id, and value."
            },
            {
              "name": "showThemeGroup",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, appends a theme group that calls next-themes setTheme. Requires ThemeProvider. Override with themeGroup for custom items."
            },
            {
              "name": "themeGroup",
              "type": "CommandMenuGroupDef",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom theme group. Used when showThemeGroup is true instead of the built-in Light, Dark, and System actions."
            },
            {
              "name": "themeGroupHeading",
              "type": "string",
              "defaultValue": "\"Theme\"",
              "required": false,
              "description": "Heading for the built-in theme group when themeGroup is not provided."
            },
            {
              "name": "showRecentGroup",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, shows recently selected commands from localStorage or the recentItems seed list."
            },
            {
              "name": "recentItems",
              "type": "CommandMenuItemDef[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional seed list for the Recent group. Selections are also persisted to localStorage."
            },
            {
              "name": "maxRecentItems",
              "type": "number",
              "defaultValue": "5",
              "required": false,
              "description": "Maximum number of recent commands to keep."
            },
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "\"Search components, pages, actions…\"",
              "required": false,
              "description": "Placeholder copy for the search field."
            },
            {
              "name": "shortcutKey",
              "type": "string",
              "defaultValue": "\"k\"",
              "required": false,
              "description": "Letter used with Cmd on macOS or Ctrl elsewhere to toggle the palette globally."
            },
            {
              "name": "enableGlobalShortcut",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When false, disables the document-level Cmd/Ctrl shortcut listener."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state for the dialog."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the dialog open state changes."
            },
            {
              "name": "onSelect",
              "type": "(item: CommandMenuItemDef) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a command is selected, before navigation or action execution."
            },
            {
              "name": "onNavigate",
              "type": "(href: string, item: CommandMenuItemDef) => void",
              "defaultValue": "",
              "required": false,
              "description": "Custom navigation handler. When provided, replaces the default Next.js router.push behavior for href items."
            },
            {
              "name": "onSearch",
              "type": "(query: string) => Promise<CommandMenuGroupDef[]>",
              "defaultValue": "",
              "required": false,
              "description": "Async search callback. Returned groups are merged with static groups and debounced by searchDebounceMs."
            },
            {
              "name": "searchDebounceMs",
              "type": "number",
              "defaultValue": "200",
              "required": false,
              "description": "Debounce delay used when onSearch is provided."
            },
            {
              "name": "filter",
              "type": "(item: CommandMenuItemDef, query: string) => boolean",
              "defaultValue": "",
              "required": false,
              "description": "Custom filter function. When omitted, ranked substring matching is used across label, keywords, and description."
            },
            {
              "name": "contentDelay",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Milliseconds to wait before revealing the results panel after the dialog opens."
            },
            {
              "name": "trigger",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Custom trigger node. When provided, it replaces the default search button and receives merged open handlers plus aria-expanded."
            },
            {
              "name": "triggerProps",
              "type": "CommandMenuTriggerProps",
              "defaultValue": "",
              "required": false,
              "description": "Props for the default trigger button, including label, shortcut badge visibility, and className."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the dialog content panel."
            },
            {
              "name": "overlayClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the dialog overlay."
            },
            {
              "name": "positionClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Overrides the default dialog positioning classes. The default uses portable CSS variables with optional nav offset fallbacks."
            },
            {
              "name": "themed",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, applies the self-contained Iconiq theme token scope to the dialog surface."
            },
            {
              "name": "showFooterHints",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Shows keyboard hint badges for navigate, select, and close actions."
            },
            {
              "name": "emptyMessage",
              "type": "string",
              "defaultValue": "\"No results found.\"",
              "required": false,
              "description": "Copy shown when the current query matches no items."
            },
            {
              "name": "noQueryMessage",
              "type": "string",
              "defaultValue": "\"Start typing to search commands.\"",
              "required": false,
              "description": "Copy shown when the query is empty and no items are visible."
            },
            {
              "name": "loadingMessage",
              "type": "string",
              "defaultValue": "\"Searching…\"",
              "required": false,
              "description": "Copy shown while onSearch is in flight."
            },
            {
              "name": "currentPath",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional current route override used for the Current page badge. Defaults to usePathname when available."
            },
            {
              "name": "closeOnRouteChange",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, closes the palette automatically on pathname changes in Next.js App Router apps."
            }
          ]
        }
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion",
        "next-themes"
      ]
    },
    {
      "slug": "faq-pro",
      "name": "FAQ Pro",
      "href": "/navigation/faq-pro",
      "url": "https://iconiqui.com/navigation/faq-pro",
      "installPackage": "@iconiq/faq-pro",
      "installCommand": "npx shadcn@latest add @iconiq/faq-pro",
      "registryPath": "faq-pro.json",
      "registryUrl": "https://iconiqui.com/r/faq-pro.json",
      "summary": "Searchable FAQ accordion with rounded cards, animated panels, query highlighting, and automatic expansion for filtered results.",
      "apiSections": [
        {
          "id": "faq-pro",
          "title": "FaqPro",
          "summary": "Searchable FAQ accordion with rounded cards, animated panels, query highlighting, and automatic expansion for filtered results.",
          "notes": [
            "Search matches all whitespace-separated terms (AND) against question, string answers, and keywords.",
            "The first matching row opens automatically while you type; clearing the query restores the default open state.",
            "Only one FAQ panel can be open at a time. Respects prefers-reduced-motion for animations.",
            "Matched substrings render inside a highlight mark in the question and string answers.",
            "Rows expose data-slot attributes (faq-pro, faq-pro-item, faq-pro-trigger, faq-pro-panel) for styling."
          ],
          "fields": [
            {
              "name": "items",
              "type": "FaqProItem[]",
              "defaultValue": "",
              "required": true,
              "description": "Array of `{ id, question, answer, keywords?, disabled? }` entries. `answer` accepts ReactNode (string answers get highlighted and searched). Each id must be unique."
            },
            {
              "name": "value",
              "type": "string | null",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open item id. Pair with onOpenChange. Use null to close all."
            },
            {
              "name": "onOpenChange",
              "type": "(openId: string | null) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the open item changes, in both controlled and uncontrolled modes."
            },
            {
              "name": "defaultValue",
              "type": "string | null",
              "defaultValue": "",
              "required": false,
              "description": "Initial open item id for uncontrolled usage. Overrides defaultOpenId and defaultOpenFirst."
            },
            {
              "name": "defaultOpenId",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Opens a specific item id by default when there is no active query."
            },
            {
              "name": "defaultOpenFirst",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Opens the first enabled item when there is no active search query."
            },
            {
              "name": "hideSearch",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Hides the search field and renders the list only."
            },
            {
              "name": "filter",
              "type": "(item: FaqProItem, query: string) => boolean",
              "defaultValue": "",
              "required": false,
              "description": "Custom match predicate. Overrides the built-in multi-term substring search."
            },
            {
              "name": "onQueryChange",
              "type": "(query: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the search query changes."
            },
            {
              "name": "searchPlaceholder",
              "type": "string",
              "defaultValue": "Search FAQs...",
              "required": false,
              "description": "Placeholder and accessible label for the search field."
            },
            {
              "name": "emptyMessage",
              "type": "string",
              "defaultValue": "No FAQs to show yet.",
              "required": false,
              "description": "Message shown when there are no items at all."
            },
            {
              "name": "noResultsMessage",
              "type": "string",
              "defaultValue": "No FAQs match your search.",
              "required": false,
              "description": "Message shown when a query returns no matches."
            },
            {
              "name": "themed",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Applies the built-in light/dark token surface. Set false to inherit your app tokens."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the root container."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react/accordion",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "file-tree",
      "name": "File Tree",
      "href": "/navigation/file-tree",
      "url": "https://iconiqui.com/navigation/file-tree",
      "installPackage": "@iconiq/file-tree",
      "installCommand": "npx shadcn@latest add @iconiq/file-tree",
      "registryPath": "file-tree.json",
      "registryUrl": "https://iconiqui.com/r/file-tree.json",
      "summary": "Root provider for the compound file tree. Tracks expanded folders, selection, focus, hover highlight bounds, search filtering, and shared visual settings.",
      "apiSections": [
        {
          "id": "file-tree",
          "title": "FileTree",
          "summary": "Root provider for the compound file tree. Tracks expanded folders, selection, focus, hover highlight bounds, search filtering, and shared visual settings.",
          "notes": [
            "Wrap `FileTreeList` and nested `FileTreeItem` components inside the root provider.",
            "Hovering or focusing a row updates a single animated highlight inside the tree container.",
            "Arrow keys, Home, End, Enter, Space, and `*` implement the WAI-ARIA tree keyboard pattern."
          ],
          "fields": [
            {
              "name": "defaultExpandedIds",
              "type": "string[]",
              "defaultValue": "[]",
              "required": false,
              "description": "Folder node ids that should start expanded on first render."
            },
            {
              "name": "expandedIds",
              "type": "string[] | Set<string>",
              "defaultValue": "",
              "required": false,
              "description": "Controlled expanded folder ids. Pair with `onExpandedIdsChange`."
            },
            {
              "name": "onExpandedIdsChange",
              "type": "(expandedIds: string[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when expanded folder ids change."
            },
            {
              "name": "defaultSelectedId",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Node id selected on first render in single-select mode."
            },
            {
              "name": "defaultSelectedIds",
              "type": "string[]",
              "defaultValue": "",
              "required": false,
              "description": "Node ids selected on first render in multiple-select mode."
            },
            {
              "name": "selectedIds",
              "type": "string[] | Set<string>",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected node ids. Pair with `onSelectedIdsChange`."
            },
            {
              "name": "onSelectedIdsChange",
              "type": "(selectedIds: string[]) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when selected node ids change."
            },
            {
              "name": "selectionMode",
              "type": "\"single\" | \"multiple\"",
              "defaultValue": "\"single\"",
              "required": false,
              "description": "Selection behavior. Multiple mode supports Cmd/Ctrl additive and Shift range selection."
            },
            {
              "name": "searchQuery",
              "type": "string",
              "defaultValue": "\"\"",
              "required": false,
              "description": "Case-insensitive label filter. Matching branches auto-expand."
            },
            {
              "name": "highlightColor",
              "type": "string",
              "defaultValue": "var(--color-brand, #3b82f6)",
              "required": false,
              "description": "Text color applied to items with `highlight` on `FileTreeItem`."
            },
            {
              "name": "iconMap",
              "type": "Record<string, LucideIcon>",
              "defaultValue": "",
              "required": false,
              "description": "Custom extension or filename to icon map merged over built-in defaults."
            },
            {
              "name": "indentSize",
              "type": "number",
              "defaultValue": "24",
              "required": false,
              "description": "Horizontal indent in pixels for each nested folder level."
            },
            {
              "name": "maxHeight",
              "type": "number | string",
              "defaultValue": "",
              "required": false,
              "description": "Enables a scrollable viewport for large trees via overflow-y auto."
            },
            {
              "name": "showIcons",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Whether to render icons. File icons are inferred from the label extension when no custom icon is provided."
            },
            {
              "name": "truncate",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Truncate long labels with a native title tooltip on each row."
            },
            {
              "name": "onLoadChildren",
              "type": "(nodeId: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a lazy branch with `hasChildren` opens before children are mounted."
            },
            {
              "name": "onNodeClick",
              "type": "(nodeId: string, event?: React.MouseEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a file or folder row is activated."
            },
            {
              "name": "onNodeExpand",
              "type": "(nodeId: string, expanded: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a folder branch opens or closes."
            },
            {
              "name": "onNodeContextMenu",
              "type": "(nodeId: string, event: React.MouseEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a row receives a context menu event."
            },
            {
              "name": "onNodeDragStart",
              "type": "(nodeId: string, event: React.DragEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a draggable row starts dragging."
            },
            {
              "name": "onNodeDragOver",
              "type": "(nodeId: string, event: React.DragEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a drag moves over a row."
            },
            {
              "name": "onNodeDrop",
              "type": "(nodeId: string, event: React.DragEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a drag is dropped on a row."
            },
            {
              "name": "onNodeDragEnd",
              "type": "(nodeId: string, event: React.DragEvent) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a row drag ends."
            },
            {
              "name": "ref",
              "type": "FileTreeHandle",
              "defaultValue": "",
              "required": false,
              "description": "Imperative handle with `expandAll`, `collapseAll`, and `focusNode`."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names applied to the bordered root container."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Usually a single `FileTreeList` with nested `FileTreeItem` rows, or use `FileTreeFromItems`."
            }
          ]
        },
        {
          "id": "file-tree-from-items",
          "title": "FileTreeFromItems",
          "summary": "Data-driven helper that renders a `FileTree` from an `items` array of nested node definitions.",
          "notes": [],
          "fields": [
            {
              "name": "items",
              "type": "FileTreeNodeData[]",
              "defaultValue": "",
              "required": true,
              "description": "Nested node definitions with `id`, `label`, optional `children`, `icon`, `highlight`, `disabled`, and `loading`."
            },
            {
              "name": "...FileTreeProps",
              "type": "FileTreeProps",
              "defaultValue": "",
              "required": false,
              "description": "All `FileTree` root props are supported."
            }
          ]
        },
        {
          "id": "file-tree-list",
          "title": "FileTreeList",
          "summary": "Semantic tree container for top-level rows. Supports Base UI `render` composition.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default vertical stack layout."
            },
            {
              "name": "render",
              "type": "ReactElement | ((props) => ReactElement)",
              "defaultValue": "",
              "required": false,
              "description": "Optional Base UI render override for the list container element."
            }
          ]
        },
        {
          "id": "file-tree-item",
          "title": "FileTreeItem",
          "summary": "Single file or folder row rendered as a Base UI Button treeitem. Nested children render inside an animated branch group.",
          "notes": [
            "File and folder rows both use Base UI Button with `role=\"treeitem\"`, roving tabindex, and `aria-selected` when selected.",
            "Folder icons swap with a spring transition, and child groups animate open and closed with height and opacity motion.",
            "Respects `prefers-reduced-motion` by skipping nonessential animations."
          ],
          "fields": [
            {
              "name": "nodeId",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Stable unique id used for expand state, selection, callbacks, and tree semantics."
            },
            {
              "name": "label",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Display label for the row. File extension or filename is used to pick a default icon."
            },
            {
              "name": "icon",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional custom icon node rendered before the label."
            },
            {
              "name": "openIcon",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional open-state icon for folder rows. Defaults to FolderOpen."
            },
            {
              "name": "hasChildren",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the row as a branch even when it has no nested children yet. Otherwise inferred from child items."
            },
            {
              "name": "loading",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Shows a spinner icon while lazy children are loading."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables row activation and removes it from keyboard focus order."
            },
            {
              "name": "draggable",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Enables native drag interactions on the row button."
            },
            {
              "name": "highlight",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "When true, tints the row with `highlightColor` to mark it as new or relevant."
            },
            {
              "name": "render",
              "type": "ReactElement | ((props) => ReactElement)",
              "defaultValue": "",
              "required": false,
              "description": "Optional Base UI render override for the row button element."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Nested `FileTreeItem` rows rendered when the branch is expanded."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "tabs",
      "name": "Tabs",
      "href": "/navigation/tabs",
      "url": "https://iconiqui.com/navigation/tabs",
      "installPackage": "@iconiq/tabs",
      "installCommand": "npx shadcn@latest add @iconiq/tabs",
      "registryPath": "tabs.json",
      "registryUrl": "https://iconiqui.com/r/tabs.json",
      "summary": "Radix tabs root with theme fallbacks, measured indicator motion, optional content transitions, and controlled or uncontrolled state with safe fallbacks.",
      "apiSections": [
        {
          "id": "tabs",
          "title": "Tabs",
          "summary": "Radix tabs root with theme fallbacks, measured indicator motion, optional content transitions, and controlled or uncontrolled state with safe fallbacks.",
          "notes": [
            "Each Tabs instance scopes trigger and content ids from a unique base id for aria-controls wiring.",
            "Use controlled state with value and onValueChange, or pass defaultValue for uncontrolled usage.",
            "Reduced-motion users receive instant indicator transitions instead of spring motion."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose TabsList, TabsTrigger, and TabsContent inside the root."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial active tab for uncontrolled usage. Falls back to the first TabsContent value when omitted or invalid."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled active tab value. Invalid values fall back to the first TabsContent value in development with a console warning."
            },
            {
              "name": "onValueChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a trigger activates a different tab through click or keyboard interaction."
            },
            {
              "name": "variant",
              "type": "\"pill\" | \"underline\"",
              "defaultValue": "\"pill\"",
              "required": false,
              "description": "Switches between the segmented pill rail and the underline indicator treatment."
            },
            {
              "name": "animateContent",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Applies a short fade-and-rise transition to the active panel body. Respects reduced-motion preferences."
            },
            {
              "name": "orientation",
              "type": "\"horizontal\" | \"vertical\"",
              "defaultValue": "\"horizontal\"",
              "required": false,
              "description": "Radix orientation forwarded to the list and content layout. Vertical roots render as a flex row with the list beside the panel."
            },
            {
              "name": "activationMode",
              "type": "\"automatic\" | \"manual\"",
              "defaultValue": "\"automatic\"",
              "required": false,
              "description": "Radix activation mode. Manual keeps focus and selection separate until Enter or Space."
            },
            {
              "name": "dir",
              "type": "\"ltr\" | \"rtl\"",
              "defaultValue": "",
              "required": false,
              "description": "Radix text direction for keyboard navigation order."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the Radix tabs root wrapper."
            }
          ]
        },
        {
          "id": "tabs-list",
          "title": "TabsList",
          "summary": "Scrollable trigger rail with a measured motion indicator for pill or underline variants.",
          "notes": [
            "Uses horizontal overflow scrolling for long tab sets instead of clipping triggers.",
            "A ResizeObserver keeps the active indicator aligned when labels or icons change size."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Usually a row of TabsTrigger elements."
            },
            {
              "name": "fullWidth",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Stretches the list to the container width instead of fitting the trigger row."
            },
            {
              "name": "loop",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Radix loop behavior for keyboard navigation across the first and last triggers."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger rail element."
            }
          ]
        },
        {
          "id": "tabs-trigger",
          "title": "TabsTrigger",
          "summary": "Interactive tab button with optional icon and badge slots, token-based colors, and measured active-state treatment.",
          "notes": [
            "The active trigger indicator is rendered in TabsList and positioned with ResizeObserver measurements.",
            "Pill triggers use foreground-on-background label contrast instead of mix-blend tricks."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Unique tab identifier used for active state and content matching."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Label content rendered inside the trigger button."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional leading icon rendered before the label with consistent sizing."
            },
            {
              "name": "badge",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional trailing badge such as a count or status chip."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger button for local spacing, typography, or state overrides."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents the trigger from receiving focus or changing the active tab."
            }
          ]
        },
        {
          "id": "tabs-content",
          "title": "TabsContent",
          "summary": "Radix content panel tied to a matching trigger value below or beside the tab list.",
          "notes": [
            "Radix handles mounting and visibility for the active panel.",
            "When animateContent is enabled on Tabs, the active panel body receives a short motion transition."
          ],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Matches the corresponding TabsTrigger value."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Panel body shown when the content value is active."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered content panel element."
            },
            {
              "name": "forceMount",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Keeps the panel mounted while inactive. Useful for preserving form state or SSR-friendly markup."
            }
          ]
        }
      ],
      "dependencies": [
        "@radix-ui/react-tabs",
        "motion"
      ]
    },
    {
      "slug": "b-alert-dialog",
      "name": "Alert Dialog",
      "href": "/overlay-and-popups/alert-dialog",
      "url": "https://iconiqui.com/overlay-and-popups/alert-dialog",
      "installPackage": "@iconiq/b-alert-dialog",
      "installCommand": "npx shadcn@latest add @iconiq/b-alert-dialog",
      "registryPath": "b-alert-dialog.json",
      "registryUrl": "https://iconiqui.com/r/b-alert-dialog.json",
      "summary": "Alert dialog with asChild triggers, action variants, optional media, controlled async flows, and reduced-motion aware transitions layered over Base UI primitives.",
      "apiSections": [],
      "dependencies": [
        "@base-ui/react",
        "@radix-ui/react-slot",
        "motion"
      ]
    },
    {
      "slug": "b-context-menu",
      "name": "Context Menu",
      "href": "/overlay-and-popups/context-menu",
      "url": "https://iconiqui.com/overlay-and-popups/context-menu",
      "installPackage": "@iconiq/b-context-menu",
      "installCommand": "npx shadcn@latest add @iconiq/b-context-menu",
      "registryPath": "b-context-menu.json",
      "registryUrl": "https://iconiqui.com/r/b-context-menu.json",
      "summary": "Root provider that coordinates open state and the shared motion shell used by the trigger, content, and item primitives.",
      "apiSections": [
        {
          "id": "context-menu",
          "title": "ContextMenu",
          "summary": "Root provider that coordinates open state and the shared motion shell used by the trigger, content, and item primitives.",
          "notes": [
            "Compose ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSub, and the other exported parts inside the root.",
            "The menu opens from right click or long press on the trigger surface. Shift+F10 and the Context Menu key also open it from keyboard focus.",
            "Pass open and onOpenChange on the root for controlled usage.",
            "Content is portaled and collision-aware. The Iconiq shell keeps the original panel spring, row entrance, and active highlight motion."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose ContextMenuTrigger, ContextMenuContent, and item primitives such as ContextMenuItem or ContextMenuSub inside the root."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state for the menu surface."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Initial open state for uncontrolled usage."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the trigger, outside interaction, or Escape key changes the open state."
            }
          ]
        },
        {
          "id": "context-menu-trigger",
          "title": "ContextMenuTrigger",
          "summary": "Interactive surface that opens the menu on right click, long press, or keyboard context-menu shortcuts.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Trigger content rendered inside the context-click target."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Merges trigger behavior onto the single child element instead of rendering a wrapper element."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger surface, including the focus ring and theme token scope."
            }
          ]
        },
        {
          "id": "context-menu-content",
          "title": "ContextMenuContent",
          "summary": "Portaled menu panel that renders the composed item tree with the Iconiq border, shadow, and motion treatment.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Menu body content such as groups, items, separators, checkbox rows, and nested submenus."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the animated panel shell. Use width utilities such as w-48 when you want a fixed menu width."
            },
            {
              "name": "collisionPadding",
              "type": "number",
              "defaultValue": "8",
              "required": false,
              "description": "Viewport padding used while the underlying primitive resolves collision-aware placement."
            }
          ]
        },
        {
          "id": "context-menu-item",
          "title": "ContextMenuItem",
          "summary": "Interactive menu row with the Iconiq active highlight, row entrance motion, and optional destructive styling.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Row content. Pair with ContextMenuShortcut when you want trailing keyboard hints."
            },
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\"",
              "defaultValue": "default",
              "required": false,
              "description": "Switches the row into the destructive color treatment used for irreversible actions."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Dims the row and blocks pointer and keyboard selection."
            },
            {
              "name": "inset",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Adds extra start padding so the row aligns with checkbox and radio items."
            },
            {
              "name": "onSelect",
              "type": "(event: Event) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the row is activated."
            }
          ]
        },
        {
          "id": "context-menu-shortcut",
          "title": "ContextMenuShortcut",
          "summary": "Trailing helper text for keyboard hints. It stays muted until the parent row is focused.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Shortcut copy such as ⌘R or Del."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trailing shortcut span."
            }
          ]
        },
        {
          "id": "context-menu-sub",
          "title": "ContextMenuSub",
          "summary": "Nested submenu root. Pair ContextMenuSubTrigger with ContextMenuSubContent to build secondary menus such as More Tools.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Submenu trigger and content parts rendered inside the parent menu."
            }
          ]
        },
        {
          "id": "context-menu-checkbox-item",
          "title": "ContextMenuCheckboxItem",
          "summary": "Toggle row with a trailing check indicator and the same Iconiq row motion treatment as ContextMenuItem.",
          "notes": [],
          "fields": [
            {
              "name": "checked",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controls whether the row renders in the checked state."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the row toggles between checked and unchecked."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Dims the row and blocks pointer and keyboard selection."
            },
            {
              "name": "inset",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Adds extra start padding to align with sibling rows."
            }
          ]
        },
        {
          "id": "context-menu-radio-group",
          "title": "ContextMenuRadioGroup",
          "summary": "Single-select group for ContextMenuRadioItem rows. Use ContextMenuLabel above the options when you need a section heading.",
          "notes": [],
          "fields": [
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value for the radio group."
            },
            {
              "name": "onValueChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a radio row is selected."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "b-dialog",
      "name": "Dialog",
      "href": "/overlay-and-popups/dialog",
      "url": "https://iconiqui.com/overlay-and-popups/dialog",
      "installPackage": "@iconiq/b-dialog",
      "installCommand": "npx shadcn@latest add @iconiq/b-dialog",
      "registryPath": "b-dialog.json",
      "registryUrl": "https://iconiqui.com/r/b-dialog.json",
      "summary": "Dialog, DialogTrigger, DialogClose, and DialogPortal are direct re-exports of the matching Radix dialog primitives.",
      "apiSections": [
        {
          "id": "dialog-root",
          "title": "Dialog",
          "summary": "Dialog, DialogTrigger, DialogClose, and DialogPortal are direct re-exports of the matching Radix dialog primitives.",
          "notes": [
            "Any remaining Dialog.Root props continue to work because the root export is the Radix primitive itself.",
            "Accessibility and focus-trap behavior come from Radix rather than additional wrapper logic here."
          ],
          "fields": [
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state on the Dialog root when you want the parent component to own visibility."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Uncontrolled initial state forwarded to Radix Dialog.Root."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever Radix requests a state change through triggers, overlay clicks, or escape key handling."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Composition surface for the trigger, content, and any related dialog helpers."
            }
          ]
        },
        {
          "id": "dialog-content",
          "title": "DialogContent",
          "summary": "Motion-enhanced content wrapper built around DialogPrimitive.Content and AnimatePresence.",
          "notes": [
            "Accessibility props and Radix callbacks such as onEscapeKeyDown, onPointerDownOutside, aria-describedby, and aria-labelledby are forwarded to DialogPrimitive.Content.",
            "DialogContent always renders its own close button in the top-right corner using DialogPrimitive.Close and the Lucide X icon."
          ],
          "fields": [
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controls whether the animated portal branch renders at all. In practice this must mirror the root open state for the content to appear and exit correctly."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the inner motion panel rather than the full-screen DialogPrimitive.Content wrapper."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Content rendered inside the animated panel. Each direct child is wrapped in its own motion.div for staggered entry."
            }
          ]
        },
        {
          "id": "dialog-trigger",
          "title": "DialogTrigger",
          "summary": "Radix trigger export used to open the dialog from any custom element.",
          "notes": [
            "Because DialogTrigger comes directly from Radix, it also accepts the remaining primitive props for event handling and accessibility wiring."
          ],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Lets you turn a custom button or link into the trigger without adding an extra wrapper element."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the trigger primitive."
            }
          ]
        },
        {
          "id": "dialog-close",
          "title": "DialogClose",
          "summary": "Radix close export used to dismiss the dialog from any custom control.",
          "notes": [
            "DialogContent also renders its own close button in the top-right corner using DialogClose and the Lucide X icon."
          ],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Lets you turn an existing button or link into the close control without adding an extra wrapper element."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the close primitive."
            }
          ]
        },
        {
          "id": "dialog-portal",
          "title": "DialogPortal",
          "summary": "Radix portal export for rendering dialog content outside the current DOM hierarchy.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Portal content such as overlay and dialog panel primitives."
            },
            {
              "name": "container",
              "type": "HTMLElement",
              "defaultValue": "",
              "required": false,
              "description": "Optional mount target for the portal. Defaults to document.body."
            }
          ]
        },
        {
          "id": "dialog-header",
          "title": "DialogHeader",
          "summary": "Layout helper for the title area at the top of dialog content.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Content rendered inside the header container."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the helper wrapper so spacing and alignment can be adjusted per dialog."
            }
          ]
        },
        {
          "id": "dialog-footer",
          "title": "DialogFooter",
          "summary": "Layout helper for actions or supporting context at the bottom of dialog content.",
          "notes": [
            "Both header and footer helpers accept the normal div HTML attribute surface in addition to className and children."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Content rendered inside the footer container."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the helper wrapper so spacing and alignment can be adjusted per dialog."
            }
          ]
        },
        {
          "id": "dialog-title",
          "title": "DialogTitle",
          "summary": "Semantic title helper forwarded to the matching Radix title primitive.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Text or inline markup rendered inside the title primitive."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default title styles."
            }
          ]
        },
        {
          "id": "dialog-description",
          "title": "DialogDescription",
          "summary": "Semantic description helper forwarded to the matching Radix description primitive.",
          "notes": [
            "Both title and description helpers forward refs to the underlying Radix primitives."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Text or inline markup rendered inside the description primitive."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default description styles."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "@radix-ui/react-slot",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "drawer",
      "name": "Drawer",
      "href": "/overlay-and-popups/drawer",
      "url": "https://iconiqui.com/overlay-and-popups/drawer",
      "installPackage": "@iconiq/drawer",
      "installCommand": "npx shadcn@latest add @iconiq/drawer",
      "registryPath": "drawer.json",
      "registryUrl": "https://iconiqui.com/r/drawer.json",
      "summary": "Vaul-backed drawer root that coordinates open state, drag gestures, overlay dismissal, focus management, and side-based placement for the compound parts.",
      "apiSections": [
        {
          "id": "drawer",
          "title": "Drawer",
          "summary": "Vaul-backed drawer root that coordinates open state, drag gestures, overlay dismissal, focus management, and side-based placement for the compound parts.",
          "notes": [
            "The root accepts the full Vaul Root prop surface, including drag callbacks, activeSnapPoint, closeThreshold, shouldScaleBackground, nested, and container.",
            "Direction defaults to bottom at the Vaul layer. Use the docs playground to preview top, left, and right placements."
          ],
          "fields": [
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Optional controlled open state. Pair it with onOpenChange when parent state should own the drawer lifecycle."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Initial open state for uncontrolled usage. Vaul skips the first enter animation when the drawer is mounted open."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the drawer opens or closes from the trigger, overlay, Escape key, close part, or drag release."
            },
            {
              "name": "direction",
              "type": "\"left\" | \"right\" | \"top\" | \"bottom\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Chooses the drawer edge and matching Vaul slide direction. The content classes style each direction with the appropriate inset and rounded leading edge."
            },
            {
              "name": "modal",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Keeps focus and outside interaction modal while the drawer is open. Set false for non-modal command surfaces."
            },
            {
              "name": "dismissible",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Allows overlay click, Escape, and drag gestures to close the drawer. Controlled drawers can disable this when a flow must be completed explicitly."
            },
            {
              "name": "handleOnly",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, drag-to-close is limited to a Vaul Handle part instead of the full panel surface."
            },
            {
              "name": "snapPoints",
              "type": "(number | string)[]",
              "defaultValue": "",
              "required": false,
              "description": "Optional Vaul snap points for stepped drawer heights or widths. Values may be percentages or px strings."
            }
          ]
        },
        {
          "id": "drawer-trigger",
          "title": "DrawerTrigger",
          "summary": "Opens the drawer from a button, link, or custom interactive target.",
          "notes": [],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Use when a local button or link should remain the visible trigger element."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the trigger primitive."
            }
          ]
        },
        {
          "id": "drawer-portal",
          "title": "DrawerPortal",
          "summary": "Portal wrapper for drawer overlay and panel content. DrawerContent composes it automatically in the common path.",
          "notes": [
            "DrawerPortal is kept as an exported part for API symmetry, while DrawerContent composes it automatically for the common overlay-plus-panel path."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Overlay and panel content rendered outside the page flow."
            }
          ]
        },
        {
          "id": "drawer-overlay",
          "title": "DrawerOverlay",
          "summary": "Full-screen overlay rendered behind the drawer panel.",
          "notes": [],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default overlay tint and blur classes."
            }
          ]
        },
        {
          "id": "drawer-content",
          "title": "DrawerContent",
          "summary": "Portals the overlay and animated panel, applies direction-aware layout classes, and supports an optional close button.",
          "notes": [
            "DrawerBody marks only the scrollable middle section as non-draggable so text selection does not trigger drag-to-close.",
            "DrawerContent applies safe-area padding and max-height caps for mobile notches and home indicators."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Drawer body content rendered inside the animated panel."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the direction-aware panel geometry and surface classes."
            },
            {
              "name": "size",
              "type": "\"sm\" | \"default\" | \"lg\" | \"full\"",
              "defaultValue": "\"default\"",
              "required": false,
              "description": "Controls panel width for left and right drawers and max height for top and bottom drawers."
            },
            {
              "name": "showCloseButton",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Renders an absolute close button in the panel corner. Useful for side drawers and quick dismissal."
            },
            {
              "name": "showOverlay",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Toggles the default overlay. Set false for non-modal surfaces or custom overlay composition."
            },
            {
              "name": "overlayClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto DrawerOverlay when showOverlay is true."
            }
          ]
        },
        {
          "id": "drawer-body",
          "title": "DrawerBody",
          "summary": "Scrollable middle section between header and footer with drag disabled for text selection.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Scrollable drawer content."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default body scroll classes."
            }
          ]
        },
        {
          "id": "drawer-actions",
          "title": "DrawerAction / DrawerCancel",
          "summary": "Styled footer buttons with squircle corners and optional closeOnClick control for async flows.",
          "notes": [],
          "fields": [
            {
              "name": "variant",
              "type": "\"default\" | \"destructive\"",
              "defaultValue": "",
              "required": false,
              "description": "DrawerAction tone. DrawerCancel uses the muted secondary style."
            },
            {
              "name": "closeOnClick",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When false, the click handler runs without closing the drawer. Useful for async submit flows."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Compose onto an existing button element."
            }
          ]
        },
        {
          "id": "drawer-media",
          "title": "DrawerMedia",
          "summary": "Optional icon slot for headers, matching the dialog media treatment.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Icon or media rendered inside the circular slot."
            }
          ]
        },
        {
          "id": "drawer-nested",
          "title": "DrawerNested",
          "summary": "Nested Vaul root for stacking a second drawer above an open drawer.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Nested drawer composition rendered above the parent drawer."
            }
          ]
        },
        {
          "id": "drawer-close",
          "title": "DrawerClose",
          "summary": "Closes the drawer from a button or custom interactive target.",
          "notes": [],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Use asChild to turn an existing footer action into the close control."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the close primitive."
            }
          ]
        },
        {
          "id": "drawer-header",
          "title": "DrawerHeader",
          "summary": "Layout helper for the title area at the top of the drawer panel.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Header content such as DrawerTitle and DrawerDescription."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default header spacing classes."
            }
          ]
        },
        {
          "id": "drawer-footer",
          "title": "DrawerFooter",
          "summary": "Layout helper for actions or supporting context at the bottom of the drawer.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Footer actions or supporting context."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default footer spacing classes."
            }
          ]
        },
        {
          "id": "drawer-title",
          "title": "DrawerTitle",
          "summary": "Accessible heading part forwarded to Vaul's dialog title primitive.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Drawer heading content."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default title typography classes."
            }
          ]
        },
        {
          "id": "drawer-description",
          "title": "DrawerDescription",
          "summary": "Accessible helper text part forwarded to Vaul's dialog description primitive.",
          "notes": [
            "DrawerTitle and DrawerDescription should be included inside DrawerHeader when the panel needs accessible labeling."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Supporting description copy beneath the drawer title."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged with the default description typography classes."
            }
          ]
        },
        {
          "id": "drawer-motion-layout",
          "title": "Motion and layout",
          "summary": "The component leans on Vaul's drag-aware transform animation, then adds softer overlay timing, tuned animation duration, and direction-specific panel geometry.",
          "notes": [
            "DrawerBody marks only the scrollable middle section as non-draggable so text selection does not trigger drag-to-close.",
            "Size variants control width for side drawers and safe-area-aware max height for top and bottom drawers."
          ],
          "fields": [
            {
              "name": "overlay",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "A fixed full-screen overlay fades in behind the drawer with a stronger black tint and backdrop blur support."
            },
            {
              "name": "content",
              "type": "built-in",
              "defaultValue": "",
              "required": false,
              "description": "The panel gets a fluid cubic-bezier open curve, a shorter close duration, GPU-friendly transform hints, and a slightly extended initial transform for a softer arrival."
            }
          ]
        }
      ],
      "dependencies": [
        "vaul",
        "lucide-react"
      ]
    },
    {
      "slug": "r-dropdown",
      "name": "Dropdown",
      "href": "/overlay-and-popups/dropdown",
      "url": "https://iconiqui.com/overlay-and-popups/dropdown",
      "installPackage": "@iconiq/r-dropdown",
      "installCommand": "npx shadcn@latest add @iconiq/r-dropdown",
      "registryPath": "r-dropdown.json",
      "registryUrl": "https://iconiqui.com/r/r-dropdown.json",
      "summary": "Root provider that coordinates open state, selected value state, and the shared behavior used by the trigger, content, and item primitives.",
      "apiSections": [
        {
          "id": "dropdown",
          "title": "Dropdown",
          "summary": "Root provider that coordinates open state, selected value state, and the shared behavior used by the trigger, content, and item primitives.",
          "notes": [
            "Radix DropdownMenu.Root handles open state, focus restoration, outside interactions, and keyboard typeahead.",
            "The menu content is portaled and collision-aware. Escape and outside clicks close the menu.",
            "Shadcn-style aliases such as DropdownMenu and DropdownMenuItem are exported from the same file."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Compose DropdownTrigger, DropdownContent, DropdownItem, and optional helpers like DropdownValue, DropdownSeparator, or DropdownSub inside the root."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value for the select variant. Action mode usually leaves this unset."
            },
            {
              "name": "defaultValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Initial selected value for uncontrolled select usage."
            },
            {
              "name": "onValueChange",
              "type": "(value: string | undefined) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a select item updates the current value."
            },
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state for the menu surface."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Initial open state for uncontrolled usage."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the trigger, outside click handling, or Escape key changes the open state."
            },
            {
              "name": "variant",
              "type": "\"select\" | \"action\"",
              "defaultValue": "select",
              "required": false,
              "description": "Use select when items should commit a persistent value with a checkmark, or action when items should behave like immediate commands. For form fields, prefer the dedicated r-select install."
            },
            {
              "name": "modal",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, Radix traps focus and blocks outside interaction while the menu is open."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Disables the trigger and prevents opening the menu from the root."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional form field name. In select mode, renders a hidden input that submits the current value."
            },
            {
              "name": "required",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Marks the hidden select input as required when name is provided."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the outer relative wrapper around the trigger and content."
            }
          ]
        },
        {
          "id": "dropdown-trigger",
          "title": "DropdownTrigger",
          "summary": "Interactive trigger button that opens and closes the menu. It works with plain children, DropdownValue, or custom trigger content like an avatar.",
          "notes": [
            "The trigger is always rendered as a motion button with a subtle press scale. Custom trigger visuals should be passed as children and styled with className.",
            "ArrowDown and ArrowUp on the trigger open the menu and move focus to the first or last enabled item."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Trigger content. In select mode this usually includes DropdownValue, while action menus can pass custom content such as an avatar or label row."
            },
            {
              "name": "showChevron",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Hides the default chevron when you want a cleaner custom trigger, such as an avatar-only action menu."
            },
            {
              "name": "triggerShape",
              "type": "\"default\" | \"avatar\"",
              "defaultValue": "default",
              "required": false,
              "description": "Use avatar to skip squircle corner styling on circular image triggers."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the trigger button shell."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents opening and dims the trigger styling. Root disabled also applies when this prop is omitted."
            }
          ]
        },
        {
          "id": "dropdown-value",
          "title": "DropdownValue",
          "summary": "Small helper for select mode that reads the current value from context and prints the matching item label or a placeholder.",
          "notes": [
            "DropdownValue is only useful in select mode. Action menus usually provide their own trigger content instead."
          ],
          "fields": [
            {
              "name": "placeholder",
              "type": "string",
              "defaultValue": "\"Select an option\"",
              "required": false,
              "description": "Text shown when no matching selected value is currently registered."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered span inside the trigger."
            }
          ]
        },
        {
          "id": "dropdown-content",
          "title": "DropdownContent",
          "summary": "Animated menu surface that positions itself under the trigger and renders the item list for either variant.",
          "notes": [
            "The content is portaled, animates open/close with Iconiq motion, and constrains long menus with a Radix Scroll Area hover scrollbar.",
            "When you pass className=\"w-full\", the surface maps to the trigger-width CSS variable so select triggers keep matching widths.",
            "The panel exposes id for aria-controls and uses listbox or menu role based on the root variant."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually DropdownItem children, with optional DropdownSeparator nodes between groups."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "start",
              "required": false,
              "description": "Alignment relative to the trigger along the cross axis."
            },
            {
              "name": "side",
              "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
              "defaultValue": "bottom",
              "required": false,
              "description": "Preferred placement relative to the trigger."
            },
            {
              "name": "avoidCollisions",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When true, Radix flips or shifts the menu to stay inside the viewport."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "8",
              "required": false,
              "description": "Gap between the trigger and the dropdown surface."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the dropdown surface, which is useful for setting a custom width or changing shadows in docs/examples."
            }
          ]
        },
        {
          "id": "dropdown-item",
          "title": "DropdownItem",
          "summary": "Single interactive row used by both variants. In select mode it can register a value, and in action mode it acts like a plain command item.",
          "notes": [
            "Select items show a trailing checkmark and aria-selected when the item value matches the root value.",
            "Keyboard and pointer focus share the same animated row highlight.",
            "If you omit value in select mode, the item behaves like a plain closing action and will not update the current value."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Row content. You can place icons inline before the label for action menus or richer item layouts."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Selection key for select mode. When it matches the root value, the item renders the checkmark state."
            },
            {
              "name": "textValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional explicit label used by DropdownValue and typeahead when your item children are not plain text."
            },
            {
              "name": "onClick",
              "type": "(event: MouseEvent<HTMLDivElement>) => void",
              "defaultValue": "",
              "required": false,
              "description": "Runs before the item closes the menu. Action menus typically use this for immediate commands like profile or logout."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents interaction and dims the row."
            }
          ]
        },
        {
          "id": "dropdown-checkbox-item",
          "title": "DropdownCheckboxItem",
          "summary": "Toggle row for multi-select action menus. Checked state is controlled with checked and onCheckedChange.",
          "notes": [
            "DropdownMenuCheckboxItem is exported as a shadcn-compatible alias."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Row label and optional leading icon."
            },
            {
              "name": "checked",
              "type": "boolean | 'indeterminate'",
              "defaultValue": "",
              "required": false,
              "description": "Controlled checked state for the row."
            },
            {
              "name": "onCheckedChange",
              "type": "(checked: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when the row toggles checked state."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents interaction and dims the row."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the checkbox row shell."
            }
          ]
        },
        {
          "id": "dropdown-radio-group",
          "title": "DropdownRadioGroup",
          "summary": "Groups radio rows that commit a single value inside action or select menus.",
          "notes": [
            "DropdownRadioItem values also register with DropdownValue when variant is select."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually DropdownRadioItem children."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Controlled selected value for the radio group."
            },
            {
              "name": "onValueChange",
              "type": "(value: string) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called when a radio item is chosen."
            }
          ]
        },
        {
          "id": "dropdown-radio-item",
          "title": "DropdownRadioItem",
          "summary": "Single radio row with a trailing dot indicator.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Row label and optional leading icon."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Radio value committed when the row is chosen."
            },
            {
              "name": "textValue",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional explicit label used by DropdownValue and typeahead."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Prevents interaction and dims the row."
            }
          ]
        },
        {
          "id": "dropdown-sub",
          "title": "DropdownSub",
          "summary": "Nested submenu root. Compose DropdownSubTrigger and DropdownSubContent inside it.",
          "notes": [
            "DropdownMenuSub, DropdownMenuSubTrigger, and DropdownMenuSubContent are exported as aliases."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "DropdownSubTrigger followed by DropdownSubContent."
            }
          ]
        },
        {
          "id": "dropdown-shortcut",
          "title": "DropdownShortcut",
          "summary": "Muted trailing shortcut label helper for action menu rows.",
          "notes": [],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Shortcut text such as ⌘K or Ctrl+S."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the shortcut span."
            }
          ]
        },
        {
          "id": "dropdown-group",
          "title": "DropdownGroup",
          "summary": "Optional wrapper for chunking larger menus into sections, with or without a visible label.",
          "notes": [
            "Label is optional. Without it, the wrapper only provides spacing unless you also pass aria-label or aria-labelledby.",
            "If you provide label, the wrapper upgrades to role=group and wires aria-labelledby automatically."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Usually one or more DropdownItem nodes. Add label when you want a visible heading, or omit it when you just want grouped spacing."
            },
            {
              "name": "label",
              "type": "ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional convenience heading rendered with DropdownLabel styling and linked to the group for assistive technologies."
            },
            {
              "name": "labelClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the generated section heading when you want to tweak its spacing or tone."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the group wrapper. The base version adds light vertical spacing between grouped rows."
            }
          ]
        },
        {
          "id": "dropdown-label",
          "title": "DropdownLabel",
          "summary": "Standalone non-interactive heading helper for advanced content layouts or custom grouping patterns.",
          "notes": [
            "Use this directly when you want a heading style without the convenience wrapper supplied by DropdownGroup."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Short section text such as Product, Billing, or Workspace settings."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered div when you want to adjust spacing, weight, or casing locally."
            }
          ]
        },
        {
          "id": "dropdown-separator",
          "title": "DropdownSeparator",
          "summary": "Simple divider for grouping related items inside the content surface.",
          "notes": [
            "The separator renders a one-pixel rule using the dropdown border token."
          ],
          "fields": [
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the divider element when you want to adjust spacing or tone locally."
            }
          ]
        }
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "@radix-ui/react-scroll-area",
        "motion",
        "lucide-react"
      ]
    },
    {
      "slug": "b-hover-card",
      "name": "Hover Card",
      "href": "/overlay-and-popups/hover-card",
      "url": "https://iconiqui.com/overlay-and-popups/hover-card",
      "installPackage": "@iconiq/b-hover-card",
      "installCommand": "npx shadcn@latest add @iconiq/b-hover-card",
      "registryPath": "b-hover-card.json",
      "registryUrl": "https://iconiqui.com/r/b-hover-card.json",
      "summary": "Stateful wrapper that opens a callout on delayed hover or immediate focus, then closes it once pointer and focus both leave the hover-card region.",
      "apiSections": [
        {
          "id": "hover-card",
          "title": "HoverCard",
          "summary": "Stateful wrapper that opens a callout on delayed hover or immediate focus, then closes it once pointer and focus both leave the hover-card region.",
          "notes": [
            "Open state is internal only. This implementation does not expose a controlled open prop or state-change callback.",
            "The root manages hover and focus timing while Radix Popover handles portal-based positioning and collision avoidance.",
            "Pending timers are cleared before every new open or close request and again during unmount cleanup."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Composition surface for the trigger and content primitives rendered inside the hover card root."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the inline-flex wrapper that groups the trigger and content primitives."
            },
            {
              "name": "openDelay",
              "type": "number",
              "defaultValue": "80",
              "required": false,
              "description": "Delay in milliseconds before the card opens after pointer entry. Keyboard focus opens immediately."
            },
            {
              "name": "closeDelay",
              "type": "number",
              "defaultValue": "120",
              "required": false,
              "description": "Delay in milliseconds before the card closes after pointer exit. Blur closes immediately unless focus is still moving within the card."
            }
          ]
        },
        {
          "id": "hover-card-trigger",
          "title": "HoverCardTrigger",
          "summary": "Trigger surface that renders a button by default or forwards behavior into a custom child through Radix Slot.",
          "notes": [
            "When asChild is false, the component renders a plain button with type='button', a larger default hit area, and a visible focus ring.",
            "The trigger is also used as the positioning anchor and automatically receives aria-expanded, aria-controls, and aria-haspopup.",
            "Standard button props such as disabled, onClick, aria-*, and data-* are forwarded to the rendered trigger element."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the trigger or by the child passed through asChild."
            },
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Lets you supply your own trigger element while keeping the hover-card trigger behavior and class merging."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered trigger element for local layout or visual styling."
            }
          ]
        },
        {
          "id": "hover-card-content",
          "title": "HoverCardContent",
          "summary": "Animated content panel with collision-aware positioning, side and align controls, and a spring-driven scale and directional offset fade.",
          "notes": [
            "Additional motion.div props such as style, role, onClick, aria-*, and data-* are forwarded, but initial, animate, exit, and transition are reserved by the component.",
            "The panel is portaled through Radix Popover content, so it can escape overflow-hidden ancestors and reposition near viewport edges.",
            "Focus can move from the trigger into interactive content without immediately closing the card.",
            "By default the content is centered below the trigger with a fixed w-72 width, no drop shadow, and a 12px hover bridge across the trigger-to-panel gap."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Content rendered inside the hover card panel."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the motion.div panel so width, spacing, or surface styles can be adjusted."
            },
            {
              "name": "side",
              "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
              "defaultValue": "\"bottom\"",
              "required": false,
              "description": "Preferred side for the panel before collision handling adjusts the placement."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "\"center\"",
              "required": false,
              "description": "Horizontal or vertical alignment relative to the trigger, depending on side."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "12",
              "required": false,
              "description": "Gap between trigger and panel. The component also extends an invisible hover bridge through that gap to reduce accidental closes."
            },
            {
              "name": "alignOffset",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Additional offset applied along the alignment axis."
            },
            {
              "name": "avoidCollisions",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Enables Radix collision handling so the card can shift or flip when space is tight."
            },
            {
              "name": "collisionPadding",
              "type": "number | Partial<Record<Side, number>>",
              "defaultValue": "12",
              "required": false,
              "description": "Padding from viewport edges used during collision detection."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-popover",
      "name": "Popover",
      "href": "/overlay-and-popups/popover",
      "url": "https://iconiqui.com/overlay-and-popups/popover",
      "installPackage": "@iconiq/b-popover",
      "installCommand": "npx shadcn@latest add @iconiq/b-popover",
      "registryPath": "b-popover.json",
      "registryUrl": "https://iconiqui.com/r/b-popover.json",
      "summary": "Thin wrapper around `PopoverPrimitive.Root` that mirrors the resolved open state into local context so `PopoverContent` can infer presence automatically.",
      "apiSections": [
        {
          "id": "popover-root",
          "title": "Popover",
          "summary": "Thin wrapper around `PopoverPrimitive.Root` that mirrors the resolved open state into local context so `PopoverContent` can infer presence automatically.",
          "notes": [
            "Remaining root props such as `modal` continue to flow through to the underlying Radix popover root."
          ],
          "fields": [
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Controlled open state on the Radix root when you want React state to own visibility."
            },
            {
              "name": "defaultOpen",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Uncontrolled initial state forwarded to the underlying Radix popover root."
            },
            {
              "name": "onOpenChange",
              "type": "(open: boolean) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever Radix requests a state change through the trigger, outside interaction, or escape handling."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Composition surface for the trigger, optional anchor, and content primitives."
            }
          ]
        },
        {
          "id": "popover-trigger",
          "title": "PopoverTrigger",
          "summary": "Light wrapper around the Radix trigger with a larger default hit area when not using asChild.",
          "notes": [
            "When you render an icon-only trigger with asChild, keep the interactive target around 40-44px so the hit area stays comfortable on touch and pointer devices."
          ],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Lets you render your own button, link, or wrapper element without adding an extra DOM node."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Interactive content rendered by the trigger primitive."
            }
          ]
        },
        {
          "id": "popover-anchor",
          "title": "PopoverAnchor",
          "summary": "Radix positioning anchor used when the popover should attach to a non-trigger element.",
          "notes": [
            "PopoverAnchor still accepts the remaining primitive props for event handling and accessibility wiring."
          ],
          "fields": [
            {
              "name": "asChild",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Lets you render your own anchor element without adding an extra DOM node."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Layout content rendered by the anchor primitive."
            }
          ]
        },
        {
          "id": "popover-content",
          "title": "PopoverContent",
          "summary": "Animated content wrapper built on Radix Popover.Content and AnimatePresence.",
          "notes": [
            "Remaining Radix content props are forwarded through to PopoverPrimitive.Content, including side, collisionPadding, onEscapeKeyDown, and accessibility props.",
            "The component always renders inside a Radix portal, reads the resolved placement for direction-aware motion, and uses the Radix transform-origin CSS variable so scaling stays anchored to the trigger.",
            "The panel ships without drop shadow so the surface stays flat against the page.",
            "Content size changes animate while the popover is open, so progressive disclosure and copy swaps do not snap abruptly.",
            "Entry and exit animation are owned internally, so Motion-specific props such as initial, animate, exit, and transition are not part of the public prop surface."
          ],
          "fields": [
            {
              "name": "open",
              "type": "boolean",
              "defaultValue": "",
              "required": false,
              "description": "Accepted for backwards compatibility, but no longer required. The nearest `Popover` root state now drives content presence automatically."
            },
            {
              "name": "children",
              "type": "ReactNode",
              "defaultValue": "",
              "required": true,
              "description": "Content rendered inside the animated panel."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the motion.div panel for local width, spacing, or surface overrides."
            },
            {
              "name": "align",
              "type": "\"start\" | \"center\" | \"end\"",
              "defaultValue": "center",
              "required": false,
              "description": "Forwarded to Radix Popover.Content to control horizontal alignment relative to the trigger or anchor."
            },
            {
              "name": "sideOffset",
              "type": "number",
              "defaultValue": "8",
              "required": false,
              "description": "Forwarded to Radix Popover.Content to control the gap between the anchor and the floating panel."
            },
            {
              "name": "collisionPadding",
              "type": "number | Partial<Record<Side, number>>",
              "defaultValue": "12",
              "required": false,
              "description": "Adds a little default breathing room from the viewport edge before collision handling nudges the popover inward."
            }
          ]
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "b-tooltip",
      "name": "Tooltip",
      "href": "/overlay-and-popups/tooltip",
      "url": "https://iconiqui.com/overlay-and-popups/tooltip",
      "installPackage": "@iconiq/b-tooltip",
      "installCommand": "npx shadcn@latest add @iconiq/b-tooltip",
      "registryPath": "b-tooltip.json",
      "registryUrl": "https://iconiqui.com/r/b-tooltip.json",
      "summary": "Animated tooltip with a canonical Tooltip export. It owns its own open state, expects a single trigger element, and toggles in response to hover and focus events.",
      "apiSections": [
        {
          "id": "tooltip",
          "title": "Tooltip",
          "summary": "Animated tooltip with a canonical Tooltip export. It owns its own open state, expects a single trigger element, and toggles in response to hover and focus events.",
          "notes": [
            "The trigger forwards onMouseEnter, onMouseLeave, onFocus, and onBlur directly into the child element through Radix Slot.",
            "The timeout used for delayed open is cleared on leave and again on unmount.",
            "Development builds warn when tooltip content grows beyond a short single-line hint."
          ],
          "fields": [
            {
              "name": "children",
              "type": "ReactElement",
              "defaultValue": "",
              "required": true,
              "description": "A single trigger element that receives hover, focus, and aria-describedby props through a slotted wrapper."
            },
            {
              "name": "content",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "Short, non-interactive tooltip copy rendered inside the animated bubble. Use Popover for longer or richer content."
            },
            {
              "name": "side",
              "type": "\"top\" | \"bottom\" | \"left\" | \"right\"",
              "defaultValue": "top",
              "required": false,
              "description": "Preferred popup side passed into the collision-aware Radix popover positioner."
            },
            {
              "name": "delay",
              "type": "number",
              "defaultValue": "0.15",
              "required": false,
              "description": "Open delay in seconds. The implementation multiplies it by 1000 before scheduling the timer."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the tooltip bubble for local surface styling overrides."
            }
          ]
        },
        {
          "id": "tooltip-positioning",
          "title": "Positioning and accessibility",
          "summary": "This tooltip is portaled through Radix Popover so it can avoid viewport collisions and escape clipping parents.",
          "notes": [
            "The trigger receives an aria-describedby link to the active tooltip bubble.",
            "The popup uses avoidCollisions with collisionPadding=12 and sideOffset=10.",
            "The arrow is a rotated square whose placement follows the resolved data-side from Radix positioning."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "@base-ui/react",
        "motion"
      ]
    },
    {
      "slug": "radial-button",
      "name": "Radial Button",
      "href": "/special-one/radial-button",
      "url": "https://iconiqui.com/special-one/radial-button",
      "installPackage": "@iconiq/radial-button",
      "installCommand": "npx shadcn@latest add @iconiq/radial-button",
      "registryPath": "radial-button.json",
      "registryUrl": "https://iconiqui.com/r/radial-button.json",
      "summary": "Ref-forwarding motion button with a radial fill, press feedback, and native form support. Hover, focus-visible, pointer-down, and keyboard activation spread the fill from the entry point.",
      "apiSections": [
        {
          "id": "radial-button",
          "title": "RadialButton",
          "summary": "Ref-forwarding motion button with a radial fill, press feedback, and native form support. Hover, focus-visible, pointer-down, and keyboard activation spread the fill from the entry point.",
          "notes": [
            "Standard button attributes such as aria-*, autoFocus, formAction, formEncType, formMethod, formNoValidate, formTarget, and data-* are forwarded to the underlying motion.button.",
            "Pointer-down sets the fill origin at the click point and enters a pressed state; pointer-up, pointer-leave, pointer-cancel, and blur clear it.",
            "Space and Enter mirror the pressed and fill state for keyboard users. Space calls preventDefault so the page does not scroll while the button is focused.",
            "Uses card/muted surfaces in dark mode, a foreground fill in light mode, and a neutral-50 fill in dark mode so resting and filled states stay legible.",
            "Icon-only usage should include aria-label or aria-labelledby for an accessible name."
          ],
          "fields": [
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Button label or custom content rendered above the animated fill layer."
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\"",
              "defaultValue": "button",
              "required": false,
              "description": "Native button type. Defaults to button so the control does not submit a form unless you opt in."
            },
            {
              "name": "loading",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Sets aria-busy and disables interaction while a form or async action is in progress."
            },
            {
              "name": "disabled",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "Native disabled state. Also suppresses fill, press, and ripple-like feedback."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional class names merged onto the root button element."
            },
            {
              "name": "onClick",
              "type": "React.MouseEventHandler<HTMLButtonElement>",
              "defaultValue": "",
              "required": false,
              "description": "Native click handler forwarded to the underlying button."
            },
            {
              "name": "name",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Form field name submitted with the parent form."
            },
            {
              "name": "value",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional submitted value when type is submit."
            },
            {
              "name": "form",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Associates the button with a form element by id."
            }
          ]
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "dia-text",
      "name": "Dia Text",
      "href": "/texts/dia-text",
      "url": "https://iconiqui.com/texts/dia-text",
      "installPackage": "@iconiq/dia-text",
      "installCommand": "npx shadcn@latest add @iconiq/dia-text",
      "registryPath": "dia-text.json",
      "registryUrl": "https://iconiqui.com/r/dia-text.json",
      "summary": "Animated inline text reveal that sweeps a multicolor gradient band across one string or rotates through multiple strings while preserving the same baseline flow.",
      "apiSections": [
        {
          "id": "dia-text",
          "title": "DiaTextReveal",
          "summary": "Animated inline text reveal that sweeps a multicolor gradient band across one string or rotates through multiple strings while preserving the same baseline flow.",
          "notes": [
            "The component forwards the remaining Motion span props, so aria attributes, inline data attributes, and other span-level props can still be applied at the call site.",
            "Children are not part of the public API surface here; the rendered content always comes from the text prop."
          ],
          "fields": [
            {
              "name": "text",
              "type": "string | string[]",
              "defaultValue": "",
              "required": true,
              "description": "Single string to reveal, or an array of strings to cycle through. When you pass multiple entries, the component tracks an active index and can animate width between them."
            },
            {
              "name": "colors",
              "type": "string[]",
              "defaultValue": "",
              "required": false,
              "description": "Gradient stops used for the sweep band. If omitted, the component uses its built-in five-color palette."
            },
            {
              "name": "textColor",
              "type": "string",
              "defaultValue": "\"var(--foreground)\"",
              "required": false,
              "description": "Base text color used before and after the animated color band passes across the text."
            },
            {
              "name": "duration",
              "type": "number",
              "defaultValue": "1.5",
              "required": false,
              "description": "Duration of the sweep animation in seconds for each reveal cycle."
            },
            {
              "name": "delay",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Delay in seconds before the reveal animation begins."
            },
            {
              "name": "repeat",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, the component keeps replaying the sweep and advances through the text array if multiple entries are provided."
            },
            {
              "name": "repeatDelay",
              "type": "number",
              "defaultValue": "0.5",
              "required": false,
              "description": "Pause in seconds between repeated reveal cycles."
            },
            {
              "name": "triggerOnView",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Toggles viewport-based playback. When true, the reveal waits until the span enters view before it starts."
            },
            {
              "name": "once",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "Controls whether in-view playback should only happen once or be allowed to replay when the element re-enters view."
            },
            {
              "name": "fixedWidth",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When rotating multiple text entries, fixes the rendered width to the widest measured string instead of animating width between each item."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the rendered motion span for local typography or layout overrides."
            }
          ]
        },
        {
          "id": "dia-text-motion",
          "title": "Motion and width behavior",
          "summary": "The reveal is driven by a motion value that builds a gradient band in real time, then optionally replays and rotates through measured text entries.",
          "notes": [
            "When multiple text values are provided, the component clones the span to measure each string and can animate the width between entries for a smoother swap.",
            "If triggerOnView is enabled, playback is gated by the local viewport observer instead of always running on mount."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "morph-texts",
      "name": "Morph Text",
      "href": "/texts/morph-texts",
      "url": "https://iconiqui.com/texts/morph-texts",
      "installPackage": "@iconiq/morph-texts",
      "installCommand": "npx shadcn@latest add @iconiq/morph-texts",
      "registryPath": "morph-texts.json",
      "registryUrl": "https://iconiqui.com/r/morph-texts.json",
      "summary": "Cycling headline treatment that morphs between words with blur, scale, and an SVG goo filter while optionally revealing subtext beneath the rotator.",
      "apiSections": [
        {
          "id": "morph-texts",
          "title": "MorphText",
          "summary": "Cycling headline treatment that morphs between words with blur, scale, and an SVG goo filter while optionally revealing subtext beneath the rotator.",
          "notes": [
            "The active word is announced through aria-live=polite so screen readers can follow the rotation.",
            "Each instance generates a unique SVG filter id so multiple MorphText components can coexist on one page."
          ],
          "fields": [
            {
              "name": "words",
              "type": "string[]",
              "defaultValue": "",
              "required": true,
              "description": "Words or short phrases to cycle through. The component advances to the next entry on each interval tick."
            },
            {
              "name": "interval",
              "type": "number",
              "defaultValue": "3000",
              "required": false,
              "description": "Milliseconds each word stays active before the next morph transition begins."
            },
            {
              "name": "subtext",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Optional supporting line rendered below the morphing word with a delayed fade-up entrance."
            },
            {
              "name": "fontSize",
              "type": "string",
              "defaultValue": "\"clamp(3rem, 15vw, 10rem)\"",
              "required": false,
              "description": "CSS font-size value applied to the morphing headline container."
            },
            {
              "name": "fontFamily",
              "type": "string",
              "defaultValue": "\"Space Grotesk\", sans-serif",
              "required": false,
              "description": "CSS font-family value applied to the headline and subtext."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root wrapper for layout and color overrides."
            },
            {
              "name": "textClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the morphing text container when you need local typography overrides."
            },
            {
              "name": "subtextClassName",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the optional subtext element."
            }
          ]
        },
        {
          "id": "morph-texts-motion",
          "title": "Morph transition behavior",
          "summary": "Word changes are driven by AnimatePresence and Motion variants that overlap enter and exit states so the goo filter can blend the outgoing and incoming text.",
          "notes": [
            "Enter and exit animate opacity, blur, and scale over roughly 0.9 seconds with an ease-in-out curve.",
            "When only one word is provided, the interval timer is skipped and the headline stays static."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "reveal-text",
      "name": "Reveal Text",
      "href": "/texts/reveal-text",
      "url": "https://iconiqui.com/texts/reveal-text",
      "installPackage": "@iconiq/reveal-text",
      "installCommand": "npx shadcn@latest add @iconiq/reveal-text",
      "registryPath": "reveal-text.json",
      "registryUrl": "https://iconiqui.com/r/reveal-text.json",
      "summary": "Staggered text reveal that animates each word or character upward with blur and opacity, with optional viewport-triggered playback and reduced-motion fallbacks.",
      "apiSections": [
        {
          "id": "reveal-text",
          "title": "RevealText",
          "summary": "Staggered text reveal that animates each word or character upward with blur and opacity, with optional viewport-triggered playback and reduced-motion fallbacks.",
          "notes": [
            "Reduced-motion users receive a shorter opacity-only reveal while preserving readable timing.",
            "Duplicate words or characters on the same line receive stable keys so repeated units still animate independently."
          ],
          "fields": [
            {
              "name": "text",
              "type": "string | string[]",
              "defaultValue": "",
              "required": true,
              "description": "Copy to reveal. Pass one string or multiple lines; each line renders on its own block row."
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"span\"",
              "required": false,
              "description": "Root element type for the reveal container while preserving the same split and stagger behavior."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root container for typography, spacing, and layout overrides."
            },
            {
              "name": "split",
              "type": "\"word\" | \"char\"",
              "defaultValue": "\"word\"",
              "required": false,
              "description": "Controls whether the animation staggers by word or by individual character."
            },
            {
              "name": "stagger",
              "type": "number",
              "defaultValue": "0.09",
              "required": false,
              "description": "Delay in seconds added between each word or character in the sequence."
            },
            {
              "name": "delay",
              "type": "number",
              "defaultValue": "0",
              "required": false,
              "description": "Base delay in seconds before the first unit begins animating."
            },
            {
              "name": "blur",
              "type": "number",
              "defaultValue": "12",
              "required": false,
              "description": "Starting blur amount in pixels for each unit before it settles into focus."
            },
            {
              "name": "yOffset",
              "type": "string | number",
              "defaultValue": "\"40%\"",
              "required": false,
              "description": "Starting vertical offset for each unit. Accepts Motion-friendly values such as percentages or pixel lengths."
            },
            {
              "name": "spring",
              "type": "{ stiffness?: number; damping?: number; mass?: number }",
              "defaultValue": "",
              "required": false,
              "description": "Optional spring overrides for the vertical settle motion on each unit."
            },
            {
              "name": "once",
              "type": "boolean",
              "defaultValue": "true",
              "required": false,
              "description": "When whileInView is enabled, controls whether the in-view trigger should fire only once."
            },
            {
              "name": "whileInView",
              "type": "boolean",
              "defaultValue": "false",
              "required": false,
              "description": "When true, the reveal waits until the root enters the viewport before animating."
            },
            {
              "name": "children",
              "type": "React.ReactNode",
              "defaultValue": "",
              "required": false,
              "description": "Optional content rendered after the animated text lines inside the root container."
            }
          ]
        },
        {
          "id": "reveal-text-motion",
          "title": "Reveal transition behavior",
          "summary": "Each unit animates y, opacity, and filter on independent timelines so the blur fade can trail slightly behind the spring settle.",
          "notes": [
            "Word mode preserves spaces between tokens with non-breaking space spans.",
            "Character mode uses Array.from so multi-byte characters split correctly."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "shimmer-text",
      "name": "Shimmer Text",
      "href": "/texts/shimmer-text",
      "url": "https://iconiqui.com/texts/shimmer-text",
      "installPackage": "@iconiq/shimmer-text",
      "installCommand": "npx shadcn@latest add @iconiq/shimmer-text",
      "registryPath": "shimmer-text.json",
      "registryUrl": "https://iconiqui.com/r/shimmer-text.json",
      "summary": "Animated text treatment that moves a highlight band across one string of copy while keeping the base text readable in both light and dark themes.",
      "apiSections": [
        {
          "id": "shimmer-text",
          "title": "TextShimmer",
          "summary": "Animated text treatment that moves a highlight band across one string of copy while keeping the base text readable in both light and dark themes.",
          "notes": [
            "The component memoizes the computed spread width so it only recalculates when the string content or spread value changes.",
            "Base and highlight colors come from internal CSS custom properties, which can still be overridden through className if you want a different shimmer tone."
          ],
          "fields": [
            {
              "name": "children",
              "type": "string",
              "defaultValue": "",
              "required": true,
              "description": "The text content to shimmer. The component expects a string because it derives the highlight spread from the child length."
            },
            {
              "name": "as",
              "type": "React.ElementType",
              "defaultValue": "\"p\"",
              "required": false,
              "description": "Changes which HTML element gets rendered while preserving the same shimmer animation behavior."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the motion element for local typography, spacing, or color-variable overrides."
            },
            {
              "name": "duration",
              "type": "number",
              "defaultValue": "2",
              "required": false,
              "description": "Duration in seconds for one full shimmer sweep from right to left."
            },
            {
              "name": "spread",
              "type": "number",
              "defaultValue": "2",
              "required": false,
              "description": "Multiplier used to size the highlight band based on the current text length."
            }
          ]
        },
        {
          "id": "shimmer-text-motion",
          "title": "Motion and styling behavior",
          "summary": "The shimmer is driven by a looping background-position animation rather than per-character transforms, so the text stays stable while the highlight moves across it.",
          "notes": [
            "The moving band is composed from layered gradients: one animated highlight layer plus one static base-color layer.",
            "Dark mode swaps the base and highlight color variables automatically, so the same component remains legible without extra props.",
            "Because the component uses Motion's repeat loop with linear easing, the shimmer reads as continuous rather than pulsing in place."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion"
      ]
    },
    {
      "slug": "text-loop",
      "name": "Text Loop",
      "href": "/texts/text-loop",
      "url": "https://iconiqui.com/texts/text-loop",
      "installPackage": "@iconiq/text-loop",
      "installCommand": "npx shadcn@latest add @iconiq/text-loop",
      "registryPath": "text-loop.json",
      "registryUrl": "https://iconiqui.com/r/text-loop.json",
      "summary": "Cycling text treatment that advances through child items on an interval, animating each change with a vertical slide and fade.",
      "apiSections": [
        {
          "id": "text-loop",
          "title": "TextLoop",
          "summary": "Cycling text treatment that advances through child items on an interval, animating each change with a vertical slide and fade.",
          "notes": [
            "The component renders nothing when no children are provided.",
            "AnimatePresence uses popLayout mode so outgoing and incoming items can overlap during the transition."
          ],
          "fields": [
            {
              "name": "children",
              "type": "React.ReactNode[]",
              "defaultValue": "",
              "required": true,
              "description": "The items to cycle through. Pass each entry as a separate child element so you can control typography and markup per item."
            },
            {
              "name": "className",
              "type": "string",
              "defaultValue": "",
              "required": false,
              "description": "Merged onto the root wrapper for local typography, spacing, or alignment classes."
            },
            {
              "name": "interval",
              "type": "number",
              "defaultValue": "1",
              "required": false,
              "description": "Seconds each item stays visible before advancing to the next child."
            },
            {
              "name": "transition",
              "type": "Transition",
              "defaultValue": "{ duration: 0.3 }",
              "required": false,
              "description": "Motion transition applied to each enter and exit animation between items."
            },
            {
              "name": "variants",
              "type": "Variants",
              "defaultValue": "",
              "required": false,
              "description": "Optional Motion variants that override the default vertical slide and fade behavior."
            },
            {
              "name": "onIndexChange",
              "type": "(index: number) => void",
              "defaultValue": "",
              "required": false,
              "description": "Called whenever the active item changes, with the zero-based index of the newly visible child."
            }
          ]
        },
        {
          "id": "text-loop-motion",
          "title": "Loop and transition behavior",
          "summary": "An internal interval increments a loop key on each tick, and the active child is resolved with modulo arithmetic so the sequence repeats indefinitely.",
          "notes": [
            "Default motion variants slide the incoming item up from 100% while the outgoing item exits toward -100%.",
            "The exported useLoop hook exposes the same interval-driven key increment if you want to build a custom rotator around the same timing primitive."
          ],
          "fields": []
        }
      ],
      "dependencies": [
        "motion"
      ]
    }
  ],
  "generatedAt": "2026-09-14T23:34:37.019Z"
}