{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "provins",
  "homepage": "https://provins.xyz",
  "items": [
    {
      "name": "theme-raltone",
      "type": "registry:file",
      "title": "Raltone theme",
      "description": "Raltone's warm-beige palette, brown primary and Inter Tight, mapped onto the Oft foundation tokens.",
      "registryDependencies": [
        "@provins/oft-foundation"
      ],
      "files": [
        {
          "path": "registry/themes/raltone.css",
          "type": "registry:file",
          "target": "@components/oft/themes/raltone.css"
        }
      ]
    },
    {
      "name": "theme-provins",
      "type": "registry:file",
      "title": "Provins theme",
      "description": "Warm paper, ink, NType 82 titles and Untitled Sans body, mapped onto the Oft foundation tokens.",
      "registryDependencies": [
        "@provins/oft-foundation"
      ],
      "files": [
        {
          "path": "registry/themes/provins.css",
          "type": "registry:file",
          "target": "@components/oft/themes/provins.css"
        }
      ]
    },
    {
      "name": "oft-foundation",
      "type": "registry:item",
      "title": "Oft foundation",
      "description": "Oft design tokens (color, surface, radius, shadow, accent, focus, light and dark themes), plus the shared motion presets. Install once per app.",
      "categories": [
        "foundation"
      ],
      "dependencies": [],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/foundation.css",
          "type": "registry:component",
          "target": "@components/oft/foundation.css"
        }
      ],
      "meta": {
        "kind": "foundation"
      }
    },
    {
      "name": "oft-motion-tokens",
      "type": "registry:item",
      "title": "Oft motion tokens",
      "description": "The shared motion presets (durations, easings, springs, staggers) Oft components import. Installed automatically with any item that uses them.",
      "categories": [
        "foundation"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "registry/oft/motion-tokens.ts",
          "type": "registry:component",
          "target": "@components/oft/motion-tokens.ts"
        },
        {
          "path": "registry/oft/lib/motion-tokens.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/motion-tokens.ts"
        }
      ],
      "meta": {
        "kind": "foundation"
      }
    },
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "A clear, responsive action with quiet secondary states.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/button/button.tsx",
          "type": "registry:component",
          "target": "@components/oft/button/button.tsx"
        },
        {
          "path": "registry/oft/button/button.module.css",
          "type": "registry:component",
          "target": "@components/oft/button/button.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "control"
        ]
      }
    },
    {
      "name": "action-button",
      "type": "registry:ui",
      "title": "Action button",
      "description": "A compact button for frequent toolbar actions.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/action-button/action-button.tsx",
          "type": "registry:component",
          "target": "@components/oft/action-button/action-button.tsx"
        },
        {
          "path": "registry/oft/action-button/action-button.module.css",
          "type": "registry:component",
          "target": "@components/oft/action-button/action-button.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "toolbar"
        ]
      }
    },
    {
      "name": "split-button",
      "type": "registry:ui",
      "title": "Split button",
      "description": "A primary action with a menu of nearby alternatives.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/split-button/split-button.tsx",
          "type": "registry:component",
          "target": "@components/oft/split-button/split-button.tsx"
        },
        {
          "path": "registry/oft/split-button/split-button.module.css",
          "type": "registry:component",
          "target": "@components/oft/split-button/split-button.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "menu"
        ]
      }
    },
    {
      "name": "button-group",
      "type": "registry:ui",
      "title": "Button group",
      "description": "Related actions joined into one surface with hairline dividers: a hover highlight glides between segments, the pressed one answers in place, and an attached menu can close the row.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/button-group/button-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/button-group/button-group.tsx"
        },
        {
          "path": "registry/oft/button-group/button-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/button-group/button-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "group",
          "toolbar",
          "new"
        ]
      }
    },
    {
      "name": "floating-button-group",
      "type": "registry:ui",
      "title": "Floating button group",
      "description": "Separate soft buttons in a quiet tray, with one shared highlight that morphs from button to button as you move, and a pressed state that settles in place.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "@radix-ui/react-tooltip",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/tooltip"
      ],
      "files": [
        {
          "path": "registry/oft/floating-button-group/floating-button-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/floating-button-group/floating-button-group.tsx"
        },
        {
          "path": "registry/oft/floating-button-group/floating-button-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/floating-button-group/floating-button-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "group",
          "toolbar",
          "new"
        ]
      }
    },
    {
      "name": "expanding-button-group",
      "type": "registry:ui",
      "title": "Expanding button group",
      "description": "Icon buttons in a compact group: the one you point at or focus grows to reveal its label while its neighbours slide aside, and an action confirms in place.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/expanding-button-group/expanding-button-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/expanding-button-group/expanding-button-group.tsx"
        },
        {
          "path": "registry/oft/expanding-button-group/expanding-button-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/expanding-button-group/expanding-button-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "group",
          "toolbar",
          "new"
        ]
      }
    },
    {
      "name": "dropdown-menu",
      "type": "registry:ui",
      "title": "Dropdown menu",
      "description": "A focused list of actions anchored to a trigger.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/dropdown-menu/dropdown-menu.tsx",
          "type": "registry:component",
          "target": "@components/oft/dropdown-menu/dropdown-menu.tsx"
        },
        {
          "path": "registry/oft/dropdown-menu/dropdown-menu.module.css",
          "type": "registry:component",
          "target": "@components/oft/dropdown-menu/dropdown-menu.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "menu",
          "action"
        ]
      }
    },
    {
      "name": "context-menu",
      "type": "registry:ui",
      "title": "Context menu",
      "description": "Secondary actions kept close to the selected object.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/context-menu/context-menu.tsx",
          "type": "registry:component",
          "target": "@components/oft/context-menu/context-menu.tsx"
        },
        {
          "path": "registry/oft/context-menu/context-menu.module.css",
          "type": "registry:component",
          "target": "@components/oft/context-menu/context-menu.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "menu",
          "action"
        ]
      }
    },
    {
      "name": "copy-button",
      "type": "registry:ui",
      "title": "Copy button",
      "description": "Copy a value with immediate confirmation.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/copy-button/copy-button.tsx",
          "type": "registry:component",
          "target": "@components/oft/copy-button/copy-button.tsx"
        },
        {
          "path": "registry/oft/copy-button/copy-button.module.css",
          "type": "registry:component",
          "target": "@components/oft/copy-button/copy-button.module.css"
        },
        {
          "path": "registry/oft/lib/use-copy-feedback.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/use-copy-feedback.ts"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "action",
          "utility"
        ]
      }
    },
    {
      "name": "drawer",
      "type": "registry:ui",
      "title": "Drawer",
      "description": "A temporary side surface for focused work.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/drawer/drawer.tsx",
          "type": "registry:component",
          "target": "@components/oft/drawer/drawer.tsx"
        },
        {
          "path": "registry/oft/drawer/drawer.module.css",
          "type": "registry:component",
          "target": "@components/oft/drawer/drawer.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "overlay",
          "surface"
        ]
      }
    },
    {
      "name": "theme-switch",
      "type": "registry:ui",
      "title": "Theme switcher",
      "description": "Four smooth ways to move between light and dark appearance.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/theme-switch/theme-switch.tsx",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.tsx"
        },
        {
          "path": "registry/oft/theme-switch/theme-switch.module.css",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "theme",
          "appearance",
          "motion"
        ]
      }
    },
    {
      "name": "theme-switch-eclipse",
      "type": "registry:ui",
      "title": "Eclipse",
      "description": "The next appearance crosses the page like an eclipse.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/theme-switch/theme-switch.tsx",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.tsx"
        },
        {
          "path": "registry/oft/theme-switch/theme-switch.module.css",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "theme",
          "appearance",
          "motion"
        ]
      }
    },
    {
      "name": "theme-switch-split",
      "type": "registry:ui",
      "title": "Split",
      "description": "The next appearance opens from a slim center seam.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/theme-switch/theme-switch.tsx",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.tsx"
        },
        {
          "path": "registry/oft/theme-switch/theme-switch.module.css",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "theme",
          "appearance",
          "motion"
        ]
      }
    },
    {
      "name": "theme-switch-rise",
      "type": "registry:ui",
      "title": "Rise",
      "description": "The next appearance rises into place.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/theme-switch/theme-switch.tsx",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.tsx"
        },
        {
          "path": "registry/oft/theme-switch/theme-switch.module.css",
          "type": "registry:component",
          "target": "@components/oft/theme-switch/theme-switch.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "theme",
          "appearance",
          "motion"
        ]
      }
    },
    {
      "name": "avatar",
      "type": "registry:ui",
      "title": "Avatar",
      "description": "A compact identity marker for people and accounts.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/avatar/avatar.tsx",
          "type": "registry:component",
          "target": "@components/oft/avatar/avatar.tsx"
        },
        {
          "path": "registry/oft/avatar/avatar.module.css",
          "type": "registry:component",
          "target": "@components/oft/avatar/avatar.module.css"
        },
        {
          "path": "registry/oft/lib/oft-provider.tsx",
          "type": "registry:lib",
          "target": "@components/oft/lib/oft-provider.tsx"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "identity",
          "people"
        ]
      }
    },
    {
      "name": "avatar-group",
      "type": "registry:ui",
      "title": "Avatar group",
      "description": "Show a team or set of contributors in a small space.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/avatar"
      ],
      "files": [
        {
          "path": "registry/oft/avatar-group/avatar-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/avatar-group/avatar-group.tsx"
        },
        {
          "path": "registry/oft/avatar-group/avatar-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/avatar-group/avatar-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "identity",
          "people"
        ]
      }
    },
    {
      "name": "input",
      "type": "registry:ui",
      "title": "Input",
      "description": "A single line field with clear labels and useful states.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/input/input.tsx",
          "type": "registry:component",
          "target": "@components/oft/input/input.tsx"
        },
        {
          "path": "registry/oft/input/input.module.css",
          "type": "registry:component",
          "target": "@components/oft/input/input.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "form"
        ]
      }
    },
    {
      "name": "textarea",
      "type": "registry:ui",
      "title": "Textarea",
      "description": "A multiline field for notes, descriptions, and longer text.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/textarea/textarea.tsx",
          "type": "registry:component",
          "target": "@components/oft/textarea/textarea.tsx"
        },
        {
          "path": "registry/oft/textarea/textarea.module.css",
          "type": "registry:component",
          "target": "@components/oft/textarea/textarea.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "form"
        ]
      }
    },
    {
      "name": "select",
      "type": "registry:ui",
      "title": "Select",
      "description": "A compact choice field with a keyboard friendly menu.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "@radix-ui/react-select",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/select/select.tsx",
          "type": "registry:component",
          "target": "@components/oft/select/select.tsx"
        },
        {
          "path": "registry/oft/select/select.module.css",
          "type": "registry:component",
          "target": "@components/oft/select/select.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "form"
        ]
      }
    },
    {
      "name": "combobox",
      "type": "registry:ui",
      "title": "Combobox",
      "description": "Search and select from a list without leaving the field.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/combobox/combobox.tsx",
          "type": "registry:component",
          "target": "@components/oft/combobox/combobox.tsx"
        },
        {
          "path": "registry/oft/combobox/combobox.module.css",
          "type": "registry:component",
          "target": "@components/oft/combobox/combobox.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "search"
        ]
      }
    },
    {
      "name": "checkbox",
      "type": "registry:ui",
      "title": "Checkbox",
      "description": "A binary choice with a precise, legible state.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "@radix-ui/react-checkbox",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/checkbox/checkbox.tsx",
          "type": "registry:component",
          "target": "@components/oft/checkbox/checkbox.tsx"
        },
        {
          "path": "registry/oft/checkbox/checkbox.module.css",
          "type": "registry:component",
          "target": "@components/oft/checkbox/checkbox.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "form"
        ]
      }
    },
    {
      "name": "switch",
      "type": "registry:ui",
      "title": "Switch",
      "description": "A tactile toggle for settings that take effect immediately.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "@radix-ui/react-switch",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/switch/switch.tsx",
          "type": "registry:component",
          "target": "@components/oft/switch/switch.tsx"
        },
        {
          "path": "registry/oft/switch/switch.module.css",
          "type": "registry:component",
          "target": "@components/oft/switch/switch.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "toggle",
          "settings"
        ]
      }
    },
    {
      "name": "multi-select",
      "type": "registry:ui",
      "title": "Multi-select",
      "description": "Select several values while keeping the field readable.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/multi-select/multi-select.tsx",
          "type": "registry:component",
          "target": "@components/oft/multi-select/multi-select.tsx"
        },
        {
          "path": "registry/oft/multi-select/multi-select.module.css",
          "type": "registry:component",
          "target": "@components/oft/multi-select/multi-select.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "choice"
        ]
      }
    },
    {
      "name": "number-field",
      "type": "registry:ui",
      "title": "Number field",
      "description": "Enter a bounded number with clear increment controls.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/number-field/number-field.tsx",
          "type": "registry:component",
          "target": "@components/oft/number-field/number-field.tsx"
        },
        {
          "path": "registry/oft/number-field/number-field.module.css",
          "type": "registry:component",
          "target": "@components/oft/number-field/number-field.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "numeric"
        ]
      }
    },
    {
      "name": "password-field",
      "type": "registry:ui",
      "title": "Password field",
      "description": "Capture sensitive text with a visible reveal control.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/password-field/password-field.tsx",
          "type": "registry:component",
          "target": "@components/oft/password-field/password-field.tsx"
        },
        {
          "path": "registry/oft/password-field/password-field.module.css",
          "type": "registry:component",
          "target": "@components/oft/password-field/password-field.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "security"
        ]
      }
    },
    {
      "name": "search-field",
      "type": "registry:ui",
      "title": "Search field",
      "description": "A recognizable search entry point with clear affordances.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/search-field/search-field.tsx",
          "type": "registry:component",
          "target": "@components/oft/search-field/search-field.tsx"
        },
        {
          "path": "registry/oft/search-field/search-field.module.css",
          "type": "registry:component",
          "target": "@components/oft/search-field/search-field.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "search"
        ]
      }
    },
    {
      "name": "tag-input",
      "type": "registry:ui",
      "title": "Tag input",
      "description": "Turn short text values into removable tags.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/tag-input/tag-input.tsx",
          "type": "registry:component",
          "target": "@components/oft/tag-input/tag-input.tsx"
        },
        {
          "path": "registry/oft/tag-input/tag-input.module.css",
          "type": "registry:component",
          "target": "@components/oft/tag-input/tag-input.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "tags"
        ]
      }
    },
    {
      "name": "file-dropzone",
      "type": "registry:ui",
      "title": "File dropzone",
      "description": "A generous target for dropping one or more files.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/file-dropzone/file-dropzone.tsx",
          "type": "registry:component",
          "target": "@components/oft/file-dropzone/file-dropzone.tsx"
        },
        {
          "path": "registry/oft/file-dropzone/file-dropzone.module.css",
          "type": "registry:component",
          "target": "@components/oft/file-dropzone/file-dropzone.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "files"
        ]
      }
    },
    {
      "name": "radio-group",
      "type": "registry:ui",
      "title": "Radio group",
      "description": "Choose one option from a visible set.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/radio-group/radio-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/radio-group/radio-group.tsx"
        },
        {
          "path": "registry/oft/radio-group/radio-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/radio-group/radio-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "field",
          "choice"
        ]
      }
    },
    {
      "name": "segmented-control",
      "type": "registry:ui",
      "title": "Segmented control",
      "description": "Switch between a small set of related views.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/segmented-control/segmented-control.tsx",
          "type": "registry:component",
          "target": "@components/oft/segmented-control/segmented-control.tsx"
        },
        {
          "path": "registry/oft/segmented-control/segmented-control.module.css",
          "type": "registry:component",
          "target": "@components/oft/segmented-control/segmented-control.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "control",
          "choice"
        ]
      }
    },
    {
      "name": "calendar",
      "type": "registry:ui",
      "title": "Calendar",
      "description": "Browse dates in a clear, compact month view.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/calendar/calendar.tsx",
          "type": "registry:component",
          "target": "@components/oft/calendar/calendar.tsx"
        },
        {
          "path": "registry/oft/lib/use-today.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/use-today.ts"
        },
        {
          "path": "registry/oft/calendar/calendar.module.css",
          "type": "registry:component",
          "target": "@components/oft/calendar/calendar.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "date",
          "field"
        ]
      }
    },
    {
      "name": "date-picker",
      "type": "registry:ui",
      "title": "Date picker",
      "description": "Choose a date without losing context.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/calendar"
      ],
      "files": [
        {
          "path": "registry/oft/date-picker/date-picker.tsx",
          "type": "registry:component",
          "target": "@components/oft/date-picker/date-picker.tsx"
        },
        {
          "path": "registry/oft/date-picker/date-picker.module.css",
          "type": "registry:component",
          "target": "@components/oft/date-picker/date-picker.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "date",
          "field"
        ]
      }
    },
    {
      "name": "time-picker",
      "type": "registry:ui",
      "title": "Time picker",
      "description": "Choose a time with sensible keyboard behavior.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/time-picker/time-picker.tsx",
          "type": "registry:component",
          "target": "@components/oft/time-picker/time-picker.tsx"
        },
        {
          "path": "registry/oft/time-picker/time-picker.module.css",
          "type": "registry:component",
          "target": "@components/oft/time-picker/time-picker.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "time",
          "field"
        ]
      }
    },
    {
      "name": "accordion",
      "type": "registry:ui",
      "title": "Accordion",
      "description": "Progressively reveal supporting information in place.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-accordion",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/accordion/accordion.tsx",
          "type": "registry:component",
          "target": "@components/oft/accordion/accordion.tsx"
        },
        {
          "path": "registry/oft/accordion/accordion.module.css",
          "type": "registry:component",
          "target": "@components/oft/accordion/accordion.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "disclosure",
          "layout"
        ]
      }
    },
    {
      "name": "dialog",
      "type": "registry:ui",
      "title": "Dialog",
      "description": "A focused surface for decisions that need attention.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/dialog/dialog.tsx",
          "type": "registry:component",
          "target": "@components/oft/dialog/dialog.tsx"
        },
        {
          "path": "registry/oft/dialog/dialog.module.css",
          "type": "registry:component",
          "target": "@components/oft/dialog/dialog.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "modal",
          "overlay"
        ]
      }
    },
    {
      "name": "popover",
      "type": "registry:ui",
      "title": "Popover",
      "description": "A small anchored surface for contextual information.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-popover"
      ],
      "files": [
        {
          "path": "registry/oft/popover/popover.tsx",
          "type": "registry:component",
          "target": "@components/oft/popover/popover.tsx"
        },
        {
          "path": "registry/oft/popover/popover.module.css",
          "type": "registry:component",
          "target": "@components/oft/popover/popover.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "overlay",
          "menu"
        ]
      }
    },
    {
      "name": "tooltip",
      "type": "registry:ui",
      "title": "Tooltip",
      "description": "Short supporting text for unfamiliar controls.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-tooltip",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/tooltip/tooltip.tsx",
          "type": "registry:component",
          "target": "@components/oft/tooltip/tooltip.tsx"
        },
        {
          "path": "registry/oft/tooltip/tooltip.module.css",
          "type": "registry:component",
          "target": "@components/oft/tooltip/tooltip.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "hint",
          "overlay"
        ]
      }
    },
    {
      "name": "tabs",
      "type": "registry:ui",
      "title": "Tabs",
      "description": "Switch between related content in the same context.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-tabs",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/tabs/tabs.tsx",
          "type": "registry:component",
          "target": "@components/oft/tabs/tabs.tsx"
        },
        {
          "path": "registry/oft/tabs/tabs.module.css",
          "type": "registry:component",
          "target": "@components/oft/tabs/tabs.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "navigation",
          "layout"
        ]
      }
    },
    {
      "name": "expandable-card",
      "type": "registry:ui",
      "title": "Expandable card",
      "description": "Give a dense card more room when requested.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/expandable-card/expandable-card.tsx",
          "type": "registry:component",
          "target": "@components/oft/expandable-card/expandable-card.tsx"
        },
        {
          "path": "registry/oft/expandable-card/expandable-card.module.css",
          "type": "registry:component",
          "target": "@components/oft/expandable-card/expandable-card.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "disclosure",
          "layout"
        ]
      }
    },
    {
      "name": "breadcrumb",
      "type": "registry:ui",
      "title": "Breadcrumb",
      "description": "Show where a page sits in a hierarchy.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/breadcrumb/breadcrumb.tsx",
          "type": "registry:component",
          "target": "@components/oft/breadcrumb/breadcrumb.tsx"
        },
        {
          "path": "registry/oft/breadcrumb/breadcrumb.module.css",
          "type": "registry:component",
          "target": "@components/oft/breadcrumb/breadcrumb.module.css"
        },
        {
          "path": "registry/oft/lib/oft-provider.tsx",
          "type": "registry:lib",
          "target": "@components/oft/lib/oft-provider.tsx"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "navigation",
          "wayfinding"
        ]
      }
    },
    {
      "name": "alert",
      "type": "registry:ui",
      "title": "Alert",
      "description": "A persistent message that helps people recover or continue.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/alert/alert.tsx",
          "type": "registry:component",
          "target": "@components/oft/alert/alert.tsx"
        },
        {
          "path": "registry/oft/alert/alert.module.css",
          "type": "registry:component",
          "target": "@components/oft/alert/alert.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "status",
          "message"
        ]
      }
    },
    {
      "name": "toast",
      "type": "registry:ui",
      "title": "Toast",
      "description": "Brief confirmation for a completed background action.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/toast/toast.tsx",
          "type": "registry:component",
          "target": "@components/oft/toast/toast.tsx"
        },
        {
          "path": "registry/oft/toast/toast.module.css",
          "type": "registry:component",
          "target": "@components/oft/toast/toast.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "status",
          "message"
        ]
      }
    },
    {
      "name": "progress",
      "type": "registry:ui",
      "title": "Progress",
      "description": "Show how much of a known task is complete.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/progress/progress.tsx",
          "type": "registry:component",
          "target": "@components/oft/progress/progress.tsx"
        },
        {
          "path": "registry/oft/progress/progress.module.css",
          "type": "registry:component",
          "target": "@components/oft/progress/progress.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "status",
          "loading"
        ]
      }
    },
    {
      "name": "skeleton",
      "type": "registry:ui",
      "title": "Skeleton",
      "description": "Reserve space while content is still loading.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/skeleton/skeleton.tsx",
          "type": "registry:component",
          "target": "@components/oft/skeleton/skeleton.tsx"
        },
        {
          "path": "registry/oft/skeleton/skeleton.module.css",
          "type": "registry:component",
          "target": "@components/oft/skeleton/skeleton.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "loading",
          "status"
        ]
      }
    },
    {
      "name": "badge",
      "type": "registry:ui",
      "title": "Badge",
      "description": "A small label for status, category, or metadata.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/badge/badge.tsx",
          "type": "registry:component",
          "target": "@components/oft/badge/badge.tsx"
        },
        {
          "path": "registry/oft/badge/badge.module.css",
          "type": "registry:component",
          "target": "@components/oft/badge/badge.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "label",
          "status"
        ]
      }
    },
    {
      "name": "card",
      "type": "registry:ui",
      "title": "Card",
      "description": "A contained group of related content and actions.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/card/card.tsx",
          "type": "registry:component",
          "target": "@components/oft/card/card.tsx"
        },
        {
          "path": "registry/oft/card/card.module.css",
          "type": "registry:component",
          "target": "@components/oft/card/card.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "surface",
          "layout"
        ]
      }
    },
    {
      "name": "metric-card",
      "type": "registry:ui",
      "title": "Metric card",
      "description": "A compact summary for a number that needs context.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/animated-counter"
      ],
      "files": [
        {
          "path": "registry/oft/metric-card/metric-card.tsx",
          "type": "registry:component",
          "target": "@components/oft/metric-card/metric-card.tsx"
        },
        {
          "path": "registry/oft/metric-card/metric-card.module.css",
          "type": "registry:component",
          "target": "@components/oft/metric-card/metric-card.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "summary"
        ]
      }
    },
    {
      "name": "empty-state",
      "type": "registry:ui",
      "title": "Empty state",
      "description": "A useful next step when there is nothing to show yet.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/empty-state/empty-state.tsx",
          "type": "registry:component",
          "target": "@components/oft/empty-state/empty-state.tsx"
        },
        {
          "path": "registry/oft/empty-state/empty-state.module.css",
          "type": "registry:component",
          "target": "@components/oft/empty-state/empty-state.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "guidance"
        ]
      }
    },
    {
      "name": "tree-view",
      "type": "registry:ui",
      "title": "Tree view",
      "description": "Navigate nested folders and structured content.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/tree-view/tree-view.tsx",
          "type": "registry:component",
          "target": "@components/oft/tree-view/tree-view.tsx"
        },
        {
          "path": "registry/oft/tree-view/tree-view.module.css",
          "type": "registry:component",
          "target": "@components/oft/tree-view/tree-view.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "navigation"
        ]
      }
    },
    {
      "name": "pagination",
      "type": "registry:ui",
      "title": "Pagination",
      "description": "Move through a long collection with clear bounds.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/pagination/pagination.tsx",
          "type": "registry:component",
          "target": "@components/oft/pagination/pagination.tsx"
        },
        {
          "path": "registry/oft/pagination/pagination.module.css",
          "type": "registry:component",
          "target": "@components/oft/pagination/pagination.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "navigation"
        ]
      }
    },
    {
      "name": "filter-toolbar",
      "type": "registry:ui",
      "title": "Filter toolbar",
      "description": "Keep collection filters close and easy to reset.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/filter-toolbar/filter-toolbar.tsx",
          "type": "registry:component",
          "target": "@components/oft/filter-toolbar/filter-toolbar.tsx"
        },
        {
          "path": "registry/oft/filter-toolbar/filter-toolbar.module.css",
          "type": "registry:component",
          "target": "@components/oft/filter-toolbar/filter-toolbar.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "filter"
        ]
      }
    },
    {
      "name": "sortable-data-table",
      "type": "registry:ui",
      "title": "Sortable data table",
      "description": "Compare structured records with sortable columns.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/sortable-data-table/sortable-data-table.tsx",
          "type": "registry:component",
          "target": "@components/oft/sortable-data-table/sortable-data-table.tsx"
        },
        {
          "path": "registry/oft/sortable-data-table/sortable-data-table.module.css",
          "type": "registry:component",
          "target": "@components/oft/sortable-data-table/sortable-data-table.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "table"
        ]
      }
    },
    {
      "name": "sparkline",
      "type": "registry:ui",
      "title": "Sparkline",
      "description": "Show a compact trend beside a value.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/sparkline/sparkline.tsx",
          "type": "registry:component",
          "target": "@components/oft/sparkline/sparkline.tsx"
        },
        {
          "path": "registry/oft/sparkline/sparkline.module.css",
          "type": "registry:component",
          "target": "@components/oft/sparkline/sparkline.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart"
        ]
      }
    },
    {
      "name": "gauge",
      "type": "registry:ui",
      "title": "Gauge",
      "description": "Show a value against a known range.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/gauge/gauge.tsx",
          "type": "registry:component",
          "target": "@components/oft/gauge/gauge.tsx"
        },
        {
          "path": "registry/oft/gauge/gauge.module.css",
          "type": "registry:component",
          "target": "@components/oft/gauge/gauge.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart"
        ]
      }
    },
    {
      "name": "animated-counter",
      "type": "registry:ui",
      "title": "Animated counter",
      "description": "Give changing totals a clear sense of movement.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/animated-counter/animated-counter.tsx",
          "type": "registry:component",
          "target": "@components/oft/animated-counter/animated-counter.tsx"
        },
        {
          "path": "registry/oft/animated-counter/animated-counter.module.css",
          "type": "registry:component",
          "target": "@components/oft/animated-counter/animated-counter.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "motion"
        ]
      }
    },
    {
      "name": "code-block",
      "type": "registry:ui",
      "title": "Code block",
      "description": "Present code with legible hierarchy and copy access.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/copy-button"
      ],
      "files": [
        {
          "path": "registry/oft/code-block/code-block.tsx",
          "type": "registry:component",
          "target": "@components/oft/code-block/code-block.tsx"
        },
        {
          "path": "registry/oft/code-block/code-block.module.css",
          "type": "registry:component",
          "target": "@components/oft/code-block/code-block.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "content",
          "developer"
        ]
      }
    },
    {
      "name": "text-reveal",
      "type": "registry:ui",
      "title": "Text reveal",
      "description": "Reveal a short piece of content with restrained motion.",
      "categories": [
        "text"
      ],
      "dependencies": [],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/text-reveal/text-reveal.tsx",
          "type": "registry:component",
          "target": "@components/oft/text-reveal/text-reveal.tsx"
        },
        {
          "path": "registry/oft/text-reveal/text-reveal.module.css",
          "type": "registry:component",
          "target": "@components/oft/text-reveal/text-reveal.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "text",
          "motion",
          "content"
        ]
      }
    },
    {
      "name": "in-view-title",
      "type": "registry:ui",
      "title": "In-view title",
      "description": "Bring a section title in as it scrolls into view.",
      "categories": [
        "text"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/in-view-title/in-view-title.tsx",
          "type": "registry:component",
          "target": "@components/oft/in-view-title/in-view-title.tsx"
        },
        {
          "path": "registry/oft/in-view-title/in-view-title.module.css",
          "type": "registry:component",
          "target": "@components/oft/in-view-title/in-view-title.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "text",
          "motion",
          "heading"
        ]
      }
    },
    {
      "name": "text-morph",
      "type": "registry:ui",
      "title": "Text morph",
      "description": "Morph a label into its next state, letter by letter.",
      "categories": [
        "text"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/text-morph/text-morph.tsx",
          "type": "registry:component",
          "target": "@components/oft/text-morph/text-morph.tsx"
        },
        {
          "path": "registry/oft/text-morph/text-morph.module.css",
          "type": "registry:component",
          "target": "@components/oft/text-morph/text-morph.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "text",
          "motion",
          "status"
        ]
      }
    },
    {
      "name": "text-shimmer",
      "type": "registry:ui",
      "title": "Text shimmer",
      "description": "Show ongoing work with a calm light across the words.",
      "categories": [
        "text"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/text-shimmer/text-shimmer.tsx",
          "type": "registry:component",
          "target": "@components/oft/text-shimmer/text-shimmer.tsx"
        },
        {
          "path": "registry/oft/text-shimmer/text-shimmer.module.css",
          "type": "registry:component",
          "target": "@components/oft/text-shimmer/text-shimmer.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "text",
          "motion",
          "loading"
        ]
      }
    },
    {
      "name": "hold-to-confirm",
      "type": "registry:ui",
      "title": "Hold to confirm",
      "description": "Confirm a destructive action by holding, not tapping.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/hold-to-confirm/hold-to-confirm.tsx",
          "type": "registry:component",
          "target": "@components/oft/hold-to-confirm/hold-to-confirm.tsx"
        },
        {
          "path": "registry/oft/hold-to-confirm/hold-to-confirm.module.css",
          "type": "registry:component",
          "target": "@components/oft/hold-to-confirm/hold-to-confirm.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "hold",
          "long press",
          "confirm"
        ]
      }
    },
    {
      "name": "swipe-actions",
      "type": "registry:ui",
      "title": "Swipe actions",
      "description": "Reveal row actions with a swipe, or from the same actions in a menu.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/swipe-actions/swipe-actions.tsx",
          "type": "registry:component",
          "target": "@components/oft/swipe-actions/swipe-actions.tsx"
        },
        {
          "path": "registry/oft/swipe-actions/swipe-actions.module.css",
          "type": "registry:component",
          "target": "@components/oft/swipe-actions/swipe-actions.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "swipe",
          "gesture",
          "list"
        ]
      }
    },
    {
      "name": "slider",
      "type": "registry:ui",
      "title": "Slider",
      "description": "Pick a value or a range on a track that follows your finger.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/slider/slider.tsx",
          "type": "registry:component",
          "target": "@components/oft/slider/slider.tsx"
        },
        {
          "path": "registry/oft/slider/slider.module.css",
          "type": "registry:component",
          "target": "@components/oft/slider/slider.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "slider",
          "range",
          "input"
        ]
      }
    },
    {
      "name": "elastic-slider",
      "type": "registry:ui",
      "title": "Elastic slider",
      "description": "A slider that stretches like rubber past its ends, with a swaying value tag and detents the thumb clicks into.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/elastic-slider/elastic-slider.tsx",
          "type": "registry:component",
          "target": "@components/oft/elastic-slider/elastic-slider.tsx"
        },
        {
          "path": "registry/oft/elastic-slider/elastic-slider.module.css",
          "type": "registry:component",
          "target": "@components/oft/elastic-slider/elastic-slider.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "inline-edit",
      "type": "registry:ui",
      "title": "Inline edit",
      "description": "Rename in place: the text becomes a field without moving.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/inline-edit/inline-edit.tsx",
          "type": "registry:component",
          "target": "@components/oft/inline-edit/inline-edit.tsx"
        },
        {
          "path": "registry/oft/inline-edit/inline-edit.module.css",
          "type": "registry:component",
          "target": "@components/oft/inline-edit/inline-edit.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inline edit",
          "rename",
          "click to edit"
        ]
      }
    },
    {
      "name": "expanding-search",
      "type": "registry:ui",
      "title": "Expanding search",
      "description": "An icon that morphs into a search field with results beneath it.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/expanding-search/expanding-search.tsx",
          "type": "registry:component",
          "target": "@components/oft/expanding-search/expanding-search.tsx"
        },
        {
          "path": "registry/oft/expanding-search/expanding-search.module.css",
          "type": "registry:component",
          "target": "@components/oft/expanding-search/expanding-search.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "search",
          "field",
          "motion"
        ]
      }
    },
    {
      "name": "chip-group",
      "type": "registry:ui",
      "title": "Chip group",
      "description": "Filter by a few facets with chips that morph as you pick them.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/chip-group/chip-group.tsx",
          "type": "registry:component",
          "target": "@components/oft/chip-group/chip-group.tsx"
        },
        {
          "path": "registry/oft/chip-group/chip-group.module.css",
          "type": "registry:component",
          "target": "@components/oft/chip-group/chip-group.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "chips",
          "filter",
          "toggle"
        ]
      }
    },
    {
      "name": "password-strength",
      "type": "registry:ui",
      "title": "Password strength",
      "description": "Show how strong a new password is while it is typed.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/password-strength/password-strength.tsx",
          "type": "registry:component",
          "target": "@components/oft/password-strength/password-strength.tsx"
        },
        {
          "path": "registry/oft/password-strength/password-strength.module.css",
          "type": "registry:component",
          "target": "@components/oft/password-strength/password-strength.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "password",
          "strength meter",
          "validation"
        ]
      }
    },
    {
      "name": "bottom-sheet",
      "type": "registry:ui",
      "title": "Bottom sheet",
      "description": "A sheet that rests at a peek or full height and follows your finger.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-dialog",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/bottom-sheet/bottom-sheet.tsx",
          "type": "registry:component",
          "target": "@components/oft/bottom-sheet/bottom-sheet.tsx"
        },
        {
          "path": "registry/oft/bottom-sheet/bottom-sheet.module.css",
          "type": "registry:component",
          "target": "@components/oft/bottom-sheet/bottom-sheet.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "overlay",
          "gesture",
          "motion"
        ]
      }
    },
    {
      "name": "hover-card",
      "type": "registry:ui",
      "title": "Hover card",
      "description": "Preview a person or link on hover or focus without leaving the page.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "@radix-ui/react-popover",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/hover-card/hover-card.tsx",
          "type": "registry:component",
          "target": "@components/oft/hover-card/hover-card.tsx"
        },
        {
          "path": "registry/oft/hover-card/hover-card.module.css",
          "type": "registry:component",
          "target": "@components/oft/hover-card/hover-card.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "preview",
          "people",
          "popover"
        ]
      }
    },
    {
      "name": "resizable-panels",
      "type": "registry:ui",
      "title": "Resizable panels",
      "description": "Trade space between panes by dragging the divider between them.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/resizable-panels/resizable-panels.tsx",
          "type": "registry:component",
          "target": "@components/oft/resizable-panels/resizable-panels.tsx"
        },
        {
          "path": "registry/oft/resizable-panels/resizable-panels.module.css",
          "type": "registry:component",
          "target": "@components/oft/resizable-panels/resizable-panels.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "split view",
          "resizable",
          "panes"
        ]
      }
    },
    {
      "name": "toast-stack",
      "type": "registry:ui",
      "title": "Toast stack",
      "description": "Stack short results at the edge until you reach for them.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/toast-stack/toast-stack.tsx",
          "type": "registry:component",
          "target": "@components/oft/toast-stack/toast-stack.tsx"
        },
        {
          "path": "registry/oft/toast-stack/toast-stack.module.css",
          "type": "registry:component",
          "target": "@components/oft/toast-stack/toast-stack.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "toast",
          "notification",
          "sonner"
        ]
      }
    },
    {
      "name": "usage-meter",
      "type": "registry:ui",
      "title": "Usage meter",
      "description": "Show what fills an allowance and how close it is to the limit.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/usage-meter/usage-meter.tsx",
          "type": "registry:component",
          "target": "@components/oft/usage-meter/usage-meter.tsx"
        },
        {
          "path": "registry/oft/usage-meter/usage-meter.module.css",
          "type": "registry:component",
          "target": "@components/oft/usage-meter/usage-meter.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "meter",
          "usage",
          "storage"
        ]
      }
    },
    {
      "name": "image-compare",
      "type": "registry:ui",
      "title": "Image compare",
      "description": "Drag a divider across two images to see what changed.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/image-compare/image-compare.tsx",
          "type": "registry:component",
          "target": "@components/oft/image-compare/image-compare.tsx"
        },
        {
          "path": "registry/oft/image-compare/image-compare.module.css",
          "type": "registry:component",
          "target": "@components/oft/image-compare/image-compare.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "before after",
          "comparison",
          "image"
        ]
      }
    },
    {
      "name": "carousel",
      "type": "registry:ui",
      "title": "Carousel",
      "description": "Browse a row of slides by dragging, flicking, or arrowing through them.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/carousel/carousel.tsx",
          "type": "registry:component",
          "target": "@components/oft/carousel/carousel.tsx"
        },
        {
          "path": "registry/oft/carousel/carousel.module.css",
          "type": "registry:component",
          "target": "@components/oft/carousel/carousel.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "carousel",
          "slider",
          "gallery"
        ]
      }
    },
    {
      "name": "card-stack",
      "type": "registry:ui",
      "title": "Card stack",
      "description": "Review a deck one card at a time, with a throw and an undo.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/card-stack/card-stack.tsx",
          "type": "registry:component",
          "target": "@components/oft/card-stack/card-stack.tsx"
        },
        {
          "path": "registry/oft/card-stack/card-stack.module.css",
          "type": "registry:component",
          "target": "@components/oft/card-stack/card-stack.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "gesture",
          "motion",
          "triage"
        ]
      }
    },
    {
      "name": "bar-chart",
      "type": "registry:ui",
      "title": "Bar chart",
      "description": "Compare one measure across days and scrub any bar for its value.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/bar-chart/bar-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/bar-chart/bar-chart.tsx"
        },
        {
          "path": "registry/oft/bar-chart/bar-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/bar-chart/bar-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "chart",
          "bar",
          "data"
        ]
      }
    },
    {
      "name": "activity-heatmap",
      "type": "registry:ui",
      "title": "Activity heatmap",
      "description": "See a year of activity at a glance, one square per day.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/activity-heatmap/activity-heatmap.tsx",
          "type": "registry:component",
          "target": "@components/oft/activity-heatmap/activity-heatmap.tsx"
        },
        {
          "path": "registry/oft/activity-heatmap/activity-heatmap.module.css",
          "type": "registry:component",
          "target": "@components/oft/activity-heatmap/activity-heatmap.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "calendar"
        ]
      }
    },
    {
      "name": "timeline",
      "type": "registry:ui",
      "title": "Timeline",
      "description": "Follow what happened, newest first, grouped by day.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/timeline/timeline.tsx",
          "type": "registry:component",
          "target": "@components/oft/timeline/timeline.tsx"
        },
        {
          "path": "registry/oft/timeline/timeline.module.css",
          "type": "registry:component",
          "target": "@components/oft/timeline/timeline.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "feed",
          "activity"
        ]
      }
    },
    {
      "name": "user-menu",
      "type": "registry:ui",
      "title": "User menu",
      "description": "Your account, settings, theme, and sign out behind the avatar. Opens as a bottom sheet on phones.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/user-menu/user-menu.tsx",
          "type": "registry:component",
          "target": "@components/oft/user-menu/user-menu.tsx"
        },
        {
          "path": "registry/oft/user-menu/user-menu.module.css",
          "type": "registry:component",
          "target": "@components/oft/user-menu/user-menu.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "motion",
          "product"
        ]
      }
    },
    {
      "name": "stepper",
      "type": "registry:ui",
      "title": "Stepper",
      "description": "Show where a person is in a multi-step flow and what is done.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/stepper/stepper.tsx",
          "type": "registry:component",
          "target": "@components/oft/stepper/stepper.tsx"
        },
        {
          "path": "registry/oft/stepper/stepper.module.css",
          "type": "registry:component",
          "target": "@components/oft/stepper/stepper.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "motion",
          "product"
        ]
      }
    },
    {
      "name": "signature-pad",
      "type": "registry:ui",
      "title": "Signature pad",
      "description": "Smooth ink that thins with speed, with undo, replay, and PNG or SVG export.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/signature-pad/signature-pad.tsx",
          "type": "registry:component",
          "target": "@components/oft/signature-pad/signature-pad.tsx"
        },
        {
          "path": "registry/oft/signature-pad/signature-pad.module.css",
          "type": "registry:component",
          "target": "@components/oft/signature-pad/signature-pad.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "icon-morph",
      "type": "registry:ui",
      "title": "Icon morph",
      "description": "Icons that morph between states: menu to close, play to pause, copy to check, and more.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/icon-morph/icon-morph.tsx",
          "type": "registry:component",
          "target": "@components/oft/icon-morph/icon-morph.tsx"
        },
        {
          "path": "registry/oft/icon-morph/icon-morph.module.css",
          "type": "registry:component",
          "target": "@components/oft/icon-morph/icon-morph.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "actions",
          "new"
        ]
      }
    },
    {
      "name": "date-range-picker",
      "type": "registry:ui",
      "title": "Date range picker",
      "description": "A range picker that grows from its trigger into two months with presets and a stretching range highlight.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/date-range-picker/date-range-picker.tsx",
          "type": "registry:component",
          "target": "@components/oft/date-range-picker/date-range-picker.tsx"
        },
        {
          "path": "registry/oft/lib/use-today.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/use-today.ts"
        },
        {
          "path": "registry/oft/date-range-picker/date-range-picker.module.css",
          "type": "registry:component",
          "target": "@components/oft/date-range-picker/date-range-picker.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "color-picker",
      "type": "registry:ui",
      "title": "Color picker",
      "description": "A swatch that grows into a picker with format morphing, eyedropper, saved swatches, and contrast readout.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/text-morph"
      ],
      "files": [
        {
          "path": "registry/oft/color-picker/color-picker.tsx",
          "type": "registry:component",
          "target": "@components/oft/color-picker/color-picker.tsx"
        },
        {
          "path": "registry/oft/color-picker/color-picker.module.css",
          "type": "registry:component",
          "target": "@components/oft/color-picker/color-picker.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "morph-select",
      "type": "registry:ui",
      "title": "Morph select",
      "description": "A select whose trigger grows into the list, with a gliding highlight and type-ahead.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/morph-select/morph-select.tsx",
          "type": "registry:component",
          "target": "@components/oft/morph-select/morph-select.tsx"
        },
        {
          "path": "registry/oft/morph-select/morph-select.module.css",
          "type": "registry:component",
          "target": "@components/oft/morph-select/morph-select.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "line-chart",
      "type": "registry:ui",
      "title": "Line chart",
      "description": "A multi-series line chart with a gliding crosshair, legend toggles, and paths that morph between ranges.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/line-chart/line-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/line-chart/line-chart.tsx"
        },
        {
          "path": "registry/oft/line-chart/line-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/line-chart/line-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "new"
        ]
      }
    },
    {
      "name": "donut-chart",
      "type": "registry:ui",
      "title": "Donut chart",
      "description": "A donut whose arcs morph between datasets, with the active value rolling into the center.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/donut-chart/donut-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/donut-chart/donut-chart.tsx"
        },
        {
          "path": "registry/oft/donut-chart/donut-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/donut-chart/donut-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "new"
        ]
      }
    },
    {
      "name": "streamgraph",
      "type": "registry:ui",
      "title": "Streamgraph",
      "description": "Layered streams on a wiggle baseline that morph between ranges, with a layer you can isolate and read week by week.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/streamgraph/streamgraph.tsx",
          "type": "registry:component",
          "target": "@components/oft/streamgraph/streamgraph.tsx"
        },
        {
          "path": "registry/oft/streamgraph/streamgraph.module.css",
          "type": "registry:component",
          "target": "@components/oft/streamgraph/streamgraph.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "brush-chart",
      "type": "registry:ui",
      "title": "Brush chart",
      "description": "A dense time series with an overview strip: drag a window to zoom, resize it by its handles, and read events in place.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/brush-chart/brush-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/brush-chart/brush-chart.tsx"
        },
        {
          "path": "registry/oft/brush-chart/brush-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/brush-chart/brush-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "ridgeline",
      "type": "registry:ui",
      "title": "Ridgeline",
      "description": "Overlapping distributions, one ridge per group: hover to lift a ridge and read its quartiles, switch datasets and every curve morphs.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/ridgeline/ridgeline.tsx",
          "type": "registry:component",
          "target": "@components/oft/ridgeline/ridgeline.tsx"
        },
        {
          "path": "registry/oft/ridgeline/ridgeline.module.css",
          "type": "registry:component",
          "target": "@components/oft/ridgeline/ridgeline.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "treemap",
      "type": "registry:ui",
      "title": "Treemap",
      "description": "A squarified treemap: click to drill and the tiles grow to fill the view, with a breadcrumb back and metrics that morph every tile.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/treemap/treemap.tsx",
          "type": "registry:component",
          "target": "@components/oft/treemap/treemap.tsx"
        },
        {
          "path": "registry/oft/treemap/treemap.module.css",
          "type": "registry:component",
          "target": "@components/oft/treemap/treemap.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "waffle-chart",
      "type": "registry:ui",
      "title": "Waffle chart",
      "description": "A ten by ten unit chart where every cell is one percent, and cells fly to their new group when the data changes.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/waffle-chart/waffle-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/waffle-chart/waffle-chart.tsx"
        },
        {
          "path": "registry/oft/waffle-chart/waffle-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/waffle-chart/waffle-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "slope-chart",
      "type": "registry:ui",
      "title": "Slope chart",
      "description": "Before and after on two axes: lines draw in, rank moves sit beside each value, and switching datasets slides every line to its new slope.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/slope-chart/slope-chart.tsx",
          "type": "registry:component",
          "target": "@components/oft/slope-chart/slope-chart.tsx"
        },
        {
          "path": "registry/oft/slope-chart/slope-chart.module.css",
          "type": "registry:component",
          "target": "@components/oft/slope-chart/slope-chart.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "chart",
          "new"
        ]
      }
    },
    {
      "name": "countdown",
      "type": "registry:ui",
      "title": "Countdown",
      "description": "A launch countdown with rolling digits that morphs into a live state at zero.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/countdown/countdown.tsx",
          "type": "registry:component",
          "target": "@components/oft/countdown/countdown.tsx"
        },
        {
          "path": "registry/oft/countdown/countdown.module.css",
          "type": "registry:component",
          "target": "@components/oft/countdown/countdown.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "feedback",
          "new"
        ]
      }
    },
    {
      "name": "cookie-consent",
      "type": "registry:ui",
      "title": "Cookie consent",
      "description": "A consent bar that morphs into preferences and folds into a reopen button.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/switch"
      ],
      "files": [
        {
          "path": "registry/oft/cookie-consent/cookie-consent.tsx",
          "type": "registry:component",
          "target": "@components/oft/cookie-consent/cookie-consent.tsx"
        },
        {
          "path": "registry/oft/cookie-consent/cookie-consent.module.css",
          "type": "registry:component",
          "target": "@components/oft/cookie-consent/cookie-consent.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "feedback",
          "new"
        ]
      }
    },
    {
      "name": "announcement-bar",
      "type": "registry:ui",
      "title": "Announcement bar",
      "description": "A top banner that rotates messages, counts down, and collapses smoothly when dismissed.",
      "categories": [
        "feedback"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/announcement-bar/announcement-bar.tsx",
          "type": "registry:component",
          "target": "@components/oft/announcement-bar/announcement-bar.tsx"
        },
        {
          "path": "registry/oft/announcement-bar/announcement-bar.module.css",
          "type": "registry:component",
          "target": "@components/oft/announcement-bar/announcement-bar.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "feedback",
          "new"
        ]
      }
    },
    {
      "name": "json-viewer",
      "type": "registry:ui",
      "title": "JSON viewer",
      "description": "A collapsible JSON tree with search, paging for long arrays, and copy value or path.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/json-viewer/json-viewer.tsx",
          "type": "registry:component",
          "target": "@components/oft/json-viewer/json-viewer.tsx"
        },
        {
          "path": "registry/oft/json-viewer/json-viewer.module.css",
          "type": "registry:component",
          "target": "@components/oft/json-viewer/json-viewer.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "new"
        ]
      }
    },
    {
      "name": "phone-input",
      "type": "registry:ui",
      "title": "Phone input",
      "description": "A phone field with a country picker, formatting as you type, and E.164 output.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/phone-input/phone-input.tsx",
          "type": "registry:component",
          "target": "@components/oft/phone-input/phone-input.tsx"
        },
        {
          "path": "registry/oft/phone-input/phone-input.module.css",
          "type": "registry:component",
          "target": "@components/oft/phone-input/phone-input.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "money-input",
      "type": "registry:ui",
      "title": "Money input",
      "description": "A currency field with live grouping, stable width, rolling digits, and minor-unit output.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/money-input/money-input.tsx",
          "type": "registry:component",
          "target": "@components/oft/money-input/money-input.tsx"
        },
        {
          "path": "registry/oft/money-input/money-input.module.css",
          "type": "registry:component",
          "target": "@components/oft/money-input/money-input.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "shortcut-recorder",
      "type": "registry:ui",
      "title": "Shortcut recorder",
      "description": "Record key combinations into key caps, with conflict warnings, Kbd, and a searchable cheatsheet.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/shortcut-recorder/shortcut-recorder.tsx",
          "type": "registry:component",
          "target": "@components/oft/shortcut-recorder/shortcut-recorder.tsx"
        },
        {
          "path": "registry/oft/shortcut-recorder/shortcut-recorder.module.css",
          "type": "registry:component",
          "target": "@components/oft/shortcut-recorder/shortcut-recorder.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "confirm-morph",
      "type": "registry:ui",
      "title": "Confirm morph",
      "description": "A destructive button that morphs into an inline confirmation, a spinner, and a result with undo.",
      "categories": [
        "actions"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/confirm-morph/confirm-morph.tsx",
          "type": "registry:component",
          "target": "@components/oft/confirm-morph/confirm-morph.tsx"
        },
        {
          "path": "registry/oft/confirm-morph/confirm-morph.module.css",
          "type": "registry:component",
          "target": "@components/oft/confirm-morph/confirm-morph.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "actions",
          "new"
        ]
      }
    },
    {
      "name": "mention-input",
      "type": "registry:ui",
      "title": "Mention input",
      "description": "A textarea with @people and #channel mentions that act as single tokens, with suggestions at the caret.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/mention-input/mention-input.tsx",
          "type": "registry:component",
          "target": "@components/oft/mention-input/mention-input.tsx"
        },
        {
          "path": "registry/oft/mention-input/mention-input.module.css",
          "type": "registry:component",
          "target": "@components/oft/mention-input/mention-input.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "chat-thread",
      "type": "registry:ui",
      "title": "Chat thread",
      "description": "A chat thread with grouped messages, reactions, read receipts, typing, and a composer with attachments.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/chat-thread/chat-thread.tsx",
          "type": "registry:component",
          "target": "@components/oft/chat-thread/chat-thread.tsx"
        },
        {
          "path": "registry/oft/chat-thread/chat-thread.module.css",
          "type": "registry:component",
          "target": "@components/oft/chat-thread/chat-thread.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "new"
        ]
      }
    },
    {
      "name": "rich-text-editor",
      "type": "registry:ui",
      "title": "Rich text editor",
      "description": "A lightweight editor with markdown shortcuts, a floating toolbar, a slash menu, and HTML and markdown output.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/rich-text-editor/rich-text-editor.tsx",
          "type": "registry:component",
          "target": "@components/oft/rich-text-editor/rich-text-editor.tsx"
        },
        {
          "path": "registry/oft/rich-text-editor/rich-text-editor.module.css",
          "type": "registry:component",
          "target": "@components/oft/rich-text-editor/rich-text-editor.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "billing-toggle",
      "type": "registry:ui",
      "title": "Billing toggle",
      "description": "A monthly and yearly switch with a savings badge and prices that roll to the new amount.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/animated-counter"
      ],
      "files": [
        {
          "path": "registry/oft/billing-toggle/billing-toggle.tsx",
          "type": "registry:component",
          "target": "@components/oft/billing-toggle/billing-toggle.tsx"
        },
        {
          "path": "registry/oft/billing-toggle/billing-toggle.module.css",
          "type": "registry:component",
          "target": "@components/oft/billing-toggle/billing-toggle.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "scroll-area",
      "type": "registry:ui",
      "title": "Scroll area",
      "description": "A native scroll container with thin overlay scrollbars and edge fades that appear only when content overflows.",
      "categories": [
        "disclosure"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "registry/oft/scroll-area/scroll-area.tsx",
          "type": "registry:component",
          "target": "@components/oft/scroll-area/scroll-area.tsx"
        },
        {
          "path": "registry/oft/scroll-area/scroll-area.module.css",
          "type": "registry:component",
          "target": "@components/oft/scroll-area/scroll-area.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "disclosure",
          "new"
        ]
      }
    },
    {
      "name": "radio-cards",
      "type": "registry:ui",
      "title": "Radio cards",
      "description": "Selectable option cards with a sliding selection ring, price and description slots, and radio keyboard behavior.",
      "categories": [
        "inputs"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/radio-cards/radio-cards.tsx",
          "type": "registry:component",
          "target": "@components/oft/radio-cards/radio-cards.tsx"
        },
        {
          "path": "registry/oft/radio-cards/radio-cards.module.css",
          "type": "registry:component",
          "target": "@components/oft/radio-cards/radio-cards.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "inputs",
          "new"
        ]
      }
    },
    {
      "name": "comment-thread",
      "type": "registry:ui",
      "title": "Comment thread",
      "description": "Threaded comments with replies, reactions, mentions, inline edit, and resolve.",
      "categories": [
        "data"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/comment-thread/comment-thread.tsx",
          "type": "registry:component",
          "target": "@components/oft/comment-thread/comment-thread.tsx"
        },
        {
          "path": "registry/oft/comment-thread/comment-thread.module.css",
          "type": "registry:component",
          "target": "@components/oft/comment-thread/comment-thread.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "data",
          "new"
        ]
      }
    },
    {
      "name": "slot-text",
      "type": "registry:ui",
      "title": "Slot text",
      "description": "Text and numbers that spin into their new value on staggered slot machine reels.",
      "categories": [
        "special"
      ],
      "dependencies": [
        "motion"
      ],
      "files": [
        {
          "path": "registry/oft/slot-text/slot-text.tsx",
          "type": "registry:component",
          "target": "@components/oft/slot-text/slot-text.tsx"
        },
        {
          "path": "registry/oft/slot-text/slot-text.module.css",
          "type": "registry:component",
          "target": "@components/oft/slot-text/slot-text.module.css"
        }
      ],
      "meta": {
        "kind": "component",
        "tags": [
          "special",
          "text",
          "numbers",
          "new"
        ]
      }
    },
    {
      "name": "signup-form",
      "type": "registry:block",
      "title": "Sign up form",
      "description": "An account creation flow with field validation, password strength, and a clear completion state.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/checkbox",
        "@provins/input",
        "@provins/password-field"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/signup-form/signup-form.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/signup-form/signup-form.tsx"
        },
        {
          "path": "registry/oft/blocks/signup-form/signup-form.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/signup-form/signup-form.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Input",
          "Password field",
          "Checkbox",
          "Button"
        ]
      }
    },
    {
      "name": "logo-marquee",
      "type": "registry:block",
      "title": "Logo marquee",
      "description": "A quiet, continuously moving row of brand marks with a pause control.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/logo-marquee/logo-marquee.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/logo-marquee/logo-marquee.tsx"
        },
        {
          "path": "registry/oft/blocks/logo-marquee/logo-marquee.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/logo-marquee/logo-marquee.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Motion",
          "Button",
          "Brand marks"
        ]
      }
    },
    {
      "name": "plan-comparison",
      "type": "registry:block",
      "title": "Plan comparison",
      "description": "Compare meaningful differences between plans and billing periods.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/segmented-control",
        "@provins/switch"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/plan-comparison/plan-comparison.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/plan-comparison/plan-comparison.tsx"
        },
        {
          "path": "registry/oft/blocks/plan-comparison/plan-comparison.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/plan-comparison/plan-comparison.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Segmented control",
          "Button",
          "Motion"
        ]
      }
    },
    {
      "name": "command-palette",
      "type": "registry:block",
      "title": "Command palette",
      "description": "A complete keyboard driven action surface with search, grouped results, and shortcuts.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/command-palette/command-palette.tsx",
          "type": "registry:component",
          "target": "@components/oft/command-palette/command-palette.tsx"
        },
        {
          "path": "registry/oft/command-palette/command-palette.module.css",
          "type": "registry:component",
          "target": "@components/oft/command-palette/command-palette.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Search",
          "Keyboard navigation",
          "Action list"
        ]
      }
    },
    {
      "name": "notification-center",
      "type": "registry:block",
      "title": "Notification center",
      "description": "A home for updates with read state, grouped information, and animated disclosure.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "@radix-ui/react-popover",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/avatar"
      ],
      "files": [
        {
          "path": "registry/oft/notification-center/notification-center.tsx",
          "type": "registry:component",
          "target": "@components/oft/notification-center/notification-center.tsx"
        },
        {
          "path": "registry/oft/notification-center/notification-center.module.css",
          "type": "registry:component",
          "target": "@components/oft/notification-center/notification-center.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Popover",
          "Badge",
          "Action list"
        ]
      }
    },
    {
      "name": "file-upload",
      "type": "registry:block",
      "title": "File upload",
      "description": "A complete file selection flow with constraints, progress, and error feedback.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/file-upload/file-upload.tsx",
          "type": "registry:component",
          "target": "@components/oft/file-upload/file-upload.tsx"
        },
        {
          "path": "registry/oft/file-upload/file-upload.module.css",
          "type": "registry:component",
          "target": "@components/oft/file-upload/file-upload.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "File picker",
          "Progress",
          "Feedback"
        ]
      }
    },
    {
      "name": "otp-input",
      "type": "registry:block",
      "title": "OTP input",
      "description": "A six digit verification flow with paste support and keyboard navigation.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/otp-input/otp-input.tsx",
          "type": "registry:component",
          "target": "@components/oft/otp-input/otp-input.tsx"
        },
        {
          "path": "registry/oft/otp-input/otp-input.module.css",
          "type": "registry:component",
          "target": "@components/oft/otp-input/otp-input.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Input",
          "Keyboard navigation",
          "Validation"
        ]
      }
    },
    {
      "name": "changelog-feed",
      "type": "registry:block",
      "title": "Changelog feed",
      "description": "Release notes you can filter, open in place, and scroll through month by month.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/copy-button"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/changelog-feed/changelog-feed.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/changelog-feed/changelog-feed.tsx"
        },
        {
          "path": "registry/oft/blocks/changelog-feed/changelog-feed.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/changelog-feed/changelog-feed.module.css"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        },
        {
          "path": "registry/oft/lib/oft-provider.tsx",
          "type": "registry:lib",
          "target": "@components/oft/lib/oft-provider.tsx"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Copy button"
        ]
      }
    },
    {
      "name": "sign-in",
      "type": "registry:block",
      "title": "Sign in",
      "description": "A sign in card that morphs from email to a six digit code to your account.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/avatar",
        "@provins/button",
        "@provins/input",
        "@provins/otp-input"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/sign-in/sign-in.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/sign-in/sign-in.tsx"
        },
        {
          "path": "registry/oft/blocks/sign-in/sign-in.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/sign-in/sign-in.module.css"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Input",
          "OTP input",
          "Button",
          "Avatar"
        ]
      }
    },
    {
      "name": "page-header",
      "type": "registry:block",
      "title": "Page header",
      "description": "A project page header that folds into a compact bar as you scroll, with tabs whose counts roll.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "@radix-ui/react-dropdown-menu",
        "@radix-ui/react-tabs",
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/animated-counter",
        "@provins/avatar-group",
        "@provins/avatar",
        "@provins/badge",
        "@provins/button",
        "@provins/progress"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/page-header/page-header.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/page-header/page-header.tsx"
        },
        {
          "path": "registry/oft/blocks/page-header/page-header.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/page-header/page-header.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Button",
          "Badge",
          "Animated counter",
          "Avatar group",
          "Avatar",
          "Progress"
        ]
      }
    },
    {
      "name": "empty-states",
      "type": "registry:block",
      "title": "Empty states",
      "description": "Four empty states in one illustration whose shapes morph between scenes as you switch tabs.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/empty-states/empty-states.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/empty-states/empty-states.tsx"
        },
        {
          "path": "registry/oft/blocks/empty-states/empty-states.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/empty-states/empty-states.module.css"
        },
        {
          "path": "registry/oft/blocks/empty-states/empty-states-art.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/empty-states/empty-states-art.ts"
        }
      ],
      "meta": {
        "kind": "block"
      }
    },
    {
      "name": "login-centered",
      "type": "registry:block",
      "title": "Centered login",
      "description": "A passkey-first login card on a quiet ring backdrop that morphs through email and code.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/input",
        "@provins/otp-input"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/login-centered/login-centered.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/login-centered/login-centered.tsx"
        },
        {
          "path": "registry/oft/blocks/login-centered/login-centered.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/login-centered/login-centered.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Button",
          "Input",
          "OTP input"
        ]
      }
    },
    {
      "name": "site-header",
      "type": "registry:block",
      "title": "Site header",
      "description": "A sticky website header that turns solid on scroll, with a gliding active link, mega menu panels, and a mobile sheet.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/segmented-control"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/site-header/site-header.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/site-header/site-header.tsx"
        },
        {
          "path": "registry/oft/blocks/site-header/site-header.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/site-header/site-header.module.css"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        },
        {
          "path": "registry/oft/lib/oft-provider.tsx",
          "type": "registry:lib",
          "target": "@components/oft/lib/oft-provider.tsx"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Motion"
        ]
      }
    },
    {
      "name": "site-footer",
      "type": "registry:block",
      "title": "Site footer",
      "description": "A website footer with link columns and newsletter, a minimal layout, and a large fading brand mark.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/segmented-control"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/site-footer/site-footer.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/site-footer/site-footer.tsx"
        },
        {
          "path": "registry/oft/blocks/site-footer/site-footer.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/site-footer/site-footer.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Motion"
        ]
      }
    },
    {
      "name": "hero-section",
      "type": "registry:block",
      "title": "Hero section",
      "description": "Three full screen SaaS heroes: a live dashboard rising from the bottom edge over a drifting mesh, a workflow graph that routes sample events node by node, and editorial type over a mesh gradient.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/avatar",
        "@provins/button",
        "@provins/copy-button",
        "@provins/line-chart",
        "@provins/segmented-control",
        "@provins/sparkline"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/hero-section/hero-section.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-section.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-section.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-section.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-content.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-content.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-content.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-content.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-motion.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-motion.ts"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-mesh.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-mesh.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-mesh.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-mesh.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-cadence.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-cadence.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-cadence.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-cadence.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-relay.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-relay.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-relay.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-relay.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-lumen.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-lumen.tsx"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-lumen.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-lumen.module.css"
        },
        {
          "path": "registry/oft/blocks/hero-section/hero-lumen-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/hero-section/hero-lumen-data.ts"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Button",
          "Line chart",
          "Sparkline",
          "Segmented control",
          "Avatar",
          "Gradient mesh"
        ]
      }
    },
    {
      "name": "faq-section",
      "type": "registry:block",
      "title": "FAQ section",
      "description": "FAQs as an accordion, a topic rail, or a searchable list that highlights matches.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/search-field",
        "@provins/segmented-control"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/faq-section/faq-section.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/faq-section/faq-section.tsx"
        },
        {
          "path": "registry/oft/blocks/faq-section/faq-section.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/faq-section/faq-section.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Motion"
        ]
      }
    },
    {
      "name": "contact-section",
      "type": "registry:block",
      "title": "Contact section",
      "description": "A validated contact form that morphs into a confirmation, support channels, and office cards with local times.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/avatar",
        "@provins/button",
        "@provins/copy-button",
        "@provins/input",
        "@provins/segmented-control",
        "@provins/textarea"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/contact-section/contact-section.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/contact-section/contact-section.tsx"
        },
        {
          "path": "registry/oft/blocks/contact-section/contact-section.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/contact-section/contact-section.module.css"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Motion"
        ]
      }
    },
    {
      "name": "blog-grid",
      "type": "registry:block",
      "title": "Blog grid",
      "description": "A blog index with a featured post, category filter, post cards, pagination and an in-place reader.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/blog-grid/blog-grid.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/blog-grid/blog-grid.tsx"
        },
        {
          "path": "registry/oft/blocks/blog-grid/blog-grid-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/blog-grid/blog-grid-data.ts"
        },
        {
          "path": "registry/oft/blocks/blog-grid/blog-grid.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/blog-grid/blog-grid.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Avatar",
          "Pagination"
        ]
      }
    },
    {
      "name": "comparison-table",
      "type": "registry:block",
      "title": "Comparison table",
      "description": "An us versus them table with a sticky header, a highlighted column, and a stacked phone view.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/comparison-table/comparison-table.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/comparison-table/comparison-table.tsx"
        },
        {
          "path": "registry/oft/blocks/comparison-table/comparison-table-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/comparison-table/comparison-table-data.ts"
        },
        {
          "path": "registry/oft/blocks/comparison-table/comparison-table.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/comparison-table/comparison-table.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Switch",
          "Button"
        ]
      }
    },
    {
      "name": "stats-band",
      "type": "registry:block",
      "title": "Stats band",
      "description": "Headline numbers that count up in view, each with a tiny visual that proves it and a context line on hover, plain or in a hairline grid.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/segmented-control"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/stats-band/stats-band.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/stats-band/stats-band.tsx"
        },
        {
          "path": "registry/oft/blocks/stats-band/stats-band-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/stats-band/stats-band-data.ts"
        },
        {
          "path": "registry/oft/blocks/stats-band/stats-band.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/stats-band/stats-band.module.css"
        },
        {
          "path": "registry/oft/blocks/stats-band/stats-band-world.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/stats-band/stats-band-world.ts"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Segmented control"
        ]
      }
    },
    {
      "name": "cta-section",
      "type": "registry:block",
      "title": "CTA section",
      "description": "A call to action as a centered closing section, a split beside a setup card that completes itself, or a dismissible banner.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/button",
        "@provins/segmented-control"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/cta-section/cta-section.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/cta-section/cta-section.tsx"
        },
        {
          "path": "registry/oft/blocks/cta-section/cta-section-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/cta-section/cta-section-data.ts"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        },
        {
          "path": "registry/oft/blocks/cta-section/cta-section.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/cta-section/cta-section.module.css"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Button",
          "Segmented control"
        ]
      }
    },
    {
      "name": "newsletter-signup",
      "type": "registry:block",
      "title": "Newsletter signup",
      "description": "An email signup framed by a stack of past issues; subscribing drops the next issue, addressed to you, onto the front.",
      "categories": [
        "blocks"
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "@provins/oft-motion-tokens",
        "@provins/animated-counter",
        "@provins/segmented-control",
        "@provins/switch"
      ],
      "files": [
        {
          "path": "registry/oft/blocks/newsletter-signup/newsletter-signup.tsx",
          "type": "registry:component",
          "target": "@components/oft/blocks/newsletter-signup/newsletter-signup.tsx"
        },
        {
          "path": "registry/oft/blocks/newsletter-signup/newsletter-signup-data.ts",
          "type": "registry:component",
          "target": "@components/oft/blocks/newsletter-signup/newsletter-signup-data.ts"
        },
        {
          "path": "registry/oft/lib/media.ts",
          "type": "registry:lib",
          "target": "@components/oft/lib/media.ts"
        },
        {
          "path": "registry/oft/blocks/newsletter-signup/newsletter-signup.module.css",
          "type": "registry:component",
          "target": "@components/oft/blocks/newsletter-signup/newsletter-signup.module.css"
        },
        {
          "path": "registry/oft/lib/oft-provider.tsx",
          "type": "registry:lib",
          "target": "@components/oft/lib/oft-provider.tsx"
        }
      ],
      "meta": {
        "kind": "block",
        "builtFrom": [
          "Segmented control"
        ]
      }
    }
  ]
}
