{
  "name": "freecodecamp-uikit",
  "homepage": "https://design.freecodecamp.org",
  "version": "dc7794b (2026-08-17)",
  "llms": "https://design.freecodecamp.org/llms.txt",
  "starter": "https://design.freecodecamp.org/registry/starter.md",
  "icons": {
    "names": [
      "arrow-down",
      "arrow-left",
      "arrow-right",
      "arrow-up",
      "arrow-up-down",
      "arrow-up-right",
      "bell",
      "book",
      "bookmark",
      "calendar",
      "check",
      "chevron-down",
      "chevron-left",
      "chevron-right",
      "chevron-up",
      "circle-alert",
      "circle-check",
      "circle-x",
      "clock",
      "code",
      "copy",
      "download",
      "equal",
      "external-link",
      "eye",
      "eye-off",
      "file",
      "file-text",
      "filter",
      "folder",
      "globe",
      "grid",
      "heart",
      "home",
      "image",
      "info",
      "key",
      "loader",
      "lock",
      "log-out",
      "mail",
      "menu",
      "minus",
      "pause",
      "pencil",
      "play",
      "plus",
      "search",
      "settings",
      "share",
      "star",
      "terminal",
      "trash",
      "triangle-alert",
      "unlock",
      "upload",
      "user",
      "users",
      "video",
      "x"
    ],
    "svgUrlTemplate": "https://design.freecodecamp.org/registry/icons/svg/{name}.svg"
  },
  "items": [
    {
      "name": "alert",
      "kind": "component",
      "title": "Alert",
      "category": "data-display",
      "description": "An in-page live region that surfaces info, success, warning, or danger messages with the correct ARIA role out of the box.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Alert.tsx",
          "target": "src/ui/alert/Alert.tsx",
          "url": "https://design.freecodecamp.org/registry/alert/Alert.tsx"
        },
        {
          "name": "alert.css",
          "target": "src/ui/alert/alert.css",
          "url": "https://design.freecodecamp.org/registry/alert/alert.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/alert.md"
    },
    {
      "name": "auth-layout",
      "kind": "component",
      "title": "AuthLayout",
      "category": "layout",
      "description": "Centered card shell for auth flows - login, signup, forgot-password, magic-link. Optional brand lockup above the card, optional footer below, optional background pattern for a little texture.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "AuthLayout.tsx",
          "target": "src/ui/auth-layout/AuthLayout.tsx",
          "url": "https://design.freecodecamp.org/registry/auth-layout/AuthLayout.tsx"
        },
        {
          "name": "auth-layout.css",
          "target": "src/ui/auth-layout/auth-layout.css",
          "url": "https://design.freecodecamp.org/registry/auth-layout/auth-layout.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/auth-layout.md"
    },
    {
      "name": "avatar",
      "kind": "component",
      "title": "Avatar",
      "category": "primitive",
      "description": "Square user badge. Image by default, two-letter initials fallback, optional status dot. Three sizes locked to the type scale.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Avatar.tsx",
          "target": "src/ui/avatar/Avatar.tsx",
          "url": "https://design.freecodecamp.org/registry/avatar/Avatar.tsx"
        },
        {
          "name": "avatar.css",
          "target": "src/ui/avatar/avatar.css",
          "url": "https://design.freecodecamp.org/registry/avatar/avatar.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/avatar.md"
    },
    {
      "name": "badge",
      "kind": "component",
      "title": "Badge",
      "category": "primitive",
      "description": "A compact coloured tag for statuses, counts, and metadata. Polymorphic via `variant`, semantic-free by default.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Badge.tsx",
          "target": "src/ui/badge/Badge.tsx",
          "url": "https://design.freecodecamp.org/registry/badge/Badge.tsx"
        },
        {
          "name": "badge.css",
          "target": "src/ui/badge/badge.css",
          "url": "https://design.freecodecamp.org/registry/badge/badge.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/badge.md"
    },
    {
      "name": "breadcrumb",
      "kind": "component",
      "title": "Breadcrumb",
      "category": "navigation",
      "description": "Hierarchical trail of links with the current page marked via aria-current. Compound API plus a CSS pseudo-element separator so the visible slash never reaches the accessibility tree.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Breadcrumb.tsx",
          "target": "src/ui/breadcrumb/Breadcrumb.tsx",
          "url": "https://design.freecodecamp.org/registry/breadcrumb/Breadcrumb.tsx"
        },
        {
          "name": "breadcrumb.css",
          "target": "src/ui/breadcrumb/breadcrumb.css",
          "url": "https://design.freecodecamp.org/registry/breadcrumb/breadcrumb.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/breadcrumb.md"
    },
    {
      "name": "button",
      "kind": "component",
      "title": "Button",
      "category": "primitive",
      "description": "The primary action primitive. Gold CTA by default, three sizes, six variants, polymorphic via a single `variant` prop.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Button.tsx",
          "target": "src/ui/button/Button.tsx",
          "url": "https://design.freecodecamp.org/registry/button/Button.tsx"
        },
        {
          "name": "button.css",
          "target": "src/ui/button/button.css",
          "url": "https://design.freecodecamp.org/registry/button/button.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/button.md"
    },
    {
      "name": "callout",
      "kind": "component",
      "title": "Callout",
      "category": "data-display",
      "description": "A flagged prose block for tips, notes, warnings, and cautions - the Markdown admonition we reach for inside long-form docs.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Callout.tsx",
          "target": "src/ui/callout/Callout.tsx",
          "url": "https://design.freecodecamp.org/registry/callout/Callout.tsx"
        },
        {
          "name": "callout.css",
          "target": "src/ui/callout/callout.css",
          "url": "https://design.freecodecamp.org/registry/callout/callout.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/callout.md"
    },
    {
      "name": "card",
      "kind": "component",
      "title": "Card",
      "category": "data-display",
      "description": "A compound surface with optional header, body, and footer slots. Reach for Card when a block of content needs its own visual frame.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Card.tsx",
          "target": "src/ui/card/Card.tsx",
          "url": "https://design.freecodecamp.org/registry/card/Card.tsx"
        },
        {
          "name": "card.css",
          "target": "src/ui/card/card.css",
          "url": "https://design.freecodecamp.org/registry/card/card.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/card.md"
    },
    {
      "name": "checkbox",
      "kind": "component",
      "title": "Checkbox",
      "category": "form",
      "description": "A native checkbox with an optional paired label. Owns the `type='checkbox'` attribute so consumers never have to set it.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Checkbox.tsx",
          "target": "src/ui/checkbox/Checkbox.tsx",
          "url": "https://design.freecodecamp.org/registry/checkbox/Checkbox.tsx"
        },
        {
          "name": "checkbox.css",
          "target": "src/ui/checkbox/checkbox.css",
          "url": "https://design.freecodecamp.org/registry/checkbox/checkbox.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/checkbox.md"
    },
    {
      "name": "close-button",
      "kind": "component",
      "title": "Close button",
      "category": "primitive",
      "description": "The small × affordance for dismissing panels, toasts, and modals. Defaults to `aria-label='Close'` so every dismiss target stays labelled.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "CloseButton.tsx",
          "target": "src/ui/close-button/CloseButton.tsx",
          "url": "https://design.freecodecamp.org/registry/close-button/CloseButton.tsx"
        },
        {
          "name": "close-button.css",
          "target": "src/ui/close-button/close-button.css",
          "url": "https://design.freecodecamp.org/registry/close-button/close-button.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/close-button.md"
    },
    {
      "name": "combobox",
      "kind": "component",
      "title": "Combobox",
      "category": "navigation",
      "description": "Text input paired with a filterable option list - the marquee Wave 2 component. Sync filter, custom item renderers, and a data-uikit-combobox adapter that boots the vanilla runtime for server-rendered pages.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Combobox.tsx",
          "target": "src/ui/combobox/Combobox.tsx",
          "url": "https://design.freecodecamp.org/registry/combobox/Combobox.tsx"
        },
        {
          "name": "combobox.css",
          "target": "src/ui/combobox/combobox.css",
          "url": "https://design.freecodecamp.org/registry/combobox/combobox.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/combobox.md"
    },
    {
      "name": "command-palette",
      "kind": "component",
      "title": "CommandPalette",
      "category": "overlay",
      "description": "Keyboard-driven launcher. Search input + grouped filterable list + shortcut badges. Arrow keys navigate, Enter selects, Escape closes.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "CommandPalette.tsx",
          "target": "src/ui/command-palette/CommandPalette.tsx",
          "url": "https://design.freecodecamp.org/registry/command-palette/CommandPalette.tsx"
        },
        {
          "name": "command-palette.css",
          "target": "src/ui/command-palette/command-palette.css",
          "url": "https://design.freecodecamp.org/registry/command-palette/command-palette.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/command-palette.md"
    },
    {
      "name": "data-table",
      "kind": "component",
      "title": "DataTable",
      "category": "data-display",
      "description": "Structured tabular display with sortable columns, row selection, loading skeletons, and an empty-state slot. Caller owns sort and selection state; columns accept string-key or function accessors.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "DataTable.tsx",
          "target": "src/ui/data-table/DataTable.tsx",
          "url": "https://design.freecodecamp.org/registry/data-table/DataTable.tsx"
        },
        {
          "name": "data-table.css",
          "target": "src/ui/data-table/data-table.css",
          "url": "https://design.freecodecamp.org/registry/data-table/data-table.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/data-table.md"
    },
    {
      "name": "description-list",
      "kind": "component",
      "title": "DescriptionList",
      "category": "data-display",
      "description": "Semantic dl/dt/dd pair with mono terminal terms and Lato body details. Two layouts - vertical grid for metadata panels, inline for compact key/value strips.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "DescriptionList.tsx",
          "target": "src/ui/description-list/DescriptionList.tsx",
          "url": "https://design.freecodecamp.org/registry/description-list/DescriptionList.tsx"
        },
        {
          "name": "description-list.css",
          "target": "src/ui/description-list/description-list.css",
          "url": "https://design.freecodecamp.org/registry/description-list/description-list.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/description-list.md"
    },
    {
      "name": "divider",
      "kind": "component",
      "title": "Divider",
      "category": "primitive",
      "description": "Horizontal or vertical rule. Solid by default, dashed for the terminal-native version. Renders `<hr role=\"separator\">`.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Divider.tsx",
          "target": "src/ui/divider/Divider.tsx",
          "url": "https://design.freecodecamp.org/registry/divider/Divider.tsx"
        },
        {
          "name": "divider.css",
          "target": "src/ui/divider/divider.css",
          "url": "https://design.freecodecamp.org/registry/divider/divider.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/divider.md"
    },
    {
      "name": "dropdown",
      "kind": "component",
      "title": "Dropdown",
      "category": "overlay",
      "description": "A menu button pattern with keyboard navigation and outside-click dismiss. Pair `<Dropdown.Toggle>` with `<Dropdown.Menu>` / `<Dropdown.Item>`.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Dropdown.tsx",
          "target": "src/ui/dropdown/Dropdown.tsx",
          "url": "https://design.freecodecamp.org/registry/dropdown/Dropdown.tsx"
        },
        {
          "name": "dropdown.css",
          "target": "src/ui/dropdown/dropdown.css",
          "url": "https://design.freecodecamp.org/registry/dropdown/dropdown.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/dropdown.md"
    },
    {
      "name": "empty-state",
      "kind": "component",
      "title": "EmptyState",
      "category": "data-display",
      "description": "Centered placeholder for empty lists, empty search results, and zero-state dashboards. Optional icon, title, description, and action slots.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "EmptyState.tsx",
          "target": "src/ui/empty-state/EmptyState.tsx",
          "url": "https://design.freecodecamp.org/registry/empty-state/EmptyState.tsx"
        },
        {
          "name": "empty-state.css",
          "target": "src/ui/empty-state/empty-state.css",
          "url": "https://design.freecodecamp.org/registry/empty-state/empty-state.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/empty-state.md"
    },
    {
      "name": "fieldset",
      "kind": "component",
      "title": "Fieldset",
      "category": "form",
      "description": "Semantic field grouping with legend. Native fieldset + legend styled to the terminal shell - the right container for any cluster of related form controls.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Fieldset.tsx",
          "target": "src/ui/fieldset/Fieldset.tsx",
          "url": "https://design.freecodecamp.org/registry/fieldset/Fieldset.tsx"
        },
        {
          "name": "fieldset.css",
          "target": "src/ui/fieldset/fieldset.css",
          "url": "https://design.freecodecamp.org/registry/fieldset/fieldset.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/fieldset.md"
    },
    {
      "name": "form-control",
      "kind": "component",
      "title": "Form control",
      "category": "form",
      "description": "A label-plus-control compound that threads `id` / `htmlFor` / `aria-describedby` across its slots. Wraps Input, Textarea, or a custom field.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "FormControl.tsx",
          "target": "src/ui/form-control/FormControl.tsx",
          "url": "https://design.freecodecamp.org/registry/form-control/FormControl.tsx"
        },
        {
          "name": "form-control.css",
          "target": "src/ui/form-control/form-control.css",
          "url": "https://design.freecodecamp.org/registry/form-control/form-control.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/form-control.md"
    },
    {
      "name": "form-group",
      "kind": "component",
      "title": "Form group",
      "category": "form",
      "description": "A vertical cluster for a single control plus its label, help, and error text. Pairs with `<FormControl>` and `<HelpBlock>`.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "FormGroup.tsx",
          "target": "src/ui/form-group/FormGroup.tsx",
          "url": "https://design.freecodecamp.org/registry/form-group/FormGroup.tsx"
        },
        {
          "name": "form-group.css",
          "target": "src/ui/form-group/form-group.css",
          "url": "https://design.freecodecamp.org/registry/form-group/form-group.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/form-group.md"
    },
    {
      "name": "form-stepper",
      "kind": "component",
      "title": "FormStepper",
      "category": "form",
      "description": "Numbered multi-step wizard. Progress header + render-prop body. Caller owns the current step; completed steps are backward-navigable, upcoming steps are gated.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "FormStepper.tsx",
          "target": "src/ui/form-stepper/FormStepper.tsx",
          "url": "https://design.freecodecamp.org/registry/form-stepper/FormStepper.tsx"
        },
        {
          "name": "form-stepper.css",
          "target": "src/ui/form-stepper/form-stepper.css",
          "url": "https://design.freecodecamp.org/registry/form-stepper/form-stepper.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/form-stepper.md"
    },
    {
      "name": "heading",
      "kind": "component",
      "title": "Heading",
      "category": "primitive",
      "description": "Section and page headings. Level and visual size decoupled so you can honour document outline without sacrificing composition.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Heading.tsx",
          "target": "src/ui/heading/Heading.tsx",
          "url": "https://design.freecodecamp.org/registry/heading/Heading.tsx"
        },
        {
          "name": "heading.css",
          "target": "src/ui/heading/heading.css",
          "url": "https://design.freecodecamp.org/registry/heading/heading.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/heading.md"
    },
    {
      "name": "help-block",
      "kind": "component",
      "title": "Help block",
      "category": "form",
      "description": "The help / success / error microcopy line that sits beneath a form control. Three tones, one primitive.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "HelpBlock.tsx",
          "target": "src/ui/help-block/HelpBlock.tsx",
          "url": "https://design.freecodecamp.org/registry/help-block/HelpBlock.tsx"
        },
        {
          "name": "help-block.css",
          "target": "src/ui/help-block/help-block.css",
          "url": "https://design.freecodecamp.org/registry/help-block/help-block.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/help-block.md"
    },
    {
      "name": "hotspots",
      "kind": "component",
      "title": "Hotspots",
      "category": "game",
      "description": "Clickable regions overlaid on a background image, diagram, or SVG. Quiz mode compares the pick to a target and surfaces feedback plus a hint after repeated misses.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Hotspots.tsx",
          "target": "src/ui/hotspots/Hotspots.tsx",
          "url": "https://design.freecodecamp.org/registry/hotspots/Hotspots.tsx"
        },
        {
          "name": "hotspots.css",
          "target": "src/ui/hotspots/hotspots.css",
          "url": "https://design.freecodecamp.org/registry/hotspots/hotspots.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/hotspots.md"
    },
    {
      "name": "image",
      "kind": "component",
      "title": "Image",
      "category": "primitive",
      "description": "A responsive `<img>` primitive with a required `alt` contract. Pair with a `<figure>` + `<figcaption>` compound when the image needs a caption.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Image.tsx",
          "target": "src/ui/image/Image.tsx",
          "url": "https://design.freecodecamp.org/registry/image/Image.tsx"
        },
        {
          "name": "image.css",
          "target": "src/ui/image/image.css",
          "url": "https://design.freecodecamp.org/registry/image/image.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/image.md"
    },
    {
      "name": "input",
      "kind": "component",
      "title": "Input",
      "category": "form",
      "description": "The baseline single-line text control. Forwards every native input prop, adds an `invalid` flag that syncs `aria-invalid`.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Input.tsx",
          "target": "src/ui/input/Input.tsx",
          "url": "https://design.freecodecamp.org/registry/input/Input.tsx"
        },
        {
          "name": "input.css",
          "target": "src/ui/input/input.css",
          "url": "https://design.freecodecamp.org/registry/input/input.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/input.md"
    },
    {
      "name": "link",
      "kind": "component",
      "title": "Link",
      "category": "primitive",
      "description": "The styled anchor primitive. Wraps `<a>` with the UIKit hover/focus ring and a `block` flag for full-width link rows.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Link.tsx",
          "target": "src/ui/link/Link.tsx",
          "url": "https://design.freecodecamp.org/registry/link/Link.tsx"
        },
        {
          "name": "link.css",
          "target": "src/ui/link/link.css",
          "url": "https://design.freecodecamp.org/registry/link/link.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/link.md"
    },
    {
      "name": "listbox",
      "kind": "component",
      "title": "Listbox",
      "category": "navigation",
      "description": "Scrollable single- or multi-select list. Ships a React layer for controlled state and a data-uikit-listbox adapter with full keyboard navigation and type-ahead for the vanilla runtime.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Listbox.tsx",
          "target": "src/ui/listbox/Listbox.tsx",
          "url": "https://design.freecodecamp.org/registry/listbox/Listbox.tsx"
        },
        {
          "name": "listbox.css",
          "target": "src/ui/listbox/listbox.css",
          "url": "https://design.freecodecamp.org/registry/listbox/listbox.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/listbox.md"
    },
    {
      "name": "modal",
      "kind": "component",
      "title": "Modal",
      "category": "overlay",
      "description": "An accessible dialog with backdrop, focus trap, and escape-to-close. Controlled component - you own the `open` state.",
      "npmDependencies": [
        "react@>=18 <20",
        "@ark-ui/react@^5.0.0"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Modal.tsx",
          "target": "src/ui/modal/Modal.tsx",
          "url": "https://design.freecodecamp.org/registry/modal/Modal.tsx"
        },
        {
          "name": "modal.css",
          "target": "src/ui/modal/modal.css",
          "url": "https://design.freecodecamp.org/registry/modal/modal.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/modal.md"
    },
    {
      "name": "navbar",
      "kind": "component",
      "title": "Navbar",
      "category": "navigation",
      "description": "Top-of-page chrome with start, center, and end slots. Responsive collapse at the md breakpoint (768 px) so the center band wraps below the start and end rows on narrow screens.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Navbar.tsx",
          "target": "src/ui/navbar/Navbar.tsx",
          "url": "https://design.freecodecamp.org/registry/navbar/Navbar.tsx"
        },
        {
          "name": "navbar.css",
          "target": "src/ui/navbar/navbar.css",
          "url": "https://design.freecodecamp.org/registry/navbar/navbar.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/navbar.md"
    },
    {
      "name": "pagination",
      "kind": "component",
      "title": "Pagination",
      "category": "navigation",
      "description": "Page navigator for tabular and paged content. Ships a React layer for app code and a data-uikit-pagination adapter for the vanilla runtime - both speak the same DOM contract so the layers stay swappable.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Pagination.tsx",
          "target": "src/ui/pagination/Pagination.tsx",
          "url": "https://design.freecodecamp.org/registry/pagination/Pagination.tsx"
        },
        {
          "name": "pagination.css",
          "target": "src/ui/pagination/pagination.css",
          "url": "https://design.freecodecamp.org/registry/pagination/pagination.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/pagination.md"
    },
    {
      "name": "panel",
      "kind": "component",
      "title": "Panel",
      "category": "data-display",
      "description": "A lightweight surface for grouping related controls or metadata - the same BEM surface Card uses, but without header/footer ceremony.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Panel.tsx",
          "target": "src/ui/panel/Panel.tsx",
          "url": "https://design.freecodecamp.org/registry/panel/Panel.tsx"
        },
        {
          "name": "panel.css",
          "target": "src/ui/panel/panel.css",
          "url": "https://design.freecodecamp.org/registry/panel/panel.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/panel.md"
    },
    {
      "name": "radio",
      "kind": "component",
      "title": "Radio",
      "category": "form",
      "description": "Native radio input with label wrapper and RadioGroup context for single-choice selection. Pairs with Fieldset for semantic grouping.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Radio.tsx",
          "target": "src/ui/radio/Radio.tsx",
          "url": "https://design.freecodecamp.org/registry/radio/Radio.tsx"
        },
        {
          "name": "radio.css",
          "target": "src/ui/radio/radio.css",
          "url": "https://design.freecodecamp.org/registry/radio/radio.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/radio.md"
    },
    {
      "name": "select",
      "kind": "component",
      "title": "Select",
      "category": "form",
      "description": "Native HTML select restyled to fit the terminal shell. A real <select> - no portal, no popover, no Combobox. Chevron is an inlined Lucide glyph.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Select.tsx",
          "target": "src/ui/select/Select.tsx",
          "url": "https://design.freecodecamp.org/registry/select/Select.tsx"
        },
        {
          "name": "select.css",
          "target": "src/ui/select/select.css",
          "url": "https://design.freecodecamp.org/registry/select/select.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/select.md"
    },
    {
      "name": "sidebar",
      "kind": "component",
      "title": "Sidebar",
      "category": "navigation",
      "description": "Vertical navigation rail with section eyebrows, icon + label items, and active-state highlighting. Compound component - Sidebar + SidebarSection + SidebarItem.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Sidebar.tsx",
          "target": "src/ui/sidebar/Sidebar.tsx",
          "url": "https://design.freecodecamp.org/registry/sidebar/Sidebar.tsx"
        },
        {
          "name": "sidebar.css",
          "target": "src/ui/sidebar/sidebar.css",
          "url": "https://design.freecodecamp.org/registry/sidebar/sidebar.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/sidebar.md"
    },
    {
      "name": "sidebar-layout",
      "kind": "component",
      "title": "SidebarLayout",
      "category": "layout",
      "description": "Page-scale chrome - optional header row on top of a sidebar + main grid. The aside column collapses at the md breakpoint (≤ 768 px) so mobile screens stay single-column.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "SidebarLayout.tsx",
          "target": "src/ui/sidebar-layout/SidebarLayout.tsx",
          "url": "https://design.freecodecamp.org/registry/sidebar-layout/SidebarLayout.tsx"
        },
        {
          "name": "sidebar-layout.css",
          "target": "src/ui/sidebar-layout/sidebar-layout.css",
          "url": "https://design.freecodecamp.org/registry/sidebar-layout/sidebar-layout.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/sidebar-layout.md"
    },
    {
      "name": "skeleton",
      "kind": "component",
      "title": "Skeleton",
      "category": "data-display",
      "description": "Loading placeholder with shimmer. Rect by default, circle for avatars, text for stacked line bars. Renders `<div role=\"status\" aria-busy=\"true\">`.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Skeleton.tsx",
          "target": "src/ui/skeleton/Skeleton.tsx",
          "url": "https://design.freecodecamp.org/registry/skeleton/Skeleton.tsx"
        },
        {
          "name": "skeleton.css",
          "target": "src/ui/skeleton/skeleton.css",
          "url": "https://design.freecodecamp.org/registry/skeleton/skeleton.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/skeleton.md"
    },
    {
      "name": "spacer",
      "kind": "component",
      "title": "Spacer",
      "category": "primitive",
      "description": "Explicit whitespace as a component. Step 0–8 maps onto the token scale, any other number is treated as raw pixels.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Spacer.tsx",
          "target": "src/ui/spacer/Spacer.tsx",
          "url": "https://design.freecodecamp.org/registry/spacer/Spacer.tsx"
        },
        {
          "name": "spacer.css",
          "target": "src/ui/spacer/spacer.css",
          "url": "https://design.freecodecamp.org/registry/spacer/spacer.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/spacer.md"
    },
    {
      "name": "stacked-layout",
      "kind": "component",
      "title": "StackedLayout",
      "category": "layout",
      "description": "Page-scale chrome for top-nav pages - optional header, flex-grow main, optional footer. Use for marketing pages, articles, and any view that doesn't need a persistent side rail.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "StackedLayout.tsx",
          "target": "src/ui/stacked-layout/StackedLayout.tsx",
          "url": "https://design.freecodecamp.org/registry/stacked-layout/StackedLayout.tsx"
        },
        {
          "name": "stacked-layout.css",
          "target": "src/ui/stacked-layout/stacked-layout.css",
          "url": "https://design.freecodecamp.org/registry/stacked-layout/stacked-layout.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/stacked-layout.md"
    },
    {
      "name": "switch",
      "kind": "component",
      "title": "Switch",
      "category": "form",
      "description": "A toggle for binary settings that take effect immediately. Behaves like a checkbox under the hood, styled as a pill.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Switch.tsx",
          "target": "src/ui/switch/Switch.tsx",
          "url": "https://design.freecodecamp.org/registry/switch/Switch.tsx"
        },
        {
          "name": "switch.css",
          "target": "src/ui/switch/switch.css",
          "url": "https://design.freecodecamp.org/registry/switch/switch.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/switch.md"
    },
    {
      "name": "table",
      "kind": "component",
      "title": "Table",
      "category": "data-display",
      "description": "The semantic table primitive. Pair with `<DataTable>` when sortable columns + zebra striping are needed; reach for raw `<Table>` for simple tabular data.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Table.tsx",
          "target": "src/ui/table/Table.tsx",
          "url": "https://design.freecodecamp.org/registry/table/Table.tsx"
        },
        {
          "name": "table.css",
          "target": "src/ui/table/table.css",
          "url": "https://design.freecodecamp.org/registry/table/table.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/table.md"
    },
    {
      "name": "tabs",
      "kind": "component",
      "title": "Tabs",
      "category": "navigation",
      "description": "A keyboard-accessible tab panel with `<Tab eventKey>` children and an optional controlled `activeKey`. Arrow keys move focus; Enter activates.",
      "npmDependencies": [
        "react@>=18 <20",
        "@ark-ui/react@^5.0.0"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Tabs.tsx",
          "target": "src/ui/tabs/Tabs.tsx",
          "url": "https://design.freecodecamp.org/registry/tabs/Tabs.tsx"
        },
        {
          "name": "tabs.css",
          "target": "src/ui/tabs/tabs.css",
          "url": "https://design.freecodecamp.org/registry/tabs/tabs.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/tabs.md"
    },
    {
      "name": "text",
      "kind": "component",
      "title": "Text",
      "category": "primitive",
      "description": "Body-copy primitive. Polymorphic element, token-driven size scale, Lato by default, terminal semantics for tone.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Text.tsx",
          "target": "src/ui/text/Text.tsx",
          "url": "https://design.freecodecamp.org/registry/text/Text.tsx"
        },
        {
          "name": "text.css",
          "target": "src/ui/text/text.css",
          "url": "https://design.freecodecamp.org/registry/text/text.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/text.md"
    },
    {
      "name": "textarea",
      "kind": "component",
      "title": "Textarea",
      "category": "form",
      "description": "Native textarea with terminal styling, an opt-in monospace variant, and an auto-resize mode that grows the control with its content.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Textarea.tsx",
          "target": "src/ui/textarea/Textarea.tsx",
          "url": "https://design.freecodecamp.org/registry/textarea/Textarea.tsx"
        },
        {
          "name": "textarea.css",
          "target": "src/ui/textarea/textarea.css",
          "url": "https://design.freecodecamp.org/registry/textarea/textarea.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/textarea.md"
    },
    {
      "name": "tile-matcher",
      "kind": "component",
      "title": "Tile matcher",
      "category": "game",
      "description": "Data-driven memory / matching game for interactive curricula. Builds a deck from pairs, flips tiles to reveal, and fires callbacks on match and completion.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "TileMatcher.tsx",
          "target": "src/ui/tile-matcher/TileMatcher.tsx",
          "url": "https://design.freecodecamp.org/registry/tile-matcher/TileMatcher.tsx"
        },
        {
          "name": "tile-matcher.css",
          "target": "src/ui/tile-matcher/tile-matcher.css",
          "url": "https://design.freecodecamp.org/registry/tile-matcher/tile-matcher.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/tile-matcher.md"
    },
    {
      "name": "toast",
      "kind": "component",
      "title": "Toast",
      "category": "overlay",
      "description": "Transient notifications. `info`, `success`, `warning`, and `danger` variants. Shares a single <Toaster /> provider per app and fires via `toaster.create(...)`.",
      "npmDependencies": [
        "react@>=18 <20",
        "@ark-ui/react@^5.0.0"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Toast.tsx",
          "target": "src/ui/toast/Toast.tsx",
          "url": "https://design.freecodecamp.org/registry/toast/Toast.tsx"
        },
        {
          "name": "toast.css",
          "target": "src/ui/toast/toast.css",
          "url": "https://design.freecodecamp.org/registry/toast/toast.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/toast.md"
    },
    {
      "name": "toggle-button",
      "kind": "component",
      "title": "Toggle button",
      "category": "form",
      "description": "A button that remembers its pressed state. Reach for it when the same control must flip between \"on\" and \"off\" without leaving the row.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "ToggleButton.tsx",
          "target": "src/ui/toggle-button/ToggleButton.tsx",
          "url": "https://design.freecodecamp.org/registry/toggle-button/ToggleButton.tsx"
        },
        {
          "name": "toggle-button.css",
          "target": "src/ui/toggle-button/toggle-button.css",
          "url": "https://design.freecodecamp.org/registry/toggle-button/toggle-button.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/toggle-button.md"
    },
    {
      "name": "tooltip",
      "kind": "component",
      "title": "Tooltip",
      "category": "overlay",
      "description": "A keyboard-friendly hint that surfaces on hover or focus. Renders as a CSS-only bubble - no portal, no JS, no third-party runtime.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "Tooltip.tsx",
          "target": "src/ui/tooltip/Tooltip.tsx",
          "url": "https://design.freecodecamp.org/registry/tooltip/Tooltip.tsx"
        },
        {
          "name": "tooltip.css",
          "target": "src/ui/tooltip/tooltip.css",
          "url": "https://design.freecodecamp.org/registry/tooltip/tooltip.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/components/tooltip.md"
    },
    {
      "name": "theme",
      "kind": "theme",
      "title": "Theme",
      "description": "Design tokens (colors, type, spacing, motion) + shared base helpers. Every component depends on this. Dark by default; add .light-palette to opt into light mode.",
      "npmDependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "name": "tokens.css",
          "target": "src/ui/theme/tokens.css",
          "url": "https://design.freecodecamp.org/registry/theme/tokens.css"
        },
        {
          "name": "base.css",
          "target": "src/ui/theme/base.css",
          "url": "https://design.freecodecamp.org/registry/theme/base.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/theme.md"
    },
    {
      "name": "icons",
      "kind": "icons",
      "title": "Icons",
      "description": "Curated Lucide subset: Icon React component + icon map. Copy Icon.tsx and a subset of icons.ts, or grab raw SVGs per icon.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [],
      "files": [
        {
          "name": "react.tsx",
          "target": "src/ui/icons/Icon.tsx",
          "url": "https://design.freecodecamp.org/registry/icons/react.tsx"
        },
        {
          "name": "icons.ts",
          "target": "src/ui/icons/icons.ts",
          "url": "https://design.freecodecamp.org/registry/icons/icons.ts"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/icons.md"
    },
    {
      "name": "vanilla",
      "kind": "vanilla",
      "title": "Vanilla JS runtime",
      "description": "Framework-free behaviours bound via data-uikit-* attributes (dialog, combobox, listbox, pagination, toast), powered by Zag state machines. Alternative to the React components for plain HTML.",
      "npmDependencies": [
        "@zag-js/combobox@^1.43.0",
        "@zag-js/dialog@^1.43.0",
        "@zag-js/listbox@^1.43.0",
        "@zag-js/pagination@^1.43.0",
        "@zag-js/tabs@^1.43.0"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "core.ts",
          "target": "src/ui/vanilla/core.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/core.ts"
        },
        {
          "name": "index.ts",
          "target": "src/ui/vanilla/index.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/index.ts"
        },
        {
          "name": "combobox.ts",
          "target": "src/ui/vanilla/adapters/combobox.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/combobox.ts"
        },
        {
          "name": "dialog.ts",
          "target": "src/ui/vanilla/adapters/dialog.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/dialog.ts"
        },
        {
          "name": "listbox.ts",
          "target": "src/ui/vanilla/adapters/listbox.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/listbox.ts"
        },
        {
          "name": "pagination.ts",
          "target": "src/ui/vanilla/adapters/pagination.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/pagination.ts"
        },
        {
          "name": "toast.ts",
          "target": "src/ui/vanilla/adapters/toast.ts",
          "url": "https://design.freecodecamp.org/registry/vanilla/toast.ts"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/vanilla.md"
    },
    {
      "name": "tailwind",
      "kind": "tailwind",
      "title": "Tailwind preset",
      "description": "Optional Tailwind (>=4) preset + plugin mirroring the UIKit tokens as utilities. Components do not require Tailwind.",
      "npmDependencies": [
        "tailwindcss@>=4.0.0"
      ],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "preset.ts",
          "target": "src/ui/tailwind/preset.ts",
          "url": "https://design.freecodecamp.org/registry/tailwind/preset.ts"
        },
        {
          "name": "plugin.ts",
          "target": "src/ui/tailwind/plugin.ts",
          "url": "https://design.freecodecamp.org/registry/tailwind/plugin.ts"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/tailwind.md"
    },
    {
      "name": "html-progress",
      "kind": "html",
      "title": "Progress (HTML-only)",
      "description": "BEM progress bar pattern with no React counterpart. Copy the CSS and use the .progress / .progress__bar classes directly.",
      "npmDependencies": [],
      "registryDependencies": [
        "theme"
      ],
      "files": [
        {
          "name": "progress.css",
          "target": "src/ui/html-progress/progress.css",
          "url": "https://design.freecodecamp.org/registry/html-progress/progress.css"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/html-progress.md"
    },
    {
      "name": "use-async-combobox-items",
      "kind": "lib",
      "title": "useAsyncComboboxItems",
      "description": "Debounced + cancellable async item loading for the Combobox component.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [
        "combobox"
      ],
      "files": [
        {
          "name": "useAsyncComboboxItems.ts",
          "target": "src/ui/use-async-combobox-items/useAsyncComboboxItems.ts",
          "url": "https://design.freecodecamp.org/registry/use-async-combobox-items/useAsyncComboboxItems.ts"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/use-async-combobox-items.md"
    },
    {
      "name": "hotspot-shapes",
      "kind": "lib",
      "title": "HotspotShapes",
      "description": "Shape helpers (rect, circle, polygon) for the Hotspots game component.",
      "npmDependencies": [
        "react@>=18 <20"
      ],
      "registryDependencies": [],
      "files": [
        {
          "name": "HotspotShapes.tsx",
          "target": "src/ui/hotspot-shapes/HotspotShapes.tsx",
          "url": "https://design.freecodecamp.org/registry/hotspot-shapes/HotspotShapes.tsx"
        }
      ],
      "docs": "https://design.freecodecamp.org/registry/hotspot-shapes.md"
    }
  ]
}