{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "ridiculous",
  "homepage": "https://ridiculous.turtlesocks.dev",
  "items": [
    {
      "name": "ridiculous-type-kit",
      "type": "registry:lib",
      "title": "Ridiculous Type Kit",
      "description": "Shared template-literal type machinery powering every ridiculous component. Provides char/number primitives, CSS dimension validators (IsLength/IsAngle/IsTime/…), DimensionOf, and paren-aware parser combinators.",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "src/lib/ridiculous-type-kit/index.ts",
          "type": "registry:lib",
          "target": "lib/ridiculous-type-kit/index.ts"
        },
        {
          "path": "src/lib/ridiculous-type-kit/primitives.ts",
          "type": "registry:lib",
          "target": "lib/ridiculous-type-kit/primitives.ts"
        },
        {
          "path": "src/lib/ridiculous-type-kit/dimensions.ts",
          "type": "registry:lib",
          "target": "lib/ridiculous-type-kit/dimensions.ts"
        },
        {
          "path": "src/lib/ridiculous-type-kit/combinators.ts",
          "type": "registry:lib",
          "target": "lib/ridiculous-type-kit/combinators.ts"
        }
      ]
    },
    {
      "name": "color-picker",
      "type": "registry:ui",
      "title": "Color Picker",
      "description": "Ridiculously typed color picker with oklch L×C pad, hue/alpha strips, and 6-mode round-trip (oklch, oklab, hex, rgb, hsl, hwb).",
      "registryDependencies": ["button", "popover"],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/color-picker/index.ts",
          "type": "registry:ui",
          "target": "components/ui/color-picker/index.ts"
        },
        {
          "path": "src/components/ui/color-picker/color-picker.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/color-picker.tsx"
        },
        {
          "path": "src/components/ui/color-picker/color-picker.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/color-picker/color-picker.helpers.ts"
        },
        {
          "path": "src/components/ui/color-picker/color-picker.types.ts",
          "type": "registry:ui",
          "target": "components/ui/color-picker/color-picker.types.ts"
        },
        {
          "path": "src/components/ui/color-picker/color-picker.hooks.ts",
          "type": "registry:ui",
          "target": "components/ui/color-picker/color-picker.hooks.ts"
        },
        {
          "path": "src/components/ui/color-picker/alpha-strip.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/alpha-strip.tsx"
        },
        {
          "path": "src/components/ui/color-picker/color-picker.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/color-picker/color-picker.constants.ts"
        },
        {
          "path": "src/components/ui/color-picker/hue-strip.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/hue-strip.tsx"
        },
        {
          "path": "src/components/ui/color-picker/lc-pad.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/lc-pad.tsx"
        },
        {
          "path": "src/components/ui/color-picker/mode-button-group.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/mode-button-group.tsx"
        },
        {
          "path": "src/components/ui/color-picker/swatch-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-picker/swatch-row.tsx"
        }
      ]
    },
    {
      "name": "unit-input",
      "type": "registry:ui",
      "title": "Unit Input",
      "description": "Ridiculously typed CSS-unit input with built-in deg/%/px/rem/em/vw/vh validators, pointer-locked drag scrubbing, and pluggable custom units.",
      "registryDependencies": ["input"],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/unit-input/index.ts",
          "type": "registry:ui",
          "target": "components/ui/unit-input/index.ts"
        },
        {
          "path": "src/components/ui/unit-input/unit-input.tsx",
          "type": "registry:ui",
          "target": "components/ui/unit-input/unit-input.tsx"
        },
        {
          "path": "src/components/ui/unit-input/unit-input.types.ts",
          "type": "registry:ui",
          "target": "components/ui/unit-input/unit-input.types.ts"
        }
      ]
    },
    {
      "name": "gradient-editor",
      "type": "registry:ui",
      "title": "Gradient Editor",
      "description": "Linear / radial / conic gradient editor with draggable stops, position picker, oklch-default interpolation, and reusable color-picker stops.",
      "registryDependencies": [
        "button",
        "popover",
        "color-picker",
        "unit-input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/gradient-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/gradient-editor/index.ts"
        },
        {
          "path": "src/components/ui/gradient-editor/gradient-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/gradient-editor/gradient-editor.tsx"
        },
        {
          "path": "src/components/ui/gradient-editor/gradient-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/gradient-editor/gradient-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/gradient-editor/gradient-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/gradient-editor/gradient-editor.types.ts"
        }
      ]
    },
    {
      "name": "easing-picker",
      "type": "registry:ui",
      "title": "Easing Picker",
      "description": "Ridiculously typed CSS easing-function picker with a bezier canvas, spring/bounce/wiggle physics baked to linear(), and a polynomial preset gallery. Ships a 6-property animation preview and 3-format output (CSS / Tailwind v3 / v4).",
      "registryDependencies": ["button", "popover"],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/easing-picker/index.ts",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/index.ts"
        },
        {
          "path": "src/components/ui/easing-picker/easing-picker.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/easing-picker.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/easing-picker.types.ts",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/easing-picker.types.ts"
        },
        {
          "path": "src/components/ui/easing-picker/easing-picker.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/easing-picker.constants.ts"
        },
        {
          "path": "src/components/ui/easing-picker/easing-picker.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/easing-picker.helpers.ts"
        },
        {
          "path": "src/components/ui/easing-picker/easing-picker.presets.ts",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/easing-picker.presets.ts"
        },
        {
          "path": "src/components/ui/easing-picker/controls/basis-tabs.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/basis-tabs.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/bezier-canvas.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/bezier-canvas.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/bezier-inputs.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/bezier-inputs.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/physics-controls.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/physics-controls.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/preset-gallery.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/preset-gallery.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/slider-group.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/slider-group.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/controls/steps-controls.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/controls/steps-controls.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/panel/basis-controls.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/panel/basis-controls.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/panel/preview-section.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/panel/preview-section.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/preview/easing-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/preview/easing-preview.tsx"
        },
        {
          "path": "src/components/ui/easing-picker/preview/output-panel.tsx",
          "type": "registry:ui",
          "target": "components/ui/easing-picker/preview/output-panel.tsx"
        }
      ]
    },
    {
      "name": "calc-editor",
      "type": "registry:ui",
      "title": "Calc Editor",
      "description": "Ridiculously typed CSS math editor for calc/clamp/min/max with compile-time dimensional analysis (length±length ✓, length±angle ✗, ÷ by non-number ✗). Ships a full runtime parser/evaluator and a fluid-type clamp() playground.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "button",
        "popover",
        "input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/calc-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/calc-editor/index.ts"
        },
        {
          "path": "src/components/ui/calc-editor/calc-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/calc-editor/calc-editor.tsx"
        },
        {
          "path": "src/components/ui/calc-editor/calc-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/calc-editor/calc-editor.types.ts"
        },
        {
          "path": "src/components/ui/calc-editor/calc-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/calc-editor/calc-editor.helpers.ts"
        }
      ]
    },
    {
      "name": "transform-builder",
      "type": "registry:ui",
      "title": "Transform Builder",
      "description": "Ridiculously typed CSS transform editor — a space-separated function list with compile-time function-name dispatch (per-function arity and per-argument dimension typing: rotate wants an angle, translateX a length-%). Ships a tolerant runtime parser and a live 3D-preview card driven by the typed string.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "button",
        "popover",
        "input",
        "label",
        "slider"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/transform-builder/index.ts",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/index.ts"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.tsx",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.tsx"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.types.ts",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.types.ts"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.helpers.ts"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.arg-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.arg-editor.tsx"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.constants.ts"
        },
        {
          "path": "src/components/ui/transform-builder/transform-builder.preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/transform-builder/transform-builder.preview.tsx"
        }
      ]
    },
    {
      "name": "filter-builder",
      "type": "registry:ui",
      "title": "Filter Builder",
      "description": "Ridiculously typed CSS filter / backdrop-filter editor — a space-separated function list with compile-time per-function arity and dimension typing, plus a drop-shadow color validated against the color-picker ColorLiteral. Ships a tolerant runtime parser and a live preview with a filter ↔ backdrop-filter toggle.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "color-picker",
        "button",
        "popover",
        "input",
        "label",
        "slider"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/filter-builder/index.ts",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/index.ts"
        },
        {
          "path": "src/components/ui/filter-builder/filter-builder.tsx",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-builder.tsx"
        },
        {
          "path": "src/components/ui/filter-builder/filter-builder.types.ts",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-builder.types.ts"
        },
        {
          "path": "src/components/ui/filter-builder/filter-builder.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-builder.helpers.ts"
        },
        {
          "path": "src/components/ui/filter-builder/filter-builder.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-builder.constants.ts"
        },
        {
          "path": "src/components/ui/filter-builder/filter-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-preview.tsx"
        },
        {
          "path": "src/components/ui/filter-builder/filter-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/filter-builder/filter-row.tsx"
        }
      ]
    },
    {
      "name": "grid-builder",
      "type": "registry:ui",
      "title": "Grid Builder",
      "description": "Ridiculously typed CSS grid-template editor for track lists and grid-template-areas across three modes, with TrackListLiteral validating the full track grammar and GridAreasLiteral checking quoting, equal column counts, and cell idents at the type level. Ships a live display:grid preview and a clickable areas painter.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/grid-builder/index.ts",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/index.ts"
        },
        {
          "path": "src/components/ui/grid-builder/grid-builder.tsx",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/grid-builder.tsx"
        },
        {
          "path": "src/components/ui/grid-builder/grid-builder.types.ts",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/grid-builder.types.ts"
        },
        {
          "path": "src/components/ui/grid-builder/grid-builder.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/grid-builder.helpers.ts"
        },
        {
          "path": "src/components/ui/grid-builder/areas-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/areas-editor.tsx"
        },
        {
          "path": "src/components/ui/grid-builder/grid-builder.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/grid-builder.constants.ts"
        },
        {
          "path": "src/components/ui/grid-builder/grid-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/grid-preview.tsx"
        },
        {
          "path": "src/components/ui/grid-builder/track-list-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/grid-builder/track-list-editor.tsx"
        }
      ]
    },
    {
      "name": "clip-path-editor",
      "type": "registry:ui",
      "title": "Clip Path Editor",
      "description": "Ridiculously typed CSS clip-path / shape-outside editor for a single <basic-shape> (inset / circle / ellipse / polygon) with an optional geometry-box keyword, validated by compile-time basic-shape dispatch through ParseFunction. Ships a tolerant runtime parser and a live preview with draggable polygon vertices.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label",
        "select"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/clip-path-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/index.ts"
        },
        {
          "path": "src/components/ui/clip-path-editor/clip-path-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/clip-path-editor.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/clip-path-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/clip-path-editor.types.ts"
        },
        {
          "path": "src/components/ui/clip-path-editor/clip-path-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/clip-path-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/clip-path-editor/clip-path-editor.constants.ts",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/clip-path-editor.constants.ts"
        },
        {
          "path": "src/components/ui/clip-path-editor/clip-path-editor.hooks.ts",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/clip-path-editor.hooks.ts"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/circle.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/circle.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/ellipse.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/ellipse.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/inset.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/inset.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/length-pct.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/length-pct.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/polygon.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/polygon.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/position.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/position.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/radius.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/radius.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/controls/shape-controls.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/controls/shape-controls.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/preview/circle-scrubs.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/preview/circle-scrubs.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/preview/clip-path-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/preview/clip-path-preview.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/primitives/geometry-box-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/primitives/geometry-box-select.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/primitives/labeled-field.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/primitives/labeled-field.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/primitives/live-string.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/primitives/live-string.tsx"
        },
        {
          "path": "src/components/ui/clip-path-editor/primitives/shape-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/clip-path-editor/primitives/shape-select.tsx"
        }
      ]
    },
    {
      "name": "box-shadow-editor",
      "type": "registry:ui",
      "title": "Box Shadow Editor",
      "description": "Ridiculously typed CSS box-shadow editor — a comma-separated list of shadow layers, each validated at compile time (2–4 lengths, at most one inset, an optional trailing color). Ships a live preview with a draggable light source and elevation scrubber.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "color-picker",
        "unit-input",
        "button",
        "popover",
        "input",
        "label",
        "slider"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/box-shadow-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/index.ts"
        },
        {
          "path": "src/components/ui/box-shadow-editor/box-shadow-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/box-shadow-editor.tsx"
        },
        {
          "path": "src/components/ui/box-shadow-editor/box-shadow-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/box-shadow-editor.types.ts"
        },
        {
          "path": "src/components/ui/box-shadow-editor/box-shadow-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/box-shadow-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/box-shadow-editor/box-shadow-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/box-shadow-preview.tsx"
        },
        {
          "path": "src/components/ui/box-shadow-editor/shadow-layer-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/shadow-layer-row.tsx"
        },
        {
          "path": "src/components/ui/box-shadow-editor/shadow-length-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/box-shadow-editor/shadow-length-editor.tsx"
        }
      ]
    },
    {
      "name": "transition-editor",
      "type": "registry:ui",
      "title": "Transition + Animation Editor",
      "description": "Ridiculously typed CSS transition + animation editor (mode prop) — a comma-separated layer list with per-kind token typing and cardinality caps. Live preview that actually animates, with an embedded easing picker and duration scrubber.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "easing-picker",
        "unit-input",
        "button",
        "popover",
        "input",
        "label",
        "select"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/transition-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/index.ts"
        },
        {
          "path": "src/components/ui/transition-editor/transition-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/transition-editor.tsx"
        },
        {
          "path": "src/components/ui/transition-editor/transition-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/transition-editor.types.ts"
        },
        {
          "path": "src/components/ui/transition-editor/transition-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/transition-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/transition-editor/controls.tsx",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/controls.tsx"
        },
        {
          "path": "src/components/ui/transition-editor/fields.tsx",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/fields.tsx"
        },
        {
          "path": "src/components/ui/transition-editor/preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/transition-editor/preview.tsx"
        }
      ]
    },
    {
      "name": "font-editor",
      "type": "registry:ui",
      "title": "Font Editor",
      "description": "Ridiculously typed CSS font-shorthand editor with a compile-time strict-order parse — an order-free style/variant/weight/stretch prefix, a mandatory <font-size>, optional / <line-height>, and a mandatory <font-family> list, or a system-font keyword. Ships the cssFont helper, parseFont/formatFont, and a live text preview rendered with the built font.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label",
        "select"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/font-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/font-editor/index.ts"
        },
        {
          "path": "src/components/ui/font-editor/font-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/font-editor/font-editor.tsx"
        },
        {
          "path": "src/components/ui/font-editor/font-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/font-editor/font-editor.types.ts"
        },
        {
          "path": "src/components/ui/font-editor/font-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/font-editor/font-editor.helpers.ts"
        }
      ]
    },
    {
      "name": "color-function",
      "type": "registry:ui",
      "title": "Color Function",
      "description": "Ridiculously typed editor for the modern CSS color functions — color-mix(), light-dark(), and relative color — each with its own compile-time grammar and per-space channel strictness. Reuses color-picker and ships a result-swatch preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "color-picker",
        "button",
        "popover",
        "input",
        "label",
        "select",
        "slider"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/color-function/index.ts",
          "type": "registry:ui",
          "target": "components/ui/color-function/index.ts"
        },
        {
          "path": "src/components/ui/color-function/color-function.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/color-function.tsx"
        },
        {
          "path": "src/components/ui/color-function/color-function.types.ts",
          "type": "registry:ui",
          "target": "components/ui/color-function/color-function.types.ts"
        },
        {
          "path": "src/components/ui/color-function/color-function.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/color-function/color-function.helpers.ts"
        },
        {
          "path": "src/components/ui/color-function/color-function-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/color-function-preview.tsx"
        },
        {
          "path": "src/components/ui/color-function/color-mix-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/color-mix-editor.tsx"
        },
        {
          "path": "src/components/ui/color-function/family-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/family-select.tsx"
        },
        {
          "path": "src/components/ui/color-function/light-dark-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/light-dark-editor.tsx"
        },
        {
          "path": "src/components/ui/color-function/live-string.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/live-string.tsx"
        },
        {
          "path": "src/components/ui/color-function/relative-color-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/color-function/relative-color-editor.tsx"
        }
      ]
    },
    {
      "name": "if-function",
      "type": "registry:ui",
      "title": "if() Conditional Value",
      "description": "Ridiculously typed editor for the CSS if() conditional value function. Validates the wrapper, splits branches, checks each condition kind (media/supports/style/else), and enforces else-last. Ships a popover branch-builder UI with a live preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "button",
        "popover",
        "input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/if-function/index.ts",
          "type": "registry:ui",
          "target": "components/ui/if-function/index.ts"
        },
        {
          "path": "src/components/ui/if-function/if-function.tsx",
          "type": "registry:ui",
          "target": "components/ui/if-function/if-function.tsx"
        },
        {
          "path": "src/components/ui/if-function/if-function.types.ts",
          "type": "registry:ui",
          "target": "components/ui/if-function/if-function.types.ts"
        },
        {
          "path": "src/components/ui/if-function/if-function.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/if-function/if-function.helpers.ts"
        }
      ]
    },
    {
      "name": "query-builder",
      "type": "registry:ui",
      "title": "Media / Container Query Builder",
      "description": "Ridiculously typed editor for CSS media and container queries (mode prop). The strict tier validates the query skeleton, the no-mixing-and/or rule, and each feature's value dimension against a known feature table. Ships a live 'matches now?' indicator.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label",
        "select"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/query-builder/index.ts",
          "type": "registry:ui",
          "target": "components/ui/query-builder/index.ts"
        },
        {
          "path": "src/components/ui/query-builder/query-builder.tsx",
          "type": "registry:ui",
          "target": "components/ui/query-builder/query-builder.tsx"
        },
        {
          "path": "src/components/ui/query-builder/query-builder.types.ts",
          "type": "registry:ui",
          "target": "components/ui/query-builder/query-builder.types.ts"
        },
        {
          "path": "src/components/ui/query-builder/query-builder.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/query-builder/query-builder.helpers.ts"
        },
        {
          "path": "src/components/ui/query-builder/feature-test-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/query-builder/feature-test-row.tsx"
        },
        {
          "path": "src/components/ui/query-builder/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/query-builder/mini-select.tsx"
        },
        {
          "path": "src/components/ui/query-builder/query-builder-fields.tsx",
          "type": "registry:ui",
          "target": "components/ui/query-builder/query-builder-fields.tsx"
        },
        {
          "path": "src/components/ui/query-builder/query-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/query-builder/query-preview.tsx"
        }
      ]
    },
    {
      "name": "anchor-position-editor",
      "type": "registry:ui",
      "title": "Anchor Position Editor",
      "description": "Ridiculously typed editor for CSS anchor positioning (mode prop). The strict tier enforces the position-area cross-axis rule — a keyword pair must sit on two different axes of the same coordinate system. The hero is a clickable 3×3 placement grid with a live snap preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/anchor-position-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/index.ts"
        },
        {
          "path": "src/components/ui/anchor-position-editor/anchor-position-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/anchor-position-editor.tsx"
        },
        {
          "path": "src/components/ui/anchor-position-editor/anchor-position-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/anchor-position-editor.types.ts"
        },
        {
          "path": "src/components/ui/anchor-position-editor/anchor-position-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/anchor-position-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/anchor-position-editor/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/mini-select.tsx"
        },
        {
          "path": "src/components/ui/anchor-position-editor/position-area-grid.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/position-area-grid.tsx"
        },
        {
          "path": "src/components/ui/anchor-position-editor/anchor-expr-fields.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/anchor-expr-fields.tsx"
        },
        {
          "path": "src/components/ui/anchor-position-editor/try-fallback-chain.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/try-fallback-chain.tsx"
        },
        {
          "path": "src/components/ui/anchor-position-editor/anchor-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/anchor-position-editor/anchor-preview.tsx"
        }
      ]
    },
    {
      "name": "property-syntax-editor",
      "type": "registry:ui",
      "title": "@property Syntax Editor",
      "description": "Ridiculously typed editor for the CSS @property syntax: descriptor. The namesake types one CSS string with another — InitialValueLiteral<Syntax, V> checks an initial-value against the validated syntax, so cssProperty(\"<length>\", \"red\") is a compile error. A chip builder sits beside a live green/red demo.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "color-picker",
        "button",
        "popover",
        "input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/property-syntax-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/index.ts"
        },
        {
          "path": "src/components/ui/property-syntax-editor/property-syntax-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/property-syntax-editor.tsx"
        },
        {
          "path": "src/components/ui/property-syntax-editor/property-syntax-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/property-syntax-editor.types.ts"
        },
        {
          "path": "src/components/ui/property-syntax-editor/property-syntax-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/property-syntax-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/property-syntax-editor/syntax-chip-builder.tsx",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/syntax-chip-builder.tsx"
        },
        {
          "path": "src/components/ui/property-syntax-editor/initial-value-field.tsx",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/initial-value-field.tsx"
        },
        {
          "path": "src/components/ui/property-syntax-editor/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/property-syntax-editor/mini-select.tsx"
        }
      ]
    },
    {
      "name": "shape-path-editor",
      "type": "registry:ui",
      "title": "Shape Path Editor",
      "description": "Ridiculously typed editor for the CSS shape() function (clip-path / offset-path). The strict tier dispatches each command on its name (move/line/curve/arc/…), checking arity, direction, and every coordinate. Ships the registry's only Bézier-control-handle canvas with a live preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "unit-input",
        "button",
        "popover",
        "input",
        "label"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/shape-path-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/index.ts"
        },
        {
          "path": "src/components/ui/shape-path-editor/shape-path-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/shape-path-editor.tsx"
        },
        {
          "path": "src/components/ui/shape-path-editor/shape-path-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/shape-path-editor.types.ts"
        },
        {
          "path": "src/components/ui/shape-path-editor/shape-path-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/shape-path-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/shape-path-editor/shape-canvas.tsx",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/shape-canvas.tsx"
        },
        {
          "path": "src/components/ui/shape-path-editor/command-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/command-row.tsx"
        },
        {
          "path": "src/components/ui/shape-path-editor/shape-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/shape-preview.tsx"
        },
        {
          "path": "src/components/ui/shape-path-editor/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/shape-path-editor/mini-select.tsx"
        }
      ]
    },
    {
      "name": "keyframes-editor",
      "type": "registry:ui",
      "title": "Keyframes Editor",
      "description": "Ridiculously typed editor for a CSS @keyframes body — the composition flagship. A two-level type validates each stop selector and dispatches every declaration into its property's own validator (transform, filter, color, easing, …). A timeline embeds the real editors per stop, with a scrubbed preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "transform-builder",
        "filter-builder",
        "color-picker",
        "gradient-editor",
        "easing-picker",
        "unit-input",
        "button",
        "popover",
        "input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/keyframes-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/index.ts"
        },
        {
          "path": "src/components/ui/keyframes-editor/keyframes-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/keyframes-editor.tsx"
        },
        {
          "path": "src/components/ui/keyframes-editor/keyframes-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/keyframes-editor.types.ts"
        },
        {
          "path": "src/components/ui/keyframes-editor/keyframes-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/keyframes-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/keyframes-editor/keyframe-timeline.tsx",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/keyframe-timeline.tsx"
        },
        {
          "path": "src/components/ui/keyframes-editor/declaration-row.tsx",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/declaration-row.tsx"
        },
        {
          "path": "src/components/ui/keyframes-editor/keyframe-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/keyframe-preview.tsx"
        },
        {
          "path": "src/components/ui/keyframes-editor/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/keyframes-editor/mini-select.tsx"
        }
      ]
    },
    {
      "name": "background-editor",
      "type": "registry:ui",
      "title": "Background Editor",
      "description": "Ridiculously typed editor for the CSS background shorthand. An index-aware fold permits a <color> token only on the final layer, so a color in any earlier layer is a compile error. A reorderable layer stack embeds the real gradient + color pickers over a live composite preview.",
      "registryDependencies": [
        "ridiculous-type-kit",
        "color-picker",
        "gradient-editor",
        "unit-input",
        "button",
        "popover",
        "input"
      ],
      "dependencies": [],
      "files": [
        {
          "path": "src/components/ui/background-editor/index.ts",
          "type": "registry:ui",
          "target": "components/ui/background-editor/index.ts"
        },
        {
          "path": "src/components/ui/background-editor/background-editor.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/background-editor.tsx"
        },
        {
          "path": "src/components/ui/background-editor/background-editor.types.ts",
          "type": "registry:ui",
          "target": "components/ui/background-editor/background-editor.types.ts"
        },
        {
          "path": "src/components/ui/background-editor/background-editor.helpers.ts",
          "type": "registry:ui",
          "target": "components/ui/background-editor/background-editor.helpers.ts"
        },
        {
          "path": "src/components/ui/background-editor/layer-stack.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/layer-stack.tsx"
        },
        {
          "path": "src/components/ui/background-editor/layer-card.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/layer-card.tsx"
        },
        {
          "path": "src/components/ui/background-editor/position-pad.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/position-pad.tsx"
        },
        {
          "path": "src/components/ui/background-editor/background-preview.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/background-preview.tsx"
        },
        {
          "path": "src/components/ui/background-editor/mini-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/background-editor/mini-select.tsx"
        }
      ]
    },
    {
      "name": "all",
      "type": "registry:ui",
      "title": "All ridiculous components",
      "description": "Bundle — installs color-picker, gradient-editor, unit-input, easing-picker, calc-editor, transform-builder, filter-builder, grid-builder, clip-path-editor, box-shadow-editor, transition-editor, font-editor, color-function, if-function, query-builder, anchor-position-editor, property-syntax-editor, shape-path-editor, keyframes-editor, and background-editor in one command.",
      "registryDependencies": [
        "https://ridiculous.turtlesocks.dev/r/ridiculous-type-kit.json",
        "https://ridiculous.turtlesocks.dev/r/color-picker.json",
        "https://ridiculous.turtlesocks.dev/r/unit-input.json",
        "https://ridiculous.turtlesocks.dev/r/gradient-editor.json",
        "https://ridiculous.turtlesocks.dev/r/easing-picker.json",
        "https://ridiculous.turtlesocks.dev/r/calc-editor.json",
        "https://ridiculous.turtlesocks.dev/r/transform-builder.json",
        "https://ridiculous.turtlesocks.dev/r/filter-builder.json",
        "https://ridiculous.turtlesocks.dev/r/grid-builder.json",
        "https://ridiculous.turtlesocks.dev/r/clip-path-editor.json",
        "https://ridiculous.turtlesocks.dev/r/box-shadow-editor.json",
        "https://ridiculous.turtlesocks.dev/r/transition-editor.json",
        "https://ridiculous.turtlesocks.dev/r/font-editor.json",
        "https://ridiculous.turtlesocks.dev/r/color-function.json",
        "https://ridiculous.turtlesocks.dev/r/if-function.json",
        "https://ridiculous.turtlesocks.dev/r/query-builder.json",
        "https://ridiculous.turtlesocks.dev/r/anchor-position-editor.json",
        "https://ridiculous.turtlesocks.dev/r/property-syntax-editor.json",
        "https://ridiculous.turtlesocks.dev/r/shape-path-editor.json",
        "https://ridiculous.turtlesocks.dev/r/keyframes-editor.json",
        "https://ridiculous.turtlesocks.dev/r/background-editor.json"
      ],
      "dependencies": [],
      "files": []
    }
  ]
}
