{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "fibo",
  "homepage": "https://fibo.toribryan.com",
  "items": [
    {
      "name": "avatar",
      "type": "registry:ui",
      "title": "Avatar",
      "description": "A person's photo, or their initials when there's no photo.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-avatar--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-avatar--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/avatar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "badge",
      "type": "registry:ui",
      "title": "Badge",
      "description": "A short label for status, category or count.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-badge--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-badge--docs"
      },
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/badge.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-subtle": "var(--destructive-subtle)",
          "color-success": "var(--success)",
          "color-success-subtle": "var(--success-subtle)",
          "color-warning": "var(--warning)",
          "color-warning-subtle": "var(--warning-subtle)",
          "color-info": "var(--info)",
          "color-info-subtle": "var(--info-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "background-color-destructive-subtle": "var(--destructive-subtle)",
          "text-color-success": "var(--success-text)",
          "background-color-success-subtle": "var(--success-subtle)",
          "text-color-warning": "var(--warning-text)",
          "background-color-warning-subtle": "var(--warning-subtle)",
          "text-color-info": "var(--info-text)",
          "background-color-info-subtle": "var(--info-subtle)"
        },
        "light": {
          "destructive-subtle": "color-mix(in oklch, var(--color-red-700) 8%, transparent)",
          "success": "var(--color-green-700)",
          "success-subtle": "color-mix(in oklch, var(--color-green-700) 6%, transparent)",
          "warning": "var(--color-amber-700)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-700) 6%, transparent)",
          "info": "var(--color-blue-700)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-700) 6%, transparent)",
          "destructive-text": "var(--destructive)",
          "success-text": "var(--success)",
          "warning-text": "var(--warning)",
          "info-text": "var(--info)"
        },
        "dark": {
          "destructive-subtle": "color-mix(in oklch, var(--color-red-400) 20%, transparent)",
          "success": "var(--color-green-400)",
          "success-subtle": "color-mix(in oklch, var(--color-green-400) 20%, transparent)",
          "warning": "var(--color-amber-400)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-400) 20%, transparent)",
          "info": "var(--color-blue-400)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-400) 20%, transparent)",
          "destructive-text": "var(--destructive)",
          "success-text": "var(--success)",
          "warning-text": "var(--warning)",
          "info-text": "var(--info)"
        }
      }
    },
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "Triggers an action or event with a single click.",
      "categories": [
        "base-components",
        "actions"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-actions-button--docs",
      "meta": {
        "tier": "base-components",
        "group": "Actions",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-actions-button--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/button.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-primary-hover": "var(--primary-hover)",
          "color-secondary-hover": "var(--secondary-hover)",
          "color-destructive-subtle": "var(--destructive-subtle)",
          "color-destructive-subtle-hover": "var(--destructive-subtle-hover)",
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-input-subtle-hover": "var(--input-subtle-hover)",
          "color-ring-subtle": "var(--ring-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "background-color-destructive-subtle": "var(--destructive-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "primary-hover": "color-mix(in oklch, var(--color-neutral-900) 80%, transparent)",
          "secondary-hover": "var(--color-neutral-200)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-700) 8%, transparent)",
          "destructive-subtle-hover": "color-mix(in oklch, var(--color-red-700) 16%, transparent)",
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "input-subtle-hover": "color-mix(in oklch, var(--color-neutral-200) 50%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "primary-hover": "color-mix(in oklch, var(--color-neutral-50) 80%, transparent)",
          "secondary-hover": "var(--color-neutral-700)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-400) 20%, transparent)",
          "destructive-subtle-hover": "color-mix(in oklch, var(--color-red-400) 30%, transparent)",
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "input-subtle-hover": "oklch(1 0 0 / 10%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "chapter-scrubber",
      "type": "registry:ui",
      "title": "Chapter scrubber",
      "description": "A rail of marks that swell under the pointer like the Dock, previewing the chapter at the crest.",
      "categories": [
        "special-components",
        "navigation"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-chapter-scrubber--docs",
      "meta": {
        "tier": "special-components",
        "group": "Navigation",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-chapter-scrubber--docs"
      },
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/chapter-scrubber.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "chat-composer",
      "type": "registry:ui",
      "title": "Chat composer",
      "description": "A message box built from parts around one draft, so each chat surface composes its own.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-chat-composer--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-chat-composer--docs",
        "status": "new"
      },
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "https://fibo.toribryan.com/r/tooltip.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/chat-composer.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "checkbox",
      "type": "registry:ui",
      "title": "Checkbox",
      "description": "Turns a single option on or off, or picks many from a list.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-checkbox--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-checkbox--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/checkbox.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "command-menu",
      "type": "registry:ui",
      "title": "Command menu",
      "description": "A Cmd+K palette with nested pages, recent commands, ranked search and a preview pane.",
      "categories": [
        "special-components",
        "navigation"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-command-menu--docs",
      "meta": {
        "tier": "special-components",
        "group": "Navigation",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-command-menu--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "https://fibo.toribryan.com/r/kbd.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/command-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-backdrop": "var(--backdrop)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "backdrop": "color-mix(in oklch, var(--color-neutral-950) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "backdrop": "color-mix(in oklch, var(--color-black) 60%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "data-table",
      "type": "registry:ui",
      "title": "Data table",
      "description": "A table for lists people work through: selection, cell types, locked rows and pinned columns.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-data-table--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-data-table--docs"
      },
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/avatar.json",
        "https://fibo.toribryan.com/r/button.json",
        "https://fibo.toribryan.com/r/checkbox.json",
        "https://fibo.toribryan.com/r/menu.json",
        "https://fibo.toribryan.com/r/table.json",
        "https://fibo.toribryan.com/r/tooltip.json",
        "https://fibo.toribryan.com/r/sheet.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/data-table.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "filter-menu",
      "type": "registry:ui",
      "title": "Filter menu",
      "description": "A filter menu of fields and values that turns into a search as you type.",
      "categories": [
        "special-components",
        "navigation"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-filter-menu--docs",
      "meta": {
        "tier": "special-components",
        "group": "Navigation",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-filter-menu--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/filter-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "floating-nav",
      "type": "registry:ui",
      "title": "Floating nav",
      "description": "A pill of destinations that floats above the bottom of a phone screen and steps aside while you scroll.",
      "categories": [
        "special-components",
        "navigation"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-floating-nav--docs",
      "meta": {
        "tier": "special-components",
        "group": "Navigation",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-floating-nav--docs"
      },
      "dependencies": [
        "class-variance-authority",
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/floating-nav.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-popover-overlay": "var(--popover-overlay)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "popover-overlay": "color-mix(in oklch, var(--color-white) 85%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "popover-overlay": "color-mix(in oklch, var(--color-neutral-900) 85%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "input",
      "type": "registry:ui",
      "title": "Input",
      "description": "A single line of free text.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-input--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-input--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/input.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "integration-visual",
      "type": "registry:ui",
      "title": "Integration visual",
      "description": "A hub and the tools wired into it, with pulses along the routes.",
      "categories": [
        "special-components",
        "diagrams"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-integration-visual--docs",
      "meta": {
        "tier": "special-components",
        "group": "Diagrams",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-integration-visual--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "motion",
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/integration-visual.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "jump-bar",
      "type": "registry:ui",
      "title": "Jump bar",
      "description": "Takes people to unread messages, new messages or the present in a conversation.",
      "categories": [
        "base-components",
        "actions"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-actions-jump-bar--docs",
      "meta": {
        "tier": "base-components",
        "group": "Actions",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-actions-jump-bar--docs"
      },
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/jump-bar.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-primary-hover": "var(--primary-hover)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "primary-hover": "color-mix(in oklch, var(--color-neutral-900) 80%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "primary-hover": "color-mix(in oklch, var(--color-neutral-50) 80%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "kbd",
      "type": "registry:ui",
      "title": "Kbd",
      "description": "Shows a key or a keyboard shortcut in text.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-kbd--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-kbd--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/kbd.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "label",
      "type": "registry:ui",
      "title": "Label",
      "description": "Names a form control and widens its hit area.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-label--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-label--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/label.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "map-pin",
      "type": "registry:ui",
      "title": "Map pin",
      "description": "A pin for a point on a map, with a preview that opens on click or tap.",
      "categories": [
        "special-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-map-pin--docs",
      "meta": {
        "tier": "special-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-map-pin--docs",
        "status": "new"
      },
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/map-pin.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-primary-subtle": "var(--primary-subtle)",
          "color-destructive-foreground": "var(--destructive-foreground)",
          "color-destructive-subtle": "var(--destructive-subtle)",
          "color-success": "var(--success)",
          "color-success-foreground": "var(--success-foreground)",
          "color-success-subtle": "var(--success-subtle)",
          "color-warning": "var(--warning)",
          "color-warning-foreground": "var(--warning-foreground)",
          "color-warning-subtle": "var(--warning-subtle)",
          "color-info": "var(--info)",
          "color-info-foreground": "var(--info-foreground)",
          "color-info-subtle": "var(--info-subtle)",
          "color-ring-subtle": "var(--ring-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "background-color-destructive": "var(--destructive)",
          "border-color-destructive": "var(--destructive-border)",
          "text-color-success": "var(--success-text)",
          "background-color-success": "var(--success)",
          "border-color-success": "var(--success-border)",
          "text-color-warning": "var(--warning-text)",
          "background-color-warning": "var(--warning)",
          "border-color-warning": "var(--warning-border)",
          "text-color-info": "var(--info-text)",
          "background-color-info": "var(--info)",
          "border-color-info": "var(--info-border)"
        },
        "light": {
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-900) 10%, transparent)",
          "destructive-foreground": "var(--color-neutral-50)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-700) 8%, transparent)",
          "success": "var(--color-green-700)",
          "success-foreground": "var(--color-neutral-50)",
          "success-subtle": "color-mix(in oklch, var(--color-green-700) 6%, transparent)",
          "warning": "var(--color-amber-700)",
          "warning-foreground": "var(--color-neutral-50)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-700) 6%, transparent)",
          "info": "var(--color-blue-700)",
          "info-foreground": "var(--color-neutral-50)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-700) 6%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)",
          "success-text": "var(--success)",
          "success-border": "var(--success)",
          "warning-text": "var(--warning)",
          "warning-border": "var(--warning)",
          "info-text": "var(--info)",
          "info-border": "var(--info)"
        },
        "dark": {
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-50) 20%, transparent)",
          "destructive-foreground": "var(--color-neutral-950)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-400) 20%, transparent)",
          "success": "var(--color-green-400)",
          "success-foreground": "var(--color-neutral-950)",
          "success-subtle": "color-mix(in oklch, var(--color-green-400) 20%, transparent)",
          "warning": "var(--color-amber-400)",
          "warning-foreground": "var(--color-neutral-950)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-400) 20%, transparent)",
          "info": "var(--color-blue-400)",
          "info-foreground": "var(--color-neutral-950)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-400) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)",
          "success-text": "var(--success)",
          "success-border": "var(--success)",
          "warning-text": "var(--warning)",
          "warning-border": "var(--warning)",
          "info-text": "var(--info)",
          "info-border": "var(--info)"
        }
      }
    },
    {
      "name": "menu",
      "type": "registry:ui",
      "title": "Menu",
      "description": "A short list of actions that opens from a button.",
      "categories": [
        "base-components",
        "overlays"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-overlays-menu--docs",
      "meta": {
        "tier": "base-components",
        "group": "Overlays",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-overlays-menu--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/menu.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-subtle": "var(--destructive-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "background-color-destructive-subtle": "var(--destructive-subtle)"
        },
        "light": {
          "destructive-subtle": "color-mix(in oklch, var(--color-red-700) 8%, transparent)",
          "destructive-text": "var(--destructive)"
        },
        "dark": {
          "destructive-subtle": "color-mix(in oklch, var(--color-red-400) 20%, transparent)",
          "destructive-text": "var(--destructive)"
        }
      }
    },
    {
      "name": "message-list",
      "type": "registry:ui",
      "title": "Message list",
      "description": "A conversation that groups each person's messages under one heading, with a single tab stop.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-message-list--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-message-list--docs"
      },
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/avatar.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/message-list.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-foreground": "var(--destructive-foreground)",
          "color-ring-subtle": "var(--ring-subtle)",
          "background-color-destructive": "var(--destructive)"
        },
        "light": {
          "destructive-foreground": "var(--color-neutral-50)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "destructive-foreground": "var(--color-neutral-950)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "pagination",
      "type": "registry:ui",
      "title": "Pagination",
      "description": "Moves through a long list one page at a time.",
      "categories": [
        "base-components",
        "navigation"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-navigation-pagination--docs",
      "meta": {
        "tier": "base-components",
        "group": "Navigation",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-navigation-pagination--docs"
      },
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/pagination.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "pixel-snail",
      "type": "registry:ui",
      "title": "Pixel snail",
      "description": "A one-colour pixel snail that crawls on a loop while something loads.",
      "categories": [
        "special-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-pixel-snail--docs",
      "meta": {
        "tier": "special-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-pixel-snail--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/pixel-snail.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "progress",
      "type": "registry:ui",
      "title": "Progress",
      "description": "Shows how far a task has got, or that it's under way.",
      "categories": [
        "base-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-feedback-progress--docs",
      "meta": {
        "tier": "base-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-feedback-progress--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/progress.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "animate-progress-indeterminate": "progress-indeterminate 1.4s ease-in-out infinite"
        }
      },
      "css": {
        "@keyframes progress-indeterminate": {
          "from": {
            "transform": "translateX(-100%)"
          },
          "to": {
            "transform": "translateX(300%)"
          }
        }
      }
    },
    {
      "name": "radio-group",
      "type": "registry:ui",
      "title": "Radio group",
      "description": "Picks exactly one option from a short list.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-radio-group--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-radio-group--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/radio-group.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "reactions",
      "type": "registry:ui",
      "title": "Reactions",
      "description": "Lets people respond to content with an emoji in one tap.",
      "categories": [
        "special-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-reactions--docs",
      "meta": {
        "tier": "special-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-reactions--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/reactions.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-popover-overlay": "var(--popover-overlay)",
          "color-primary-subtle": "var(--primary-subtle)",
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "popover-overlay": "color-mix(in oklch, var(--color-white) 85%, transparent)",
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-900) 10%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "popover-overlay": "color-mix(in oklch, var(--color-neutral-900) 85%, transparent)",
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-50) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "select",
      "type": "registry:ui",
      "title": "Select",
      "description": "Picks one option from a list that opens on demand.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-select--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-select--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/select.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-input-subtle-hover": "var(--input-subtle-hover)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "input-subtle-hover": "color-mix(in oklch, var(--color-neutral-200) 50%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "input-subtle-hover": "oklch(1 0 0 / 10%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "sheet",
      "type": "registry:ui",
      "title": "Sheet",
      "description": "A panel that slides in from an edge for a focused task.",
      "categories": [
        "base-components",
        "overlays"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-overlays-sheet--docs",
      "meta": {
        "tier": "base-components",
        "group": "Overlays",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-overlays-sheet--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/sheet.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-backdrop": "var(--backdrop)"
        },
        "light": {
          "backdrop": "color-mix(in oklch, var(--color-neutral-950) 20%, transparent)"
        },
        "dark": {
          "backdrop": "color-mix(in oklch, var(--color-black) 60%, transparent)"
        }
      }
    },
    {
      "name": "skeleton",
      "type": "registry:ui",
      "title": "Skeleton",
      "description": "A placeholder in the shape of content that's still loading.",
      "categories": [
        "base-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-feedback-skeleton--docs",
      "meta": {
        "tier": "base-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-feedback-skeleton--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/skeleton.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "slider",
      "type": "registry:ui",
      "title": "Slider",
      "description": "Picks a number, or a range, by dragging along a track.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-slider--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-slider--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/slider.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "spinner",
      "type": "registry:ui",
      "title": "Spinner",
      "description": "A spinning ring that says something is loading.",
      "categories": [
        "base-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Deprecated in 0.2.0 and removed in 0.3.0. Use Progress (@fibo/progress) instead.\nMigrate: pnpm dlx jscodeshift --parser tsx -t https://fibo.toribryan.com/codemods/spinner-to-progress.js src\nDocs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-feedback-spinner--docs",
      "meta": {
        "tier": "base-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-feedback-spinner--docs",
        "status": "deprecated",
        "deprecated": {
          "since": "0.2.0",
          "removal": "0.3.0",
          "replacement": "progress",
          "reason": "A spinner says nothing about how long a wait will be or what is happening. An indeterminate Progress takes a label, and turns determinate once the total is known.",
          "codemod": "spinner-to-progress"
        }
      },
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/spinner.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "sticker-avatar",
      "type": "registry:ui",
      "title": "Sticker avatar",
      "description": "An avatar cut out like a die-cut sticker, with a paper edge that follows its shape and a status told by shape.",
      "categories": [
        "special-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-sticker-avatar--docs",
      "meta": {
        "tier": "special-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-sticker-avatar--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/sticker-avatar.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-success": "var(--success)",
          "color-warning": "var(--warning)",
          "color-sticker-edge": "var(--sticker-edge)",
          "color-sticker-ink": "var(--sticker-ink)",
          "fill-success": "var(--success-icon)",
          "stroke-success": "var(--success-icon)",
          "fill-warning": "var(--warning-icon)",
          "stroke-warning": "var(--warning-icon)"
        },
        "light": {
          "success": "var(--color-green-700)",
          "warning": "var(--color-amber-700)",
          "sticker-edge": "var(--color-white)",
          "sticker-ink": "var(--color-neutral-900)",
          "success-icon": "var(--success)",
          "warning-icon": "var(--warning)"
        },
        "dark": {
          "success": "var(--color-green-400)",
          "warning": "var(--color-amber-400)",
          "sticker-edge": "var(--color-white)",
          "sticker-ink": "var(--color-neutral-900)",
          "success-icon": "var(--success)",
          "warning-icon": "var(--warning)"
        }
      }
    },
    {
      "name": "switch",
      "type": "registry:ui",
      "title": "Switch",
      "description": "Turns a setting on or off, taking effect at once.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-switch--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-switch--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/switch.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "table",
      "type": "registry:ui",
      "title": "Table",
      "description": "Rows and columns of data, at one compact density.",
      "categories": [
        "base-components",
        "display"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-display-table--docs",
      "meta": {
        "tier": "base-components",
        "group": "Display",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-display-table--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/table.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)"
        }
      }
    },
    {
      "name": "textarea",
      "type": "registry:ui",
      "title": "Textarea",
      "description": "Several lines of free text that grow with the content.",
      "categories": [
        "base-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-forms-textarea--docs",
      "meta": {
        "tier": "base-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-forms-textarea--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/textarea.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-destructive-ring": "var(--destructive-ring)",
          "color-input-subtle": "var(--input-subtle)",
          "color-ring-subtle": "var(--ring-subtle)",
          "border-color-destructive": "var(--destructive-border)"
        },
        "light": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        },
        "dark": {
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-border": "var(--destructive)"
        }
      }
    },
    {
      "name": "toast",
      "type": "registry:ui",
      "title": "Toast",
      "description": "A brief message in the corner about something that just happened.",
      "categories": [
        "base-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-feedback-toast--docs",
      "meta": {
        "tier": "base-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-feedback-toast--docs"
      },
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/toast.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-success": "var(--success)",
          "color-warning": "var(--warning)",
          "color-info": "var(--info)",
          "color-ring-subtle": "var(--ring-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "text-color-success": "var(--success-text)",
          "text-color-warning": "var(--warning-text)",
          "text-color-info": "var(--info-text)"
        },
        "light": {
          "success": "var(--color-green-700)",
          "warning": "var(--color-amber-700)",
          "info": "var(--color-blue-700)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "success-text": "var(--success)",
          "warning-text": "var(--warning)",
          "info-text": "var(--info)"
        },
        "dark": {
          "success": "var(--color-green-400)",
          "warning": "var(--color-amber-400)",
          "info": "var(--color-blue-400)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-text": "var(--destructive)",
          "success-text": "var(--success)",
          "warning-text": "var(--warning)",
          "info-text": "var(--info)"
        }
      }
    },
    {
      "name": "token-flow",
      "type": "registry:ui",
      "title": "Token flow",
      "description": "Walks a colour token from raw value to primitive to semantic role.",
      "categories": [
        "special-components",
        "diagrams"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-token-flow--docs",
      "meta": {
        "tier": "special-components",
        "group": "Diagrams",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-token-flow--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/token-flow.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tooltip",
      "type": "registry:ui",
      "title": "Tooltip",
      "description": "A short label that appears when a control is hovered or focused.",
      "categories": [
        "base-components",
        "overlays"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-overlays-tooltip--docs",
      "meta": {
        "tier": "base-components",
        "group": "Overlays",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-overlays-tooltip--docs"
      },
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/tooltip.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "typing-indicator",
      "type": "registry:ui",
      "title": "Typing indicator",
      "description": "Says who's typing in a conversation, naming up to three people.",
      "categories": [
        "base-components",
        "feedback"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/base-components-feedback-typing-indicator--docs",
      "meta": {
        "tier": "base-components",
        "group": "Feedback",
        "docs": "https://fibo.toribryan.com/?path=/docs/base-components-feedback-typing-indicator--docs"
      },
      "dependencies": [],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/typing-indicator.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "animate-typing-dot": "typing-dot 1.2s ease-in-out infinite"
        }
      },
      "css": {
        "@keyframes typing-dot": {
          "0%,\n    60%,\n    100%": {
            "opacity": "0.4",
            "transform": "translateY(0)"
          },
          "30%": {
            "opacity": "1",
            "transform": "translateY(-2px)"
          }
        }
      }
    },
    {
      "name": "voice-memo",
      "type": "registry:ui",
      "title": "Voice memo",
      "description": "An aluminium recorder that writes down what you say, with the transcript filling in beside it as you talk.",
      "categories": [
        "special-components",
        "forms"
      ],
      "author": "Tori Bryan",
      "docs": "Docs and live examples: https://fibo.toribryan.com/?path=/docs/special-components-voice-memo--docs",
      "meta": {
        "tier": "special-components",
        "group": "Forms",
        "docs": "https://fibo.toribryan.com/?path=/docs/special-components-voice-memo--docs",
        "status": "new"
      },
      "dependencies": [
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "https://fibo.toribryan.com/r/button.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/ui/voice-memo.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "color-ring-subtle": "var(--ring-subtle)",
          "background-color-destructive": "var(--destructive)",
          "fill-destructive": "var(--destructive-icon)"
        },
        "light": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "destructive-icon": "var(--destructive)"
        },
        "dark": {
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "destructive-icon": "var(--destructive)"
        }
      }
    },
    {
      "name": "theme",
      "type": "registry:theme",
      "title": "Theme",
      "description": "fibo's full token set, light and dark: the achromatic roles, status colours and named -subtle, -hover and -ring roles.",
      "author": "Tori Bryan",
      "docs": "Token reference: https://fibo.toribryan.com/?path=/docs/foundations-colors--docs",
      "meta": {
        "docs": "https://fibo.toribryan.com/?path=/docs/foundations-colors--docs"
      },
      "cssVars": {
        "theme": {
          "color-background": "var(--background)",
          "color-foreground": "var(--foreground)",
          "color-card": "var(--card)",
          "color-card-foreground": "var(--card-foreground)",
          "color-popover": "var(--popover)",
          "color-popover-foreground": "var(--popover-foreground)",
          "color-popover-overlay": "var(--popover-overlay)",
          "color-backdrop": "var(--backdrop)",
          "color-primary": "var(--primary)",
          "color-primary-foreground": "var(--primary-foreground)",
          "color-primary-hover": "var(--primary-hover)",
          "color-primary-subtle": "var(--primary-subtle)",
          "color-secondary": "var(--secondary)",
          "color-secondary-foreground": "var(--secondary-foreground)",
          "color-secondary-hover": "var(--secondary-hover)",
          "color-muted": "var(--muted)",
          "color-muted-foreground": "var(--muted-foreground)",
          "color-accent": "var(--accent)",
          "color-accent-foreground": "var(--accent-foreground)",
          "color-destructive": "var(--destructive)",
          "color-destructive-foreground": "var(--destructive-foreground)",
          "color-destructive-subtle": "var(--destructive-subtle)",
          "color-destructive-subtle-hover": "var(--destructive-subtle-hover)",
          "color-destructive-ring": "var(--destructive-ring)",
          "color-success": "var(--success)",
          "color-success-foreground": "var(--success-foreground)",
          "color-success-subtle": "var(--success-subtle)",
          "color-warning": "var(--warning)",
          "color-warning-foreground": "var(--warning-foreground)",
          "color-warning-subtle": "var(--warning-subtle)",
          "color-info": "var(--info)",
          "color-info-foreground": "var(--info-foreground)",
          "color-info-subtle": "var(--info-subtle)",
          "text-color-destructive": "var(--destructive-text)",
          "background-color-destructive": "var(--destructive)",
          "background-color-destructive-subtle": "var(--destructive-subtle)",
          "border-color-destructive": "var(--destructive-border)",
          "fill-destructive": "var(--destructive-icon)",
          "stroke-destructive": "var(--destructive-icon)",
          "text-color-success": "var(--success-text)",
          "background-color-success": "var(--success)",
          "background-color-success-subtle": "var(--success-subtle)",
          "border-color-success": "var(--success-border)",
          "fill-success": "var(--success-icon)",
          "stroke-success": "var(--success-icon)",
          "text-color-warning": "var(--warning-text)",
          "background-color-warning": "var(--warning)",
          "background-color-warning-subtle": "var(--warning-subtle)",
          "border-color-warning": "var(--warning-border)",
          "fill-warning": "var(--warning-icon)",
          "stroke-warning": "var(--warning-icon)",
          "text-color-info": "var(--info-text)",
          "background-color-info": "var(--info)",
          "background-color-info-subtle": "var(--info-subtle)",
          "border-color-info": "var(--info-border)",
          "fill-info": "var(--info-icon)",
          "stroke-info": "var(--info-icon)",
          "color-border": "var(--border)",
          "color-input": "var(--input)",
          "color-input-subtle": "var(--input-subtle)",
          "color-input-subtle-hover": "var(--input-subtle-hover)",
          "color-ring": "var(--ring)",
          "color-ring-subtle": "var(--ring-subtle)",
          "color-sticker-edge": "var(--sticker-edge)",
          "color-sticker-ink": "var(--sticker-ink)",
          "color-chart-1": "var(--chart-1)",
          "color-chart-2": "var(--chart-2)",
          "color-chart-3": "var(--chart-3)",
          "color-chart-4": "var(--chart-4)",
          "color-chart-5": "var(--chart-5)",
          "color-sidebar": "var(--sidebar)",
          "color-sidebar-foreground": "var(--sidebar-foreground)",
          "color-sidebar-primary": "var(--sidebar-primary)",
          "color-sidebar-primary-foreground": "var(--sidebar-primary-foreground)",
          "color-sidebar-accent": "var(--sidebar-accent)",
          "color-sidebar-accent-foreground": "var(--sidebar-accent-foreground)",
          "color-sidebar-border": "var(--sidebar-border)",
          "color-sidebar-ring": "var(--sidebar-ring)",
          "radius-sm": "calc(var(--radius) - 4px)",
          "radius-md": "calc(var(--radius) - 2px)",
          "radius-lg": "var(--radius)",
          "radius-xl": "calc(var(--radius) + 4px)",
          "radius-2xl": "calc(var(--radius) + 8px)",
          "radius-3xl": "calc(var(--radius) + 12px)",
          "radius-4xl": "calc(var(--radius) + 16px)",
          "animate-progress-indeterminate": "progress-indeterminate 1.4s ease-in-out infinite",
          "animate-typing-dot": "typing-dot 1.2s ease-in-out infinite"
        },
        "light": {
          "background": "var(--color-white)",
          "foreground": "var(--color-neutral-950)",
          "card": "var(--color-white)",
          "card-foreground": "var(--color-neutral-950)",
          "popover": "var(--color-white)",
          "popover-foreground": "var(--color-neutral-950)",
          "popover-overlay": "color-mix(in oklch, var(--color-white) 85%, transparent)",
          "backdrop": "color-mix(in oklch, var(--color-neutral-950) 20%, transparent)",
          "primary": "var(--color-neutral-900)",
          "primary-foreground": "var(--color-neutral-50)",
          "primary-hover": "color-mix(in oklch, var(--color-neutral-900) 80%, transparent)",
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-900) 10%, transparent)",
          "secondary": "var(--color-neutral-100)",
          "secondary-foreground": "var(--color-neutral-900)",
          "secondary-hover": "var(--color-neutral-200)",
          "muted": "var(--color-neutral-100)",
          "muted-foreground": "var(--color-neutral-500)",
          "accent": "var(--color-neutral-100)",
          "accent-foreground": "var(--color-neutral-900)",
          "destructive": "var(--color-red-700)",
          "destructive-foreground": "var(--color-neutral-50)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-700) 8%, transparent)",
          "destructive-subtle-hover": "color-mix(in oklch, var(--color-red-700) 16%, transparent)",
          "destructive-ring": "color-mix(in oklch, var(--color-red-700) 20%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)",
          "destructive-icon": "var(--destructive)",
          "success": "var(--color-green-700)",
          "success-foreground": "var(--color-neutral-50)",
          "success-subtle": "color-mix(in oklch, var(--color-green-700) 6%, transparent)",
          "success-text": "var(--success)",
          "success-border": "var(--success)",
          "success-icon": "var(--success)",
          "warning": "var(--color-amber-700)",
          "warning-foreground": "var(--color-neutral-50)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-700) 6%, transparent)",
          "warning-text": "var(--warning)",
          "warning-border": "var(--warning)",
          "warning-icon": "var(--warning)",
          "info": "var(--color-blue-700)",
          "info-foreground": "var(--color-neutral-50)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-700) 6%, transparent)",
          "info-text": "var(--info)",
          "info-border": "var(--info)",
          "info-icon": "var(--info)",
          "border": "var(--color-neutral-200)",
          "input": "var(--color-neutral-200)",
          "input-subtle": "color-mix(in oklch, var(--color-neutral-200) 20%, transparent)",
          "input-subtle-hover": "color-mix(in oklch, var(--color-neutral-200) 50%, transparent)",
          "ring": "var(--color-neutral-400)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-400) 50%, transparent)",
          "sticker-edge": "var(--color-white)",
          "sticker-ink": "var(--color-neutral-900)",
          "chart-1": "var(--color-neutral-300)",
          "chart-2": "var(--color-neutral-500)",
          "chart-3": "var(--color-neutral-600)",
          "chart-4": "var(--color-neutral-700)",
          "chart-5": "var(--color-neutral-800)",
          "radius": "0.5rem",
          "sidebar": "var(--color-neutral-50)",
          "sidebar-foreground": "var(--color-neutral-950)",
          "sidebar-primary": "var(--color-neutral-900)",
          "sidebar-primary-foreground": "var(--color-neutral-50)",
          "sidebar-accent": "var(--color-neutral-100)",
          "sidebar-accent-foreground": "var(--color-neutral-900)",
          "sidebar-border": "var(--color-neutral-200)",
          "sidebar-ring": "var(--color-neutral-400)"
        },
        "dark": {
          "background": "var(--color-neutral-950)",
          "foreground": "var(--color-neutral-50)",
          "card": "var(--color-neutral-900)",
          "card-foreground": "var(--color-neutral-50)",
          "popover": "var(--color-neutral-900)",
          "popover-foreground": "var(--color-neutral-50)",
          "popover-overlay": "color-mix(in oklch, var(--color-neutral-900) 85%, transparent)",
          "backdrop": "color-mix(in oklch, var(--color-black) 60%, transparent)",
          "primary": "var(--color-neutral-50)",
          "primary-foreground": "var(--color-neutral-900)",
          "primary-hover": "color-mix(in oklch, var(--color-neutral-50) 80%, transparent)",
          "primary-subtle": "color-mix(in oklch, var(--color-neutral-50) 20%, transparent)",
          "secondary": "var(--color-neutral-800)",
          "secondary-foreground": "var(--color-neutral-50)",
          "secondary-hover": "var(--color-neutral-700)",
          "muted": "var(--color-neutral-800)",
          "muted-foreground": "var(--color-neutral-400)",
          "accent": "var(--color-neutral-800)",
          "accent-foreground": "var(--color-neutral-50)",
          "destructive": "var(--color-red-400)",
          "destructive-foreground": "var(--color-neutral-950)",
          "destructive-subtle": "color-mix(in oklch, var(--color-red-400) 20%, transparent)",
          "destructive-subtle-hover": "color-mix(in oklch, var(--color-red-400) 30%, transparent)",
          "destructive-ring": "color-mix(in oklch, var(--color-red-400) 40%, transparent)",
          "destructive-text": "var(--destructive)",
          "destructive-border": "var(--destructive)",
          "destructive-icon": "var(--destructive)",
          "success": "var(--color-green-400)",
          "success-foreground": "var(--color-neutral-950)",
          "success-subtle": "color-mix(in oklch, var(--color-green-400) 20%, transparent)",
          "success-text": "var(--success)",
          "success-border": "var(--success)",
          "success-icon": "var(--success)",
          "warning": "var(--color-amber-400)",
          "warning-foreground": "var(--color-neutral-950)",
          "warning-subtle": "color-mix(in oklch, var(--color-amber-400) 20%, transparent)",
          "warning-text": "var(--warning)",
          "warning-border": "var(--warning)",
          "warning-icon": "var(--warning)",
          "info": "var(--color-blue-400)",
          "info-foreground": "var(--color-neutral-950)",
          "info-subtle": "color-mix(in oklch, var(--color-blue-400) 20%, transparent)",
          "info-text": "var(--info)",
          "info-border": "var(--info)",
          "info-icon": "var(--info)",
          "border": "oklch(1 0 0 / 10%)",
          "input": "oklch(1 0 0 / 15%)",
          "input-subtle": "oklch(1 0 0 / 5%)",
          "input-subtle-hover": "oklch(1 0 0 / 10%)",
          "ring": "var(--color-neutral-500)",
          "ring-subtle": "color-mix(in oklch, var(--color-neutral-500) 50%, transparent)",
          "sticker-edge": "var(--color-white)",
          "sticker-ink": "var(--color-neutral-900)",
          "chart-1": "var(--color-neutral-300)",
          "chart-2": "var(--color-neutral-500)",
          "chart-3": "var(--color-neutral-600)",
          "chart-4": "var(--color-neutral-700)",
          "chart-5": "var(--color-neutral-800)",
          "sidebar": "var(--color-neutral-900)",
          "sidebar-foreground": "var(--color-neutral-50)",
          "sidebar-primary": "var(--color-neutral-50)",
          "sidebar-primary-foreground": "var(--color-neutral-900)",
          "sidebar-accent": "var(--color-neutral-800)",
          "sidebar-accent-foreground": "var(--color-neutral-50)",
          "sidebar-border": "oklch(1 0 0 / 10%)",
          "sidebar-ring": "var(--color-neutral-500)"
        }
      },
      "css": {
        "@keyframes progress-indeterminate": {
          "from": {
            "transform": "translateX(-100%)"
          },
          "to": {
            "transform": "translateX(300%)"
          }
        },
        "@keyframes typing-dot": {
          "0%,\n    60%,\n    100%": {
            "opacity": "0.4",
            "transform": "translateY(0)"
          },
          "30%": {
            "opacity": "1",
            "transform": "translateY(-2px)"
          }
        }
      }
    }
  ]
}
