{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "odori",
  "homepage": "https://odori.dev",
  "items": [
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "absolute-stage",
      "type": "registry:component",
      "title": "Absolute stage",
      "description": "Full-frame surface with stable clipping and positioning.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/absolute-stage",
      "categories": [
        "Foundation"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Foundation",
        "category": "Foundation",
        "namespaced": "@odori/absolute-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "no motion of its own",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-Vzpa/wxU+eQf17UbLitIhDzi3RyubnHTx9GMgLuwp1U="
      },
      "files": [
        {
          "path": "components/absolute-stage/absolute-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/absolute-stage/absolute-stage.tsx"
        },
        {
          "path": "components/absolute-stage/absolute-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/absolute-stage/absolute-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "accordion",
      "type": "registry:component",
      "title": "Accordion",
      "description": "Sections opening one at a time, the outgoing one closing as the next grows.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/accordion",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/accordion",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {},
          "reducedMotion": "one section shown open",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-EtxksGBQ1rUbg34yNH8ka4QNv94lUDlacOE0WUhGMp0="
      },
      "files": [
        {
          "path": "components/accordion/accordion.tsx",
          "type": "registry:component",
          "target": "videos/components/accordion/accordion.tsx"
        },
        {
          "path": "components/accordion/accordion.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/accordion/accordion.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "area-chart",
      "type": "registry:component",
      "title": "Area chart",
      "description": "Filled trend reveal for volume and cumulative change.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/area-chart",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/area-chart",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 78,
          "entranceFrames": 62,
          "exitFrames": 0,
          "contentLimits": {
            "points": 16
          },
          "reducedMotion": "the filled area appears at once",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-9errvpm4gm6gbkZRahOEmfvUCxV4o9Tx6VkX3YUeyXo="
      },
      "files": [
        {
          "path": "components/area-chart/area-chart.tsx",
          "type": "registry:component",
          "target": "videos/components/area-chart/area-chart.tsx"
        },
        {
          "path": "components/area-chart/area-chart.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/area-chart/area-chart.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "aurora-veil",
      "type": "registry:component",
      "title": "Aurora veil",
      "description": "Flowing curtains of colored light.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/aurora-veil",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/aurora-veil",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the curtains hold still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-X67vNB6L+bYt38Zv+0kiEzH4HZ2VTTONhg/BWPRjgHw="
      },
      "files": [
        {
          "path": "components/aurora-veil/aurora-veil.tsx",
          "type": "registry:component",
          "target": "videos/components/aurora-veil/aurora-veil.tsx"
        },
        {
          "path": "components/aurora-veil/aurora-veil.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/aurora-veil/aurora-veil.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "b-roll-window",
      "type": "registry:component",
      "title": "B-roll window",
      "description": "Supporting footage framed beside the main narrative.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/b-roll-window",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/b-roll-window",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 45,
          "entranceFrames": 14,
          "exitFrames": 14,
          "contentLimits": {
            "label": 48
          },
          "reducedMotion": "the window is present without sliding in",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-dmCUFQOssJgwk8sCLaGjseyfS7nkhZlie8unrDYrJYI="
      },
      "files": [
        {
          "path": "components/b-roll-window/b-roll-window.tsx",
          "type": "registry:component",
          "target": "videos/components/b-roll-window/b-roll-window.tsx"
        },
        {
          "path": "components/b-roll-window/b-roll-window.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/b-roll-window/b-roll-window.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bar-chart",
      "type": "registry:component",
      "title": "Bar chart",
      "description": "Ranked bars with labels, values, and staged growth.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bar-chart",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/bar-chart",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 50,
          "exitFrames": 0,
          "contentLimits": {
            "bars": 6,
            "labelLength": 28
          },
          "reducedMotion": "bars appear at full length",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-gEnBKS+Eau8bsQti+9BrfEqQ1TYbKbkIOX/+Z+8T340="
      },
      "files": [
        {
          "path": "components/bar-chart/bar-chart.tsx",
          "type": "registry:component",
          "target": "videos/components/bar-chart/bar-chart.tsx"
        },
        {
          "path": "components/bar-chart/bar-chart.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/bar-chart/bar-chart.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bead-field",
      "type": "registry:component",
      "title": "Bead field",
      "description": "A fixed grid of dots that swell as two drifting ripples cross them.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bead-field",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/bead-field",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the beads hold one size",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-8AbDYRJJoYC8m5l5uXZ3Ma/o6jqFi1ez2U4YkKYjTlg="
      },
      "files": [
        {
          "path": "components/bead-field/bead-field.tsx",
          "type": "registry:component",
          "target": "videos/components/bead-field/bead-field.tsx"
        },
        {
          "path": "components/bead-field/bead-field.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/bead-field/bead-field.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-drift",
      "type": "registry:item",
      "title": "Drift",
      "description": "Soft ambient pad for narration.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-drift",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-drift",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 480,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": true
        },
        "cue": {
          "name": "bed.drift",
          "export": "bedDrift"
        },
        "integrity": "sha256-h92vioVYxAN5ztqWI+Qoe/3gBwRAlag4pyjY0TbDduM="
      },
      "files": [
        {
          "path": "components/bed-drift/bed-drift.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-drift/bed-drift.tsx"
        },
        {
          "path": "components/bed-drift/bed-drift.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-drift/bed-drift.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-horizons",
      "type": "registry:item",
      "title": "Horizons",
      "description": "Steady, spacious background music.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-horizons",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-horizons",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 1800,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "bed.horizons",
          "url": "/audio/bed-horizons.m4a",
          "target": "public/audio/bed-horizons.m4a",
          "bytes": 1485736,
          "integrity": "sha256-iefp35CkDy12D3pafug5JK5rjFSZXJIbElcRcWQz2EU="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-innovation",
      "type": "registry:item",
      "title": "Innovation",
      "description": "Even-paced background music for walkthroughs.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-innovation",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-innovation",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 1800,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "bed.innovation",
          "url": "/audio/bed-innovation.m4a",
          "target": "public/audio/bed-innovation.m4a",
          "bytes": 1464982,
          "integrity": "sha256-1ldkwI1WjS4f/15/BoXWCOAHKlDlvKylVhowAHE4uB4="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-launch",
      "type": "registry:item",
      "title": "Launch",
      "description": "Building music for a product reveal.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-launch",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-launch",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 1800,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "bed.launch",
          "url": "/audio/bed-launch.m4a",
          "target": "public/audio/bed-launch.m4a",
          "bytes": 1479103,
          "integrity": "sha256-WXY08xpDUUEzEHslaN+0fdLPZ2QdbWtrSCNmSEyl+V0="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-lift",
      "type": "registry:item",
      "title": "Lift",
      "description": "A sustained chord with shimmering high notes.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-lift",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-lift",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 300,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": true
        },
        "cue": {
          "name": "bed.lift",
          "export": "bedLift"
        },
        "integrity": "sha256-Iv6hGSHb+xS29GrKSsmOIou64wtUPsxsBisvps8YhdY="
      },
      "files": [
        {
          "path": "components/bed-lift/bed-lift.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-lift/bed-lift.tsx"
        },
        {
          "path": "components/bed-lift/bed-lift.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-lift/bed-lift.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-pulse",
      "type": "registry:item",
      "title": "Pulse",
      "description": "A repeating pulse over a sustained chord.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-pulse",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-pulse",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 171,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": true
        },
        "cue": {
          "name": "bed.pulse",
          "export": "bedPulse"
        },
        "integrity": "sha256-wog65DCcAXlwpwdDwusAu2yqdowrPPs8wRui9uq7wAU="
      },
      "files": [
        {
          "path": "components/bed-pulse/bed-pulse.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-pulse/bed-pulse.tsx"
        },
        {
          "path": "components/bed-pulse/bed-pulse.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/bed-pulse/bed-pulse.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-tomorrow",
      "type": "registry:item",
      "title": "Tomorrow",
      "description": "Bright background music for product demos.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-tomorrow",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-tomorrow",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 1800,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "bed.tomorrow",
          "url": "/audio/bed-tomorrow.m4a",
          "target": "public/audio/bed-tomorrow.m4a",
          "bytes": 1480926,
          "integrity": "sha256-laiAwyv0H+HXOgdS2aFUrNEQHQYtPBtdMx3JYgpGTAA="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "bed-velocity",
      "type": "registry:item",
      "title": "Velocity",
      "description": "Fast background music for energetic edits.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/bed-velocity",
      "categories": [
        "Sound",
        "Sound/Beds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Beds",
        "namespaced": "@odori/bed-velocity",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 1800,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "bed.velocity",
          "url": "/audio/bed-velocity.m4a",
          "target": "public/audio/bed-velocity.m4a",
          "bytes": 1496595,
          "integrity": "sha256-uSQhQ6+7godHnpm4fdMZqYYFwCK67E1hskHIOVi499g="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "before-after",
      "type": "registry:component",
      "title": "Before and after",
      "description": "Direct visual comparison with a controlled divider.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/before-after",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/before-after",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 72,
          "entranceFrames": 60,
          "exitFrames": 0,
          "contentLimits": {
            "beforeLabel": 18,
            "afterLabel": 18
          },
          "reducedMotion": "the divider starts at its resting position",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-l3v3P4OUVD3HduFpP0gFyggLpq8pjsgYCmOwH/kwMlA="
      },
      "files": [
        {
          "path": "components/before-after/before-after.tsx",
          "type": "registry:component",
          "target": "videos/components/before-after/before-after.tsx"
        },
        {
          "path": "components/before-after/before-after.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/before-after/before-after.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "brand-provider",
      "type": "registry:component",
      "title": "Brand provider",
      "description": "The resolved brand rendered as a sheet: color, type, and motion.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/brand-provider",
      "categories": [
        "Brand"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Brand",
        "category": "Brand",
        "namespaced": "@odori/brand-provider",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 40,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "rows appear together",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-6AJ/Pq39a9cEfo25IjI6b25cJMGlyBialMCGI0NZ2B8="
      },
      "files": [
        {
          "path": "components/brand-provider/brand-provider.tsx",
          "type": "registry:component",
          "target": "videos/components/brand-provider/brand-provider.tsx"
        },
        {
          "path": "components/brand-provider/brand-provider.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/brand-provider/brand-provider.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "browser-demo",
      "type": "registry:component",
      "title": "Browser demo",
      "description": "Browser chrome for deterministic product interface frames.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/browser-demo",
      "categories": [
        "Interface",
        "Interface/Chrome"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Chrome",
        "namespaced": "@odori/browser-demo",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 90,
          "entranceFrames": 18,
          "exitFrames": 12,
          "contentLimits": {
            "url": 48
          },
          "reducedMotion": "no cursor motion",
          "requires": {
            "fonts": [
              "mono",
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-pVUYA+XRHLxTXQ7ZdQ9RzHYPy8YM5NQFKVxCQseAUMo="
      },
      "files": [
        {
          "path": "components/browser-demo/browser-demo.tsx",
          "type": "registry:component",
          "target": "videos/components/browser-demo/browser-demo.tsx"
        },
        {
          "path": "components/browser-demo/browser-demo.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/browser-demo/browser-demo.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "camera-stage",
      "type": "registry:component",
      "title": "Camera stage",
      "description": "An animated camera that moves through your scene.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/camera-stage",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/camera-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "stops": 8,
            "items": 12
          },
          "reducedMotion": "the camera holds its first stop",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-+Qx5sMJHxFY2j55yCPPsg8LUhdLyv9znee5HAaSaabY="
      },
      "files": [
        {
          "path": "components/camera-stage/camera-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/camera-stage/camera-stage.tsx"
        },
        {
          "path": "components/camera-stage/camera-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/camera-stage/camera-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "canvas-magnifier",
      "type": "registry:component",
      "title": "Canvas magnifier",
      "description": "A magnifying lens over your content.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/canvas-magnifier",
      "categories": [
        "Media",
        "Media/Canvas"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Canvas",
        "namespaced": "@odori/canvas-magnifier",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 30,
          "entranceFrames": 14,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the lens is open in place from the first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-cnt3k+kyiof1zXucryxi0E0sGZm15jKhn2QPAENmG6A="
      },
      "files": [
        {
          "path": "components/canvas-magnifier/canvas-magnifier.tsx",
          "type": "registry:component",
          "target": "videos/components/canvas-magnifier/canvas-magnifier.tsx"
        },
        {
          "path": "components/canvas-magnifier/canvas-magnifier.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/canvas-magnifier/canvas-magnifier.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "canvas-stage",
      "type": "registry:component",
      "title": "Canvas stage",
      "description": "Frame-driven canvas drawing with export parity.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/canvas-stage",
      "categories": [
        "Media",
        "Media/Canvas"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Canvas",
        "namespaced": "@odori/canvas-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "count": 600
          },
          "reducedMotion": "the field holds its first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-/zvqIob8c9w0KDoUJlod2eYIkdVp55QiMGYm6PdRFrs="
      },
      "files": [
        {
          "path": "components/canvas-stage/canvas-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/canvas-stage/canvas-stage.tsx"
        },
        {
          "path": "components/canvas-stage/canvas-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/canvas-stage/canvas-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "captions",
      "type": "registry:component",
      "title": "Captions",
      "description": "Frame-accurate caption cues for sound-off playback.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/captions",
      "categories": [
        "Typography",
        "Typography/Captions"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Captions",
        "namespaced": "@odori/captions",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 20,
          "entranceFrames": 6,
          "exitFrames": 6,
          "contentLimits": {
            "text": 84
          },
          "reducedMotion": "cuts instead of fading",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-lU6r7aJe5mqCfP86cGqGuERqpwSNZeoXdEwWx3rDq+A="
      },
      "files": [
        {
          "path": "components/captions/captions.tsx",
          "type": "registry:component",
          "target": "videos/components/captions/captions.tsx"
        },
        {
          "path": "components/captions/captions.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/captions/captions.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "card-deck",
      "type": "registry:component",
      "title": "Card deck",
      "description": "Stacked cards that cycle from front to back.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/card-deck",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/card-deck",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 68,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "cards": 5
          },
          "reducedMotion": "the deck holds with the first card in front",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-t/Q7BeznQyG1d5U2OARaPBKdqAzRRj/SraXJnK363C0="
      },
      "files": [
        {
          "path": "components/card-deck/card-deck.tsx",
          "type": "registry:component",
          "target": "videos/components/card-deck/card-deck.tsx"
        },
        {
          "path": "components/card-deck/card-deck.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/card-deck/card-deck.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "carousel",
      "type": "registry:component",
      "title": "Carousel",
      "description": "A paced media sequence with stable aspect handling.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/carousel",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/carousel",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 60,
          "entranceFrames": 14,
          "exitFrames": 14,
          "contentLimits": {
            "items": 8
          },
          "reducedMotion": "the first item is shown without paging",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-lqqOetbqevlZlIvxumDB96r2Iq857cJkKBOJkXcPwh4="
      },
      "files": [
        {
          "path": "components/carousel/carousel.tsx",
          "type": "registry:component",
          "target": "videos/components/carousel/carousel.tsx"
        },
        {
          "path": "components/carousel/carousel.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/carousel/carousel.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "cell-reveal",
      "type": "registry:component",
      "title": "Cell reveal",
      "description": "Tiles slide into place to reveal your content.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/cell-reveal",
      "categories": [
        "Motion",
        "Motion/Transitions"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Transitions",
        "namespaced": "@odori/cell-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set scatter low so cells barely travel",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-AWUEX2Y0phIyj5eneKJGHidFkRl6xFjQ3kI1q2E2YTw="
      },
      "files": [
        {
          "path": "components/cell-reveal/cell-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/cell-reveal/cell-reveal.tsx"
        },
        {
          "path": "components/cell-reveal/cell-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/cell-reveal/cell-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "character-rise",
      "type": "registry:component",
      "title": "Character rise",
      "description": "Characters rise with a crisp per-letter stagger.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/character-rise",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/character-rise",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 34,
          "exitFrames": 10,
          "contentLimits": {
            "text": 22
          },
          "reducedMotion": "the word fades without per-letter motion",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-JhNKdxectcPmZll74xWCS8FBgO1HZfsERVx0WdDDzaU="
      },
      "files": [
        {
          "path": "components/character-rise/character-rise.tsx",
          "type": "registry:component",
          "target": "videos/components/character-rise/character-rise.tsx"
        },
        {
          "path": "components/character-rise/character-rise.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/character-rise/character-rise.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "charged-border",
      "type": "registry:component",
      "title": "Charged border",
      "description": "A moving glow around a rounded frame.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/charged-border",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/charged-border",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 for a still ring; leave at unset so it never flares",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-cYwCF7mPJ3CWQEqCSSh5hOrrsdSOvoLqpwqMWz+nslY="
      },
      "files": [
        {
          "path": "components/charged-border/charged-border.tsx",
          "type": "registry:component",
          "target": "videos/components/charged-border/charged-border.tsx"
        },
        {
          "path": "components/charged-border/charged-border.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/charged-border/charged-border.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "chatgpt",
      "type": "registry:component",
      "title": "ChatGPT",
      "description": "A ChatGPT composer with an animated prompt.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/chatgpt",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/chatgpt",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "prompt": 140,
            "placeholder": 48
          },
          "reducedMotion": "starters hidden rather than cleared",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-TnUEX4YIXhraxLza4C0fbqh1+xl01HC2PLUu+b+hxvs="
      },
      "files": [
        {
          "path": "components/chatgpt/chatgpt.tsx",
          "type": "registry:component",
          "target": "videos/components/chatgpt/chatgpt.tsx"
        },
        {
          "path": "components/chatgpt/chatgpt.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/chatgpt/chatgpt.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "claude",
      "type": "registry:component",
      "title": "Claude",
      "description": "A Claude composer with an animated prompt.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/claude",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/claude",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "prompt": 140,
            "placeholder": 48,
            "model": 28
          },
          "reducedMotion": "no button turn, send state from the first frame",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-mbeL76YzMU+wcUp2Uz+wQHjAAipf6lXHio+3WXeQnKQ="
      },
      "files": [
        {
          "path": "components/claude/claude.tsx",
          "type": "registry:component",
          "target": "videos/components/claude/claude.tsx"
        },
        {
          "path": "components/claude/claude.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/claude/claude.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "claude-code",
      "type": "registry:component",
      "title": "Claude Code",
      "description": "A Claude Code session from prompt to response.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/claude-code",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/claude-code",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 120,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "command": 90,
            "cwd": 40,
            "model": 24
          },
          "reducedMotion": "command shown whole, caret still",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-4MjQz3ZrfinJTcxsVPmwxOelrsq6K2+IM2qO909yS+4="
      },
      "files": [
        {
          "path": "components/claude-code/claude-code.tsx",
          "type": "registry:component",
          "target": "videos/components/claude-code/claude-code.tsx"
        },
        {
          "path": "components/claude-code/claude-code.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/claude-code/claude-code.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "code-proof",
      "type": "registry:component",
      "title": "Product launch",
      "description": "A framed source excerpt that reveals line by line.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/code-proof",
      "categories": [
        "Developer proof",
        "Developer proof/Code"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Code",
        "namespaced": "@odori/code-proof",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 18,
          "exitFrames": 12,
          "contentLimits": {
            "lines": 14,
            "lineLength": 62
          },
          "reducedMotion": "reveals all lines immediately",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-NvDAe+zB/B/fWW2uJabsgYzWEiMvKAu/EDVoSKvOeXE="
      },
      "files": [
        {
          "path": "components/code-proof/code-proof.tsx",
          "type": "registry:component",
          "target": "videos/components/code-proof/code-proof.tsx"
        },
        {
          "path": "components/code-proof/code-proof.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/code-proof/code-proof.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "code-walkthrough",
      "type": "registry:component",
      "title": "Code walkthrough",
      "description": "Progressive code reveal with authored focal regions.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/code-walkthrough",
      "categories": [
        "Developer proof",
        "Developer proof/Code"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Code",
        "namespaced": "@odori/code-walkthrough",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 120,
          "entranceFrames": 28,
          "exitFrames": 0,
          "contentLimits": {
            "lines": 16,
            "lineLength": 62,
            "steps": 4
          },
          "reducedMotion": "all steps show without dimming",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-yVDAkrvt5KgDERFXRY0cAz2O1WxRZvMCeVto2UiXUhI="
      },
      "files": [
        {
          "path": "components/code-walkthrough/code-walkthrough.tsx",
          "type": "registry:component",
          "target": "videos/components/code-walkthrough/code-walkthrough.tsx"
        },
        {
          "path": "components/code-walkthrough/code-walkthrough.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/code-walkthrough/code-walkthrough.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "combobox",
      "type": "registry:component",
      "title": "Combobox",
      "description": "A search field that filters a dropdown list.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/combobox",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/combobox",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "query": 32,
            "label": 32
          },
          "reducedMotion": "query shown whole, list filtered",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-eRUVzsk73qGHe4JBULPmw/C6g1jcH9/g4FI4aVtWVqg="
      },
      "files": [
        {
          "path": "components/combobox/combobox.tsx",
          "type": "registry:component",
          "target": "videos/components/combobox/combobox.tsx"
        },
        {
          "path": "components/combobox/combobox.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/combobox/combobox.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "command-menu",
      "type": "registry:component",
      "title": "Command menu",
      "description": "Keyboard-first action search and selection flow.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/command-menu",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/command-menu",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 18,
          "exitFrames": 0,
          "contentLimits": {
            "items": 6,
            "itemLength": 32,
            "query": 24
          },
          "reducedMotion": "the query and selection are shown resolved",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-Gw2aRUVJuG1fXtxyJQSeKvOWYmw3bLv8xNK66JtCXA0="
      },
      "files": [
        {
          "path": "components/command-menu/command-menu.tsx",
          "type": "registry:component",
          "target": "videos/components/command-menu/command-menu.tsx"
        },
        {
          "path": "components/command-menu/command-menu.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/command-menu/command-menu.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "comparison",
      "type": "registry:component",
      "title": "Comparison",
      "description": "Two options contrasted through matched structure.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/comparison",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/comparison",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 60,
          "exitFrames": 0,
          "contentLimits": {
            "columns": 2,
            "points": 4,
            "pointLength": 42
          },
          "reducedMotion": "columns and points appear together",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-fMVHEY/g0pWcuuMFFUE6GWYGxlbivhsUILKjOM8fslo="
      },
      "files": [
        {
          "path": "components/comparison/comparison.tsx",
          "type": "registry:component",
          "target": "videos/components/comparison/comparison.tsx"
        },
        {
          "path": "components/comparison/comparison.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/comparison/comparison.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "connection-story",
      "type": "registry:component",
      "title": "Connection story",
      "description": "A left-to-right pipeline of connected stages.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/connection-story",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/connection-story",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 26,
          "exitFrames": 10,
          "contentLimits": {
            "nodes": 4,
            "label": 18
          },
          "reducedMotion": "connects without sweeping links",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-yi31y5ZBQ51Q2IVw7i+XWqTXvflgIvPLJ/foR5BuUBA="
      },
      "files": [
        {
          "path": "components/connection-story/connection-story.tsx",
          "type": "registry:component",
          "target": "videos/components/connection-story/connection-story.tsx"
        },
        {
          "path": "components/connection-story/connection-story.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/connection-story/connection-story.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "context-menu",
      "type": "registry:component",
      "title": "Context menu",
      "description": "The menu that appears where you clicked, anchored to its own corner.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/context-menu",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/context-menu",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 48,
          "entranceFrames": 24,
          "exitFrames": 10,
          "contentLimits": {
            "items": 6,
            "label": 24
          },
          "reducedMotion": "the menu appears without scaling from its corner",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-WDQxE+Op8xie6YIRC7O2rQ1TNPFYo3ec9Ls+uNw3JBA="
      },
      "files": [
        {
          "path": "components/context-menu/context-menu.tsx",
          "type": "registry:component",
          "target": "videos/components/context-menu/context-menu.tsx"
        },
        {
          "path": "components/context-menu/context-menu.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/context-menu/context-menu.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "control-stage",
      "type": "registry:component",
      "title": "Control stage",
      "description": "An enlarged control with an animated press.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/control-stage",
      "categories": [
        "Interface",
        "Interface/Chrome"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Chrome",
        "namespaced": "@odori/control-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 48,
          "entranceFrames": 24,
          "exitFrames": 10,
          "contentLimits": {
            "controls": 3,
            "label": 22
          },
          "reducedMotion": "the press lands without the settle",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-oEbvKzgHFDGxWS04RxhtOd2pXnax0RkZRLrZbZ/s9zE="
      },
      "files": [
        {
          "path": "components/control-stage/control-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/control-stage/control-stage.tsx"
        },
        {
          "path": "components/control-stage/control-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/control-stage/control-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "crt-terminal",
      "type": "registry:component",
      "title": "CRT terminal",
      "description": "A retro terminal with curved glass and glowing text.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/crt-terminal",
      "categories": [
        "Media",
        "Media/Treatments"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Treatments",
        "namespaced": "@odori/crt-terminal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 120,
          "entranceFrames": 12,
          "exitFrames": 10,
          "contentLimits": {
            "command": 60,
            "prompt": 8
          },
          "reducedMotion": "no flicker, roll or sweep; text held",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-o6xVlD9hFrSZgkEqVxR2De3Mzl55VCOzoGsgIdMZTqQ="
      },
      "files": [
        {
          "path": "components/crt-terminal/crt-terminal.tsx",
          "type": "registry:component",
          "target": "videos/components/crt-terminal/crt-terminal.tsx"
        },
        {
          "path": "components/crt-terminal/crt-terminal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/crt-terminal/crt-terminal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "cursor-focus",
      "type": "registry:component",
      "title": "Cursor focus",
      "description": "An authored pointer that moves, holds, and clicks over a surface.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/cursor-focus",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/cursor-focus",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 40,
          "entranceFrames": 6,
          "exitFrames": 20,
          "contentLimits": {},
          "reducedMotion": "the pointer holds its first stop without travelling",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-XZVly918t6DeRZF5Mc5Bu9p04KBPRuvNmN0pc2dFJ28="
      },
      "files": [
        {
          "path": "components/cursor-focus/cursor-focus.tsx",
          "type": "registry:component",
          "target": "videos/components/cursor-focus/cursor-focus.tsx"
        },
        {
          "path": "components/cursor-focus/cursor-focus.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/cursor-focus/cursor-focus.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dashboard-frame",
      "type": "registry:component",
      "title": "Dashboard frame",
      "description": "Navigation, content, and status regions for a SaaS surface.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dashboard-frame",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/dashboard-frame",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 40,
          "entranceFrames": 16,
          "exitFrames": 0,
          "contentLimits": {
            "product": 24,
            "title": 40,
            "status": 48
          },
          "reducedMotion": "the frame appears without fading in",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-rENnIuoaZkRs5PxYEJ5aZOvUxCYdwnG9zAH98fp9pAc="
      },
      "files": [
        {
          "path": "components/dashboard-frame/dashboard-frame.tsx",
          "type": "registry:component",
          "target": "videos/components/dashboard-frame/dashboard-frame.tsx"
        },
        {
          "path": "components/dashboard-frame/dashboard-frame.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dashboard-frame/dashboard-frame.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "data-table",
      "type": "registry:component",
      "title": "Data table",
      "description": "Animated sorting and row selection.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/data-table",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/data-table",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 60,
          "exitFrames": 0,
          "contentLimits": {
            "rows": 6,
            "columns": 5
          },
          "reducedMotion": "rows and the selection appear at once",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-4t+GxWLNg0jFMjh+U9lvqaWO+eYN4tIXqh6IFJ87FLs="
      },
      "files": [
        {
          "path": "components/data-table/data-table.tsx",
          "type": "registry:component",
          "target": "videos/components/data-table/data-table.tsx"
        },
        {
          "path": "components/data-table/data-table.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/data-table/data-table.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "date-picker",
      "type": "registry:component",
      "title": "Date picker",
      "description": "A calendar where a range fills outwards from the date chosen first.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/date-picker",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/date-picker",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "month": 24,
            "label": 28
          },
          "reducedMotion": "range shown filled, no reach",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-ZxHh3GTgm8PVxb0VrxeQGKo85Q8eWk5eKVFg4AzHY1w="
      },
      "files": [
        {
          "path": "components/date-picker/date-picker.tsx",
          "type": "registry:component",
          "target": "videos/components/date-picker/date-picker.tsx"
        },
        {
          "path": "components/date-picker/date-picker.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/date-picker/date-picker.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "deep-swell",
      "type": "registry:component",
      "title": "Deep swell",
      "description": "Ocean waves beneath a sunlit horizon.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/deep-swell",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/deep-swell",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the sea holds one still surface",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-hzuXFqVld171I4j1tzFqbnInz+ahe9ZjnDvgX53+N/0="
      },
      "files": [
        {
          "path": "components/deep-swell/deep-swell.tsx",
          "type": "registry:component",
          "target": "videos/components/deep-swell/deep-swell.tsx"
        },
        {
          "path": "components/deep-swell/deep-swell.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/deep-swell/deep-swell.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dependency-graph",
      "type": "registry:component",
      "title": "Dependency graph",
      "description": "Packages and modules connected as a readable graph.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dependency-graph",
      "categories": [
        "Developer proof",
        "Developer proof/Code"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Code",
        "namespaced": "@odori/dependency-graph",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 60,
          "exitFrames": 0,
          "contentLimits": {
            "nodes": 6,
            "labelLength": 24
          },
          "reducedMotion": "edges and nodes appear without drawing",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-rImKbRKLUoXDW9rfaiIGcZYDpuC6nGNVfSebb91Keoo="
      },
      "files": [
        {
          "path": "components/dependency-graph/dependency-graph.tsx",
          "type": "registry:component",
          "target": "videos/components/dependency-graph/dependency-graph.tsx"
        },
        {
          "path": "components/dependency-graph/dependency-graph.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dependency-graph/dependency-graph.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "device-frame",
      "type": "registry:component",
      "title": "Device frame",
      "description": "A phone, tablet, or desktop body around a product surface.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/device-frame",
      "categories": [
        "Interface",
        "Interface/Chrome"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Chrome",
        "namespaced": "@odori/device-frame",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 30,
          "entranceFrames": 20,
          "exitFrames": 0,
          "contentLimits": {
            "url": 64
          },
          "reducedMotion": "the body appears in place without rising",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-RIfjiveTh2E9uUmp9evEWNHYGIE+YspgVo4DwdPoeUU="
      },
      "files": [
        {
          "path": "components/device-frame/device-frame.tsx",
          "type": "registry:component",
          "target": "videos/components/device-frame/device-frame.tsx"
        },
        {
          "path": "components/device-frame/device-frame.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/device-frame/device-frame.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "diff-proof",
      "type": "registry:component",
      "title": "Diff proof",
      "description": "Before and after source changes with semantic emphasis.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/diff-proof",
      "categories": [
        "Developer proof",
        "Developer proof/Code"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Code",
        "namespaced": "@odori/diff-proof",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 72,
          "entranceFrames": 40,
          "exitFrames": 0,
          "contentLimits": {
            "lines": 12,
            "lineLength": 58
          },
          "reducedMotion": "changed lines appear without staggering",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-jcP/uVMEDmc5b/NCxlD2eHWkyqoZWb+YgNaWRvV10yo="
      },
      "files": [
        {
          "path": "components/diff-proof/diff-proof.tsx",
          "type": "registry:component",
          "target": "videos/components/diff-proof/diff-proof.tsx"
        },
        {
          "path": "components/diff-proof/diff-proof.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/diff-proof/diff-proof.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "discord",
      "type": "registry:component",
      "title": "Discord",
      "description": "A Discord server where a bot answers in a channel, quoting the message it replies to.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/discord",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/discord",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "server": 24,
            "channel": 24,
            "topic": 60
          },
          "reducedMotion": "messages placed, no working indicator",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-H/DHKnjqmsydMlFj2DTClBNBdBqaBgXifRgVWrpSpNs="
      },
      "files": [
        {
          "path": "components/discord/discord.tsx",
          "type": "registry:component",
          "target": "videos/components/discord/discord.tsx"
        },
        {
          "path": "components/discord/discord.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/discord/discord.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dissolve-reveal",
      "type": "registry:component",
      "title": "Dissolve reveal",
      "description": "A noise threshold sweeps across the frame, so content arrives as a torn edge.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dissolve-reveal",
      "categories": [
        "Motion",
        "Motion/Transitions"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Transitions",
        "namespaced": "@odori/dissolve-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set hold to a small value so content is present almost at once",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-aDyCzJEG31A1G8GZlldwJAXxbXMpy+OAOUxblEkHT5U="
      },
      "files": [
        {
          "path": "components/dissolve-reveal/dissolve-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/dissolve-reveal/dissolve-reveal.tsx"
        },
        {
          "path": "components/dissolve-reveal/dissolve-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dissolve-reveal/dissolve-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dither-field",
      "type": "registry:component",
      "title": "Dither field",
      "description": "A moving gradient with pixelated shading.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dither-field",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/dither-field",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the dither holds one still gradient",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-7ogqdWAe9Q310y0SnP2NdnYIaWyjEXTRaTuatdO0Cv4="
      },
      "files": [
        {
          "path": "components/dither-field/dither-field.tsx",
          "type": "registry:component",
          "target": "videos/components/dither-field/dither-field.tsx"
        },
        {
          "path": "components/dither-field/dither-field.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dither-field/dither-field.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dock-bar",
      "type": "registry:component",
      "title": "Dock bar",
      "description": "A macOS-style dock where one app launches with a bounce.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dock-bar",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/dock-bar",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 90,
          "entranceFrames": 12,
          "exitFrames": 0,
          "contentLimits": {
            "apps": 8,
            "appNameLength": 16
          },
          "reducedMotion": "the launched tile is shown magnified with its dot, without the bounce",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-j9zRSSzqcizd9rZ+tCnm2LfuvMVeJQHUi3+qjPJOULM="
      },
      "files": [
        {
          "path": "components/dock-bar/dock-bar.tsx",
          "type": "registry:component",
          "target": "videos/components/dock-bar/dock-bar.tsx"
        },
        {
          "path": "components/dock-bar/dock-bar.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dock-bar/dock-bar.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "donut-chart",
      "type": "registry:component",
      "title": "Donut chart",
      "description": "Part-to-whole display with a stable center metric.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/donut-chart",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/donut-chart",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 72,
          "entranceFrames": 62,
          "exitFrames": 0,
          "contentLimits": {
            "slices": 5,
            "labelLength": 18
          },
          "reducedMotion": "slices appear without sweeping",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-ofWnusYpUpaJvzAhNMfR2DTq9+xFxntvzAfX4Lznn2k="
      },
      "files": [
        {
          "path": "components/donut-chart/donut-chart.tsx",
          "type": "registry:component",
          "target": "videos/components/donut-chart/donut-chart.tsx"
        },
        {
          "path": "components/donut-chart/donut-chart.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/donut-chart/donut-chart.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "draw-title",
      "type": "registry:component",
      "title": "Draw title",
      "description": "An outline draws across the line, then fills solid.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/draw-title",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/draw-title",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 90,
          "entranceFrames": 76,
          "exitFrames": 0,
          "contentLimits": {
            "text": 20
          },
          "reducedMotion": "the filled title fades in without the outline pass",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-PHbATKJzjDEMmMIbWvIV8EzraunR4l6ORa3J5/j59hQ="
      },
      "files": [
        {
          "path": "components/draw-title/draw-title.tsx",
          "type": "registry:component",
          "target": "videos/components/draw-title/draw-title.tsx"
        },
        {
          "path": "components/draw-title/draw-title.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/draw-title/draw-title.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dropdown-menu",
      "type": "registry:component",
      "title": "Dropdown menu",
      "description": "A dropdown menu with animated item selection.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dropdown-menu",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/dropdown-menu",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "trigger": 24
          },
          "reducedMotion": "menu shown open, no walk",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-eOUCN4fvRvuNKClBmJ9z7WywkQuylLM5HucjUJiJdao="
      },
      "files": [
        {
          "path": "components/dropdown-menu/dropdown-menu.tsx",
          "type": "registry:component",
          "target": "videos/components/dropdown-menu/dropdown-menu.tsx"
        },
        {
          "path": "components/dropdown-menu/dropdown-menu.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dropdown-menu/dropdown-menu.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "dust-motes",
      "type": "registry:component",
      "title": "Dust motes",
      "description": "Soft particles drifting across the frame.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/dust-motes",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/dust-motes",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set drift to 0 and every dot holds its seeded home position",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-qOQKRT3pOF3rEOU8FCWSi172n7mO+1pgalspZekIIGc="
      },
      "files": [
        {
          "path": "components/dust-motes/dust-motes.tsx",
          "type": "registry:component",
          "target": "videos/components/dust-motes/dust-motes.tsx"
        },
        {
          "path": "components/dust-motes/dust-motes.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/dust-motes/dust-motes.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "end-card",
      "type": "registry:component",
      "title": "End card",
      "description": "The closing frame: title, supporting line, and a call to action.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/end-card",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/end-card",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 45,
          "entranceFrames": 24,
          "exitFrames": 12,
          "contentLimits": {
            "title": 48,
            "callToAction": 28
          },
          "reducedMotion": "fades without scaling",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-SMPAY6023cY55OovWKn+zTnbBRmedORy8aJXKhOVLGY="
      },
      "files": [
        {
          "path": "components/end-card/end-card.tsx",
          "type": "registry:component",
          "target": "videos/components/end-card/end-card.tsx"
        },
        {
          "path": "components/end-card/end-card.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/end-card/end-card.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "error",
      "type": "registry:item",
      "title": "Error",
      "description": "Two falling notes for an error.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/error",
      "categories": [
        "Sound",
        "Sound/Interface"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Interface",
        "namespaced": "@odori/error",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 17,
          "minimumDurationInFrames": 17,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "ui.error",
          "export": "error"
        },
        "integrity": "sha256-Nd+UUWoliHkmXF6epNqIYWf6I0BhSj6TbllekDJDPHs="
      },
      "files": [
        {
          "path": "components/error/error.tsx",
          "type": "registry:item",
          "target": "videos/components/error/error.tsx"
        },
        {
          "path": "components/error/error.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/error/error.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "feature-stack",
      "type": "registry:component",
      "title": "Feature stack",
      "description": "A sequence of features in one card.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/feature-stack",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/feature-stack",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 28,
          "exitFrames": 0,
          "contentLimits": {
            "features": 4,
            "titleLength": 24,
            "detailLength": 56
          },
          "reducedMotion": "features cross-fade without travel",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-KixCNmroS70rm0wrQuB4cUU7+ji6DOTzG1XZBG8EBK0="
      },
      "files": [
        {
          "path": "components/feature-stack/feature-stack.tsx",
          "type": "registry:component",
          "target": "videos/components/feature-stack/feature-stack.tsx"
        },
        {
          "path": "components/feature-stack/feature-stack.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/feature-stack/feature-stack.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "file-tree",
      "type": "registry:component",
      "title": "File tree",
      "description": "Progressive repository navigation with active file state.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/file-tree",
      "categories": [
        "Developer proof",
        "Developer proof/Code"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Code",
        "namespaced": "@odori/file-tree",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 60,
          "entranceFrames": 50,
          "exitFrames": 0,
          "contentLimits": {
            "nodes": 10,
            "nameLength": 28
          },
          "reducedMotion": "rows appear together",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-MBq7Mr8/C9a3GjNsDcDb5rWnR2Ikh864vea82ByJ2Vw="
      },
      "files": [
        {
          "path": "components/file-tree/file-tree.tsx",
          "type": "registry:component",
          "target": "videos/components/file-tree/file-tree.tsx"
        },
        {
          "path": "components/file-tree/file-tree.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/file-tree/file-tree.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "flap-board",
      "type": "registry:component",
      "title": "Flap board",
      "description": "A split-flap board clatters through to the target string.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/flap-board",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/flap-board",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 100,
          "entranceFrames": 94,
          "exitFrames": 0,
          "contentLimits": {
            "text": 16
          },
          "reducedMotion": "cells show their target characters without flipping",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-EYTvpDyOjHZ6s+PCvwLXSCa+BYuObGJt1dYgasvoJ2c="
      },
      "files": [
        {
          "path": "components/flap-board/flap-board.tsx",
          "type": "registry:component",
          "target": "videos/components/flap-board/flap-board.tsx"
        },
        {
          "path": "components/flap-board/flap-board.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/flap-board/flap-board.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "focus-in",
      "type": "registry:component",
      "title": "Focus in",
      "description": "Words settle from a soft blur into a crisp line.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/focus-in",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/focus-in",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 70,
          "entranceFrames": 62,
          "exitFrames": 0,
          "contentLimits": {
            "text": 48
          },
          "reducedMotion": "words fade in without blur or scale",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-ijCYiiRx//+ZTzIml4A+uKad8YPuay408Ugs4r/giO0="
      },
      "files": [
        {
          "path": "components/focus-in/focus-in.tsx",
          "type": "registry:component",
          "target": "videos/components/focus-in/focus-in.tsx"
        },
        {
          "path": "components/focus-in/focus-in.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/focus-in/focus-in.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "form-flow",
      "type": "registry:component",
      "title": "Form flow",
      "description": "A form with validation and submission states.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/form-flow",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/form-flow",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 60,
          "entranceFrames": 14,
          "exitFrames": 20,
          "contentLimits": {
            "title": 48,
            "fields": 4,
            "submit": 24
          },
          "reducedMotion": "values appear complete rather than typing in",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-esuV4kdRCosO6ST/DQ5owBuJaWaSHw4zP2zk1LqCTh4="
      },
      "files": [
        {
          "path": "components/form-flow/form-flow.tsx",
          "type": "registry:component",
          "target": "videos/components/form-flow/form-flow.tsx"
        },
        {
          "path": "components/form-flow/form-flow.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/form-flow/form-flow.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "fx",
      "type": "registry:component",
      "title": "fx",
      "description": "A coding agent session in a terminal.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/fx",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/fx",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 120,
          "entranceFrames": 12,
          "exitFrames": 12,
          "contentLimits": {
            "query": 90,
            "model": 28
          },
          "reducedMotion": "query shown whole, caret still",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-lET8fYJoDbiSUB/u+bY/G9YpAhXpIEMClNbD1Rtok00="
      },
      "files": [
        {
          "path": "components/fx/fx.tsx",
          "type": "registry:component",
          "target": "videos/components/fx/fx.tsx"
        },
        {
          "path": "components/fx/fx.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/fx/fx.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "gel-wash",
      "type": "registry:component",
      "title": "Gel wash",
      "description": "Blurred bands of color over a dark background.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/gel-wash",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/gel-wash",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the curtains hang still in their seeded positions",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-tbLlRc31uvqEtpjMTCHmaSveTcLOGRO1orHAtg0akFA="
      },
      "files": [
        {
          "path": "components/gel-wash/gel-wash.tsx",
          "type": "registry:component",
          "target": "videos/components/gel-wash/gel-wash.tsx"
        },
        {
          "path": "components/gel-wash/gel-wash.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/gel-wash/gel-wash.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "github-comment",
      "type": "registry:component",
      "title": "GitHub comment",
      "description": "An agent response on a GitHub pull request.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/github-comment",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/github-comment",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "title": 64,
            "resolved": 40,
            "owner": 28,
            "repo": 28,
            "branch": 40,
            "base": 24
          },
          "reducedMotion": "answer placed whole, no working indicator",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-BRh18QdVuPO0GAFXbxEjpI7D06AyOJa6VQA7gLwqyUw="
      },
      "files": [
        {
          "path": "components/github-comment/github-comment.tsx",
          "type": "registry:component",
          "target": "videos/components/github-comment/github-comment.tsx"
        },
        {
          "path": "components/github-comment/github-comment.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/github-comment/github-comment.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "github-pr",
      "type": "registry:component",
      "title": "GitHub pull request",
      "description": "A pull request whose checks resolve one at a time and unlock the merge.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/github-pr",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/github-pr",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 210,
          "minimumDurationInFrames": 120,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "title": 72,
            "branch": 40,
            "base": 24,
            "author": 28
          },
          "reducedMotion": "checks resolved from the first frame, no spinner",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-dxVIl8WKsHrVxkChg6aekeU7YRy+pFA+KcirOqpYVfQ="
      },
      "files": [
        {
          "path": "components/github-pr/github-pr.tsx",
          "type": "registry:component",
          "target": "videos/components/github-pr/github-pr.tsx"
        },
        {
          "path": "components/github-pr/github-pr.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/github-pr/github-pr.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "glare-sweep",
      "type": "registry:component",
      "title": "Glare sweep",
      "description": "A light reflection that sweeps across your content.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/glare-sweep",
      "categories": [
        "Media",
        "Media/Treatments"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Treatments",
        "namespaced": "@odori/glare-sweep",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 40,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set strength to 0 and the sweep never appears",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-2pstr2QtrabV+G9QVhXLoPAH1avBWJKjZ8KHb/SGL0o="
      },
      "files": [
        {
          "path": "components/glare-sweep/glare-sweep.tsx",
          "type": "registry:component",
          "target": "videos/components/glare-sweep/glare-sweep.tsx"
        },
        {
          "path": "components/glare-sweep/glare-sweep.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/glare-sweep/glare-sweep.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "glass-caustics",
      "type": "registry:component",
      "title": "Glass caustics",
      "description": "Shifting patterns of light beneath water.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/glass-caustics",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/glass-caustics",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the net holds one pattern",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-06OCPkeOcPcLW9FkF+Ffkk9eO8se18fiGMWk8OKr06M="
      },
      "files": [
        {
          "path": "components/glass-caustics/glass-caustics.tsx",
          "type": "registry:component",
          "target": "videos/components/glass-caustics/glass-caustics.tsx"
        },
        {
          "path": "components/glass-caustics/glass-caustics.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/glass-caustics/glass-caustics.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "glitch-text",
      "type": "registry:component",
      "title": "Glitch text",
      "description": "A title that arrives through brief seeded interference bursts.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/glitch-text",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/glitch-text",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 36,
          "exitFrames": 0,
          "contentLimits": {
            "text": 24,
            "detail": 48
          },
          "reducedMotion": "the title fades in cleanly with no bursts",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-RGr5GwfNC8ciYAc/D6Y3XpK+tJUXprbw44VdiUbgCIY="
      },
      "files": [
        {
          "path": "components/glitch-text/glitch-text.tsx",
          "type": "registry:component",
          "target": "videos/components/glitch-text/glitch-text.tsx"
        },
        {
          "path": "components/glitch-text/glitch-text.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/glitch-text/glitch-text.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "glyph-rain",
      "type": "registry:component",
      "title": "Glyph rain",
      "description": "Columns of glowing, falling characters.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/glyph-rain",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/glyph-rain",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed near 0 and the rain slows to a drip",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-iPLuuJQk9fR0iXq96W1WkZQXsGcyitTTiJbWx1lwlKw="
      },
      "files": [
        {
          "path": "components/glyph-rain/glyph-rain.tsx",
          "type": "registry:component",
          "target": "videos/components/glyph-rain/glyph-rain.tsx"
        },
        {
          "path": "components/glyph-rain/glyph-rain.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/glyph-rain/glyph-rain.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "gradient-field",
      "type": "registry:component",
      "title": "Gradient field",
      "description": "A looping gradient in your brand colors.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/gradient-field",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/gradient-field",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "colors": 5
          },
          "reducedMotion": "the field holds one still position",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-dVnZONx6MQDnrb1CGz4kUAX3BRA77roTNqbHOaNv3E4="
      },
      "files": [
        {
          "path": "components/gradient-field/gradient-field.tsx",
          "type": "registry:component",
          "target": "videos/components/gradient-field/gradient-field.tsx"
        },
        {
          "path": "components/gradient-field/gradient-field.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/gradient-field/gradient-field.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "grid-pulse",
      "type": "registry:component",
      "title": "Grid pulse",
      "description": "A grid with a diagonal wave of light.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/grid-pulse",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/grid-pulse",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the wave freezes into a still emphasis gradient across the grid",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-z/DIG6dlKfezD1KWf2W6Y+fSyyf6PRPNqHIUnFNl8Cc="
      },
      "files": [
        {
          "path": "components/grid-pulse/grid-pulse.tsx",
          "type": "registry:component",
          "target": "videos/components/grid-pulse/grid-pulse.tsx"
        },
        {
          "path": "components/grid-pulse/grid-pulse.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/grid-pulse/grid-pulse.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "halftone-print",
      "type": "registry:component",
      "title": "Halftone print",
      "description": "Text revealed as a pattern of printed dots.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/halftone-print",
      "categories": [
        "Media",
        "Media/Treatments"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Treatments",
        "namespaced": "@odori/halftone-print",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 75,
          "entranceFrames": 12,
          "exitFrames": 10,
          "contentLimits": {
            "text": 16,
            "subtitle": 32
          },
          "reducedMotion": "dots shown at full size, no spread",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-kVIKkd8d1WrfDRXLwLDkqVQy2vW/Se+uuVXDh0KyLzA="
      },
      "files": [
        {
          "path": "components/halftone-print/halftone-print.tsx",
          "type": "registry:component",
          "target": "videos/components/halftone-print/halftone-print.tsx"
        },
        {
          "path": "components/halftone-print/halftone-print.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/halftone-print/halftone-print.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "halftone-reveal",
      "type": "registry:component",
      "title": "Halftone reveal",
      "description": "Content revealed through expanding dots.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/halftone-reveal",
      "categories": [
        "Motion",
        "Motion/Transitions"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Transitions",
        "namespaced": "@odori/halftone-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 32,
          "entranceFrames": 32,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "dots shown at full bleed, content present from the first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-5Jvw2olAhT9SEqtgtIxxGtoiytgLTFIHxM0tysL7L7U="
      },
      "files": [
        {
          "path": "components/halftone-reveal/halftone-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/halftone-reveal/halftone-reveal.tsx"
        },
        {
          "path": "components/halftone-reveal/halftone-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/halftone-reveal/halftone-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "heatmap",
      "type": "registry:component",
      "title": "Heatmap",
      "description": "Grid intensity reveal for activity and distribution.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/heatmap",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/heatmap",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 50,
          "exitFrames": 0,
          "contentLimits": {
            "rows": 6,
            "columns": 10
          },
          "reducedMotion": "cells appear together",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-mSGexO7vPZsbELGqd9Q+ZtE7AKBT3DFcCAyWH63GUVk="
      },
      "files": [
        {
          "path": "components/heatmap/heatmap.tsx",
          "type": "registry:component",
          "target": "videos/components/heatmap/heatmap.tsx"
        },
        {
          "path": "components/heatmap/heatmap.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/heatmap/heatmap.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "html-canvas",
      "type": "registry:component",
      "title": "HTML canvas",
      "description": "HTML authored into a canvas-safe rendered surface.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/html-canvas",
      "categories": [
        "Media",
        "Media/Canvas"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Canvas",
        "namespaced": "@odori/html-canvas",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 24,
          "entranceFrames": 12,
          "exitFrames": 0,
          "contentLimits": {
            "html": 4000
          },
          "reducedMotion": "the raster appears without fading in",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-L5HTJDRHDCGtvwPum5T9ETOIR1QPOtHoALBkZV7l2/8="
      },
      "files": [
        {
          "path": "components/html-canvas/html-canvas.tsx",
          "type": "registry:component",
          "target": "videos/components/html-canvas/html-canvas.tsx"
        },
        {
          "path": "components/html-canvas/html-canvas.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/html-canvas/html-canvas.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "icon-set",
      "type": "registry:component",
      "title": "Icon set",
      "description": "A stroked icon set that draws itself on, as editable SVG source.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/icon-set",
      "categories": [
        "Brand"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Brand",
        "category": "Brand",
        "namespaced": "@odori/icon-set",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 60,
          "entranceFrames": 18,
          "exitFrames": 0,
          "contentLimits": {
            "names": 56
          },
          "reducedMotion": "every icon renders complete, with no draw on",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-DOpNY+z84qlTEo23ih6k7j41/LSqdt/h1XPpF+7n/q0="
      },
      "files": [
        {
          "path": "components/icon-set/icon-set.tsx",
          "type": "registry:component",
          "target": "videos/components/icon-set/icon-set.tsx"
        },
        {
          "path": "components/icon-set/icon-set.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/icon-set/icon-set.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "identity-reveal",
      "type": "registry:component",
      "title": "Identity reveal",
      "description": "An animated product logo and name.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/identity-reveal",
      "categories": [
        "Brand"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Brand",
        "category": "Brand",
        "namespaced": "@odori/identity-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 60,
          "entranceFrames": 60,
          "exitFrames": 0,
          "contentLimits": {
            "wordmark": 24,
            "detail": 72
          },
          "reducedMotion": "mark and name fade in together",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-yA0YuQE1Ubpj313JrZ2bKQl5TzwzMU6IOYGspc1m2GQ="
      },
      "files": [
        {
          "path": "components/identity-reveal/identity-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/identity-reveal/identity-reveal.tsx"
        },
        {
          "path": "components/identity-reveal/identity-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/identity-reveal/identity-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "image-stage",
      "type": "registry:component",
      "title": "Image stage",
      "description": "A still with a slow push, held until it has decoded.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/image-stage",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/image-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 30,
          "entranceFrames": 16,
          "exitFrames": 0,
          "contentLimits": {
            "alt": 120
          },
          "reducedMotion": "the still holds without drifting",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-sTQVTM4pZCElHIN9KeN1QrqaXrtQwQcewxhA0LhaQsE="
      },
      "files": [
        {
          "path": "components/image-stage/image-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/image-stage/image-stage.tsx"
        },
        {
          "path": "components/image-stage/image-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/image-stage/image-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "imessage",
      "type": "registry:component",
      "title": "iMessage",
      "description": "Messages with the conversation list beside the thread, the reply growing from the typing bubble.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/imessage",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/imessage",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "contact": 24,
            "receipt": 20
          },
          "reducedMotion": "bubbles placed, no typing bubble",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-mg9JY6PwQ0Lc9v8o4c0piU0xSMD5WYPh1J0jfHn1azQ="
      },
      "files": [
        {
          "path": "components/imessage/imessage.tsx",
          "type": "registry:component",
          "target": "videos/components/imessage/imessage.tsx"
        },
        {
          "path": "components/imessage/imessage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/imessage/imessage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "ink-bloom",
      "type": "registry:component",
      "title": "Ink bloom",
      "description": "Slow, overlapping waves in two colors.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/ink-bloom",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/ink-bloom",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the interference pattern holds still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-b7FpHoTRmc4qmg+qECg/8JeYb+Wq49H4/22BkHkhC44="
      },
      "files": [
        {
          "path": "components/ink-bloom/ink-bloom.tsx",
          "type": "registry:component",
          "target": "videos/components/ink-bloom/ink-bloom.tsx"
        },
        {
          "path": "components/ink-bloom/ink-bloom.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/ink-bloom/ink-bloom.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "kaleidoscope",
      "type": "registry:component",
      "title": "Kaleidoscope",
      "description": "The picture folded into mirrored wedges, so type and interface turn into pattern.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/kaleidoscope",
      "categories": [
        "Motion",
        "Motion/Treatments"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Treatments",
        "namespaced": "@odori/kaleidoscope",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set mix to 0 and the picture is untouched",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-tbUCI3ZMJiTKFkAsOpYRBcdVK39eii0gqUqLRSYhRpM="
      },
      "files": [
        {
          "path": "components/kaleidoscope/kaleidoscope.tsx",
          "type": "registry:component",
          "target": "videos/components/kaleidoscope/kaleidoscope.tsx"
        },
        {
          "path": "components/kaleidoscope/kaleidoscope.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/kaleidoscope/kaleidoscope.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "kinetic-center",
      "type": "registry:component",
      "title": "Kinetic center",
      "description": "A centered statement assembled from timed word groups.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/kinetic-center",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/kinetic-center",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 33,
          "exitFrames": 10,
          "contentLimits": {
            "groups": 6,
            "groupLength": 16
          },
          "reducedMotion": "groups fade without scaling",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-BHuhrASqwm5jW68NmG5YdXtbsFUY7jexYYCpNKs0bZI="
      },
      "files": [
        {
          "path": "components/kinetic-center/kinetic-center.tsx",
          "type": "registry:component",
          "target": "videos/components/kinetic-center/kinetic-center.tsx"
        },
        {
          "path": "components/kinetic-center/kinetic-center.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/kinetic-center/kinetic-center.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "line-chart",
      "type": "registry:component",
      "title": "Line chart",
      "description": "Time-series path draw with optional focal annotation.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/line-chart",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/line-chart",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 78,
          "entranceFrames": 64,
          "exitFrames": 0,
          "contentLimits": {
            "points": 16
          },
          "reducedMotion": "the full path is drawn immediately",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-5HTcR6lw8KsobEOqedNbA677Mx7lahzvHVCUWblRKHE="
      },
      "files": [
        {
          "path": "components/line-chart/line-chart.tsx",
          "type": "registry:component",
          "target": "videos/components/line-chart/line-chart.tsx"
        },
        {
          "path": "components/line-chart/line-chart.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/line-chart/line-chart.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "linear",
      "type": "registry:component",
      "title": "Linear",
      "description": "A Linear workspace where an agent comments on an issue and moves it to done.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/linear",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/linear",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "id": 16,
            "title": 72,
            "status": 20,
            "movesTo": 20,
            "workspace": 24,
            "team": 24
          },
          "reducedMotion": "status shown resolved, no chip transition",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-yNZHQOSaooOxj1gIDZJEky9OZAVMivydYubKEkqA1YE="
      },
      "files": [
        {
          "path": "components/linear/linear.tsx",
          "type": "registry:component",
          "target": "videos/components/linear/linear.tsx"
        },
        {
          "path": "components/linear/linear.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/linear/linear.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "liquid-title",
      "type": "registry:component",
      "title": "Liquid title",
      "description": "A headline displaced by moving glass that settles as the shot goes on.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/liquid-title",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/liquid-title",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set amount to 0 and the type is undisturbed",
          "requires": {
            "fonts": [
              "display",
              "sans"
            ],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-p9c9wme8/ePUDpw/VYlpy/PJm/shiwvdwyHZkK9sax4="
      },
      "files": [
        {
          "path": "components/liquid-title/liquid-title.tsx",
          "type": "registry:component",
          "target": "videos/components/liquid-title/liquid-title.tsx"
        },
        {
          "path": "components/liquid-title/liquid-title.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/liquid-title/liquid-title.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "log-stream",
      "type": "registry:component",
      "title": "Log stream",
      "description": "Paced runtime logs with levels and bounded scrolling.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/log-stream",
      "categories": [
        "Developer proof",
        "Developer proof/Terminal"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Terminal",
        "namespaced": "@odori/log-stream",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 14,
          "exitFrames": 0,
          "contentLimits": {
            "entries": 10,
            "messageLength": 56
          },
          "reducedMotion": "lines appear without travel",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-//TliISMvv9UDmcJb81+kd6TCtsLBJQRQ1E+Vz0HC4A="
      },
      "files": [
        {
          "path": "components/log-stream/log-stream.tsx",
          "type": "registry:component",
          "target": "videos/components/log-stream/log-stream.tsx"
        },
        {
          "path": "components/log-stream/log-stream.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/log-stream/log-stream.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "logo-orbit",
      "type": "registry:component",
      "title": "Logo orbit",
      "description": "Product identity surrounded by connected integrations.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/logo-orbit",
      "categories": [
        "Brand"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Brand",
        "category": "Brand",
        "namespaced": "@odori/logo-orbit",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 68,
          "exitFrames": 0,
          "contentLimits": {
            "around": 8,
            "labelLength": 16
          },
          "reducedMotion": "marks appear without scaling",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-MswrlUm30CDma3OyobAl5UsYb1KINbATX3cvTj5dmok="
      },
      "files": [
        {
          "path": "components/logo-orbit/logo-orbit.tsx",
          "type": "registry:component",
          "target": "videos/components/logo-orbit/logo-orbit.tsx"
        },
        {
          "path": "components/logo-orbit/logo-orbit.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/logo-orbit/logo-orbit.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "marks-starter",
      "type": "registry:component",
      "title": "Marks starter",
      "description": "Placeholder marks that draw themselves on, as editable SVG source.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/marks-starter",
      "categories": [
        "Brand"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Brand",
        "category": "Brand",
        "namespaced": "@odori/marks-starter",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 24,
          "entranceFrames": 24,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the mark renders complete, with no draw on",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-Heh2+O4/Ge7Z84kbHGpia1cJPtgXkoR14G3ZU2mYIZc="
      },
      "files": [
        {
          "path": "components/marks-starter/marks-starter.tsx",
          "type": "registry:component",
          "target": "videos/components/marks-starter/marks-starter.tsx"
        },
        {
          "path": "components/marks-starter/marks-starter.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/marks-starter/marks-starter.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "mask-reveal",
      "type": "registry:component",
      "title": "Mask reveal",
      "description": "Clipped media and typography, revealed at full strength.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/mask-reveal",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/mask-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 24,
          "entranceFrames": 24,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the content is fully unmasked from the first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-yM+zzdfnC+E2b8zGHkoaOtvuThK7XC/Hfi0F/UFvW6s="
      },
      "files": [
        {
          "path": "components/mask-reveal/mask-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/mask-reveal/mask-reveal.tsx"
        },
        {
          "path": "components/mask-reveal/mask-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/mask-reveal/mask-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "masonry-assemble",
      "type": "registry:component",
      "title": "Masonry assemble",
      "description": "A masonry grid that lays itself out tile by tile on a seeded stagger, then holds.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/masonry-assemble",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/masonry-assemble",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 90,
          "entranceFrames": 70,
          "exitFrames": 0,
          "contentLimits": {
            "items": 12
          },
          "reducedMotion": "tiles fade in together without rising",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-mNcTgpfUQkV93fR/N1zUI6Bb0+A600Le1YLYFPa82fE="
      },
      "files": [
        {
          "path": "components/masonry-assemble/masonry-assemble.tsx",
          "type": "registry:component",
          "target": "videos/components/masonry-assemble/masonry-assemble.tsx"
        },
        {
          "path": "components/masonry-assemble/masonry-assemble.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/masonry-assemble/masonry-assemble.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "mesh-gradient",
      "type": "registry:component",
      "title": "Mesh gradient",
      "description": "A shifting blend of colored gradients.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/mesh-gradient",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/mesh-gradient",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set drift to 0 and the field holds still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-PFnsWA3zp+9Nz5tQ8pm8RaeCsFieya0PLdCHwwHEUVE="
      },
      "files": [
        {
          "path": "components/mesh-gradient/mesh-gradient.tsx",
          "type": "registry:component",
          "target": "videos/components/mesh-gradient/mesh-gradient.tsx"
        },
        {
          "path": "components/mesh-gradient/mesh-gradient.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/mesh-gradient/mesh-gradient.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "meta-blobs",
      "type": "registry:component",
      "title": "Meta blobs",
      "description": "Seeded blobs orbiting through one gooey silhouette, merging and parting as they pass.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/meta-blobs",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/meta-blobs",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the silhouette holds still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-6BqmIcJ8PEcAnOtfrrWcX0vp9CeRcVCg/FjAEa8pgrU="
      },
      "files": [
        {
          "path": "components/meta-blobs/meta-blobs.tsx",
          "type": "registry:component",
          "target": "videos/components/meta-blobs/meta-blobs.tsx"
        },
        {
          "path": "components/meta-blobs/meta-blobs.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/meta-blobs/meta-blobs.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "metric-callout",
      "type": "registry:component",
      "title": "Metric callout",
      "description": "A single counted number with a supporting label.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/metric-callout",
      "categories": [
        "Typography",
        "Typography/Figures"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Figures",
        "namespaced": "@odori/metric-callout",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 60,
          "entranceFrames": 40,
          "exitFrames": 8,
          "contentLimits": {
            "label": 48
          },
          "reducedMotion": "shows the final value immediately",
          "requires": {
            "fonts": [
              "mono",
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-tA/3JoHZ9WnKlLFcbYgDtwAXQTWuxrBCCEd5OMNkY1s="
      },
      "files": [
        {
          "path": "components/metric-callout/metric-callout.tsx",
          "type": "registry:component",
          "target": "videos/components/metric-callout/metric-callout.tsx"
        },
        {
          "path": "components/metric-callout/metric-callout.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/metric-callout/metric-callout.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "modal-flow",
      "type": "registry:component",
      "title": "Modal flow",
      "description": "Trigger, dialog, confirmation, and the state it resolves to.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/modal-flow",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/modal-flow",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 12,
          "exitFrames": 10,
          "contentLimits": {
            "title": 64,
            "body": 160,
            "confirm": 24,
            "cancel": 24,
            "resolved": 40
          },
          "reducedMotion": "the dialog cuts between states without scaling",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-58YpzoDGyxUrRYx9sZd7KflalZE8JEECIs/F8jCFoug="
      },
      "files": [
        {
          "path": "components/modal-flow/modal-flow.tsx",
          "type": "registry:component",
          "target": "videos/components/modal-flow/modal-flow.tsx"
        },
        {
          "path": "components/modal-flow/modal-flow.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/modal-flow/modal-flow.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "molten-flow",
      "type": "registry:component",
      "title": "Molten flow",
      "description": "Flowing metallic ripples.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/molten-flow",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/molten-flow",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the surface holds one lit still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-FAe64fnREIGNzjAWxJXfghseMl7Ly887gsV/VEuwwNQ="
      },
      "files": [
        {
          "path": "components/molten-flow/molten-flow.tsx",
          "type": "registry:component",
          "target": "videos/components/molten-flow/molten-flow.tsx"
        },
        {
          "path": "components/molten-flow/molten-flow.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/molten-flow/molten-flow.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "noise-field",
      "type": "registry:component",
      "title": "Noise field",
      "description": "Animated noise in your brand colors.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/noise-field",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/noise-field",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the field holds still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-LTEY5gF2nid9Mnet2rcemd3Ht5W0JZCD/PYM2ZPJFtY="
      },
      "files": [
        {
          "path": "components/noise-field/noise-field.tsx",
          "type": "registry:component",
          "target": "videos/components/noise-field/noise-field.tsx"
        },
        {
          "path": "components/noise-field/noise-field.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/noise-field/noise-field.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "notify",
      "type": "registry:item",
      "title": "Notification",
      "description": "A soft bell for notifications.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/notify",
      "categories": [
        "Sound",
        "Sound/Interface"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Interface",
        "namespaced": "@odori/notify",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 27,
          "minimumDurationInFrames": 27,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "ui.notify",
          "export": "notify"
        },
        "integrity": "sha256-dc/ig/ao+gCV+7L4eeSxs7vi+HSVxAXV6raLyRZHAb8="
      },
      "files": [
        {
          "path": "components/notify/notify.tsx",
          "type": "registry:item",
          "target": "videos/components/notify/notify.tsx"
        },
        {
          "path": "components/notify/notify.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/notify/notify.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "opencode",
      "type": "registry:component",
      "title": "OpenCode",
      "description": "An open coding agent's terminal session, with the query typed under its wordmark.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/opencode",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/opencode",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 120,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "query": 90,
            "project": 28,
            "model": 28,
            "version": 12
          },
          "reducedMotion": "query shown whole, caret still",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-oMWeTe3Ud8GywAt4n3CnGYwQHwQjq++wmsSCWXM1318="
      },
      "files": [
        {
          "path": "components/opencode/opencode.tsx",
          "type": "registry:component",
          "target": "videos/components/opencode/opencode.tsx"
        },
        {
          "path": "components/opencode/opencode.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/opencode/opencode.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "orbit-gallery",
      "type": "registry:component",
      "title": "Orbit gallery",
      "description": "Tiles drifting past the front of a shallow 3D ring.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/orbit-gallery",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/orbit-gallery",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 90,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "children": 8
          },
          "reducedMotion": "the ring holds still with one tile at the front",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-QtbG6ChGcsFKSGAboRwjNSfi8UNXVoZq8UyZSJitc2g="
      },
      "files": [
        {
          "path": "components/orbit-gallery/orbit-gallery.tsx",
          "type": "registry:component",
          "target": "videos/components/orbit-gallery/orbit-gallery.tsx"
        },
        {
          "path": "components/orbit-gallery/orbit-gallery.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/orbit-gallery/orbit-gallery.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "orbit-text",
      "type": "registry:component",
      "title": "Orbit text",
      "description": "A phrase circles slowly, badge-style, around a centerpiece.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/orbit-text",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/orbit-text",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 60,
          "entranceFrames": 24,
          "exitFrames": 0,
          "contentLimits": {
            "text": 32
          },
          "reducedMotion": "the ring fades in and holds still instead of rotating",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-ItWD43VlgPT+PeoEOHq+j7iAMa9ISzmeBUpM2yrbu7A="
      },
      "files": [
        {
          "path": "components/orbit-text/orbit-text.tsx",
          "type": "registry:component",
          "target": "videos/components/orbit-text/orbit-text.tsx"
        },
        {
          "path": "components/orbit-text/orbit-text.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/orbit-text/orbit-text.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "parallax-card",
      "type": "registry:component",
      "title": "Parallax card",
      "description": "A tilting card with moving light and shadow.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/parallax-card",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/parallax-card",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the plane holds level with a static sheen and shadow",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-kbtx9bP/TI2hbNN0qfJQIc4/+j92ciM1HUngX0Drgjg="
      },
      "files": [
        {
          "path": "components/parallax-card/parallax-card.tsx",
          "type": "registry:component",
          "target": "videos/components/parallax-card/parallax-card.tsx"
        },
        {
          "path": "components/parallax-card/parallax-card.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/parallax-card/parallax-card.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "phone-3d",
      "type": "registry:component",
      "title": "3D phone",
      "description": "A rounded 3D phone with an editable React screen, camera pose, glass, and metal edges.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/phone-3d",
      "categories": [
        "Interface",
        "Interface/Chrome"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Chrome",
        "namespaced": "@odori/phone-3d",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 1,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "The phone is static unless the caller changes its pose; set animate to false in the preview.",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-6u4neiJ62fxunmokHS7SKNJWOcH+vGtcCz0O9A/sWLY="
      },
      "files": [
        {
          "path": "components/phone-3d/phone-3d.tsx",
          "type": "registry:component",
          "target": "videos/components/phone-3d/phone-3d.tsx"
        },
        {
          "path": "components/phone-3d/geometry.ts",
          "type": "registry:component",
          "target": "videos/components/phone-3d/geometry.ts"
        },
        {
          "path": "components/phone-3d/phone-3d.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/phone-3d/phone-3d.preview.tsx"
        },
        {
          "path": "components/phone-3d/README.md",
          "type": "registry:component",
          "target": "videos/components/phone-3d/README.md"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "pixel-wipe",
      "type": "registry:component",
      "title": "Pixel wipe",
      "description": "A cover of solid blocks clearing one by one, a wipe that travels but crackles.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/pixel-wipe",
      "categories": [
        "Motion",
        "Motion/Transitions"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Transitions",
        "namespaced": "@odori/pixel-wipe",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 30,
          "entranceFrames": 30,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the cover is gone from the first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-8CfRonSESskC5Fqm8zx9gcChfPinbQfPQ8zk7HvjvcU="
      },
      "files": [
        {
          "path": "components/pixel-wipe/pixel-wipe.tsx",
          "type": "registry:component",
          "target": "videos/components/pixel-wipe/pixel-wipe.tsx"
        },
        {
          "path": "components/pixel-wipe/pixel-wipe.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/pixel-wipe/pixel-wipe.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "pointer-trail",
      "type": "registry:component",
      "title": "Pointer trail",
      "description": "A scripted pointer that leaves a fading trail along its path.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/pointer-trail",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/pointer-trail",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 50,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "waypoints": 8
          },
          "reducedMotion": "the pointer rests at its final waypoint with no trail",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-nPFGIIK76Un5zvKobIXlgi2y3pCZM2jMseUjgh0/vQg="
      },
      "files": [
        {
          "path": "components/pointer-trail/pointer-trail.tsx",
          "type": "registry:component",
          "target": "videos/components/pointer-trail/pointer-trail.tsx"
        },
        {
          "path": "components/pointer-trail/pointer-trail.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/pointer-trail/pointer-trail.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "pop",
      "type": "registry:item",
      "title": "Pop",
      "description": "A short pop for an entrance or transition.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/pop",
      "categories": [
        "Sound",
        "Sound/Interface"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Interface",
        "namespaced": "@odori/pop",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 4,
          "minimumDurationInFrames": 4,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "ui.pop",
          "export": "pop"
        },
        "integrity": "sha256-s+PDKO02hZg5bgqzn+2Ta62gkspKWzaUZ2paE71IsrI="
      },
      "files": [
        {
          "path": "components/pop/pop.tsx",
          "type": "registry:item",
          "target": "videos/components/pop/pop.tsx"
        },
        {
          "path": "components/pop/pop.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/pop/pop.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "progress-ring",
      "type": "registry:component",
      "title": "Progress ring",
      "description": "Circular completion display with restrained motion.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/progress-ring",
      "categories": [
        "Data"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Data",
        "category": "Data",
        "namespaced": "@odori/progress-ring",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 66,
          "entranceFrames": 64,
          "exitFrames": 0,
          "contentLimits": {
            "label": 40
          },
          "reducedMotion": "the ring is drawn at its final value",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-tG2+5SkuxChiZRzp3GXZxrc6St5yj7u0bFn7r9BM0rg="
      },
      "files": [
        {
          "path": "components/progress-ring/progress-ring.tsx",
          "type": "registry:component",
          "target": "videos/components/progress-ring/progress-ring.tsx"
        },
        {
          "path": "components/progress-ring/progress-ring.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/progress-ring/progress-ring.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "push-through",
      "type": "registry:component",
      "title": "Push through",
      "description": "A scene arriving by pushing the last one out of frame.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/push-through",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/push-through",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 30,
          "entranceFrames": 15,
          "exitFrames": 15,
          "contentLimits": {},
          "reducedMotion": "the arriving scene appears in place, with no travel",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-HhqXcppezwiuxjpNBx8BV95mJtWTWfypFnb0+Djlv2E="
      },
      "files": [
        {
          "path": "components/push-through/push-through.tsx",
          "type": "registry:component",
          "target": "videos/components/push-through/push-through.tsx"
        },
        {
          "path": "components/push-through/push-through.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/push-through/push-through.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "rain-glass",
      "type": "registry:component",
      "title": "Rain glass",
      "description": "Content seen through a rained-on pane: seeded droplets refract it, the glass between them hazes it.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/rain-glass",
      "categories": [
        "Motion",
        "Motion/Treatments"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion/Treatments",
        "namespaced": "@odori/rain-glass",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set slide to 0 and the drops hold still on the pane",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-1iVJG33VbIrwq9sDmA9HxWmLilvQ91Gl7bc8C+FTkpU="
      },
      "files": [
        {
          "path": "components/rain-glass/rain-glass.tsx",
          "type": "registry:component",
          "target": "videos/components/rain-glass/rain-glass.tsx"
        },
        {
          "path": "components/rain-glass/rain-glass.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/rain-glass/rain-glass.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "resolve-text",
      "type": "registry:component",
      "title": "Resolve text",
      "description": "Glyphs flicker through seeded noise and lock in left to right.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/resolve-text",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/resolve-text",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 90,
          "entranceFrames": 80,
          "exitFrames": 0,
          "contentLimits": {
            "text": 20
          },
          "reducedMotion": "glyphs appear already resolved, without the flicker",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-w19lTf/a075/VLaddDLG2+Dn/8sQLol5Q6vVvTlpEbQ="
      },
      "files": [
        {
          "path": "components/resolve-text/resolve-text.tsx",
          "type": "registry:component",
          "target": "videos/components/resolve-text/resolve-text.tsx"
        },
        {
          "path": "components/resolve-text/resolve-text.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/resolve-text/resolve-text.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "review-card",
      "type": "registry:component",
      "title": "Review card",
      "description": "A review comment with an animated action button.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/review-card",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/review-card",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 48,
          "entranceFrames": 24,
          "exitFrames": 10,
          "contentLimits": {
            "reviewers": 4,
            "title": 34,
            "status": 30
          },
          "reducedMotion": "the card arrives already passed",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-BDidIAB8au+y2UQxoMerMBuxfDuCOQPDmJniUaYHFE0="
      },
      "files": [
        {
          "path": "components/review-card/review-card.tsx",
          "type": "registry:component",
          "target": "videos/components/review-card/review-card.tsx"
        },
        {
          "path": "components/review-card/review-card.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/review-card/review-card.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "rolling-number",
      "type": "registry:component",
      "title": "Rolling number",
      "description": "Metrics roll without width changes or digit jitter.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/rolling-number",
      "categories": [
        "Typography",
        "Typography/Figures"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Figures",
        "namespaced": "@odori/rolling-number",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 54,
          "entranceFrames": 54,
          "exitFrames": 0,
          "contentLimits": {
            "label": 48
          },
          "reducedMotion": "the final value is shown immediately",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-TAVlaAOKYgz9zuT75bp4CciulrkiESKRibcJT67boy0="
      },
      "files": [
        {
          "path": "components/rolling-number/rolling-number.tsx",
          "type": "registry:component",
          "target": "videos/components/rolling-number/rolling-number.tsx"
        },
        {
          "path": "components/rolling-number/rolling-number.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/rolling-number/rolling-number.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "safe-area",
      "type": "registry:component",
      "title": "Safe area",
      "description": "Format-aware title and action safety boundaries.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/safe-area",
      "categories": [
        "Foundation"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Foundation",
        "category": "Foundation",
        "namespaced": "@odori/safe-area",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 24,
          "entranceFrames": 18,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "guides appear without fading",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-bTtHvD0B8NJhA3YrI+9WCSrthDUmqqnwRCK8tH8z0wU="
      },
      "files": [
        {
          "path": "components/safe-area/safe-area.tsx",
          "type": "registry:component",
          "target": "videos/components/safe-area/safe-area.tsx"
        },
        {
          "path": "components/safe-area/safe-area.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/safe-area/safe-area.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "satin-fold",
      "type": "registry:component",
      "title": "Satin fold",
      "description": "Moving folds of light and shadow.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/satin-fold",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/satin-fold",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the ribbons hold one still curve",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-BdkAYCFOD1TqqDZASXqR4pIyAeu6ID3xnyD9Dbem4TQ="
      },
      "files": [
        {
          "path": "components/satin-fold/satin-fold.tsx",
          "type": "registry:component",
          "target": "videos/components/satin-fold/satin-fold.tsx"
        },
        {
          "path": "components/satin-fold/satin-fold.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/satin-fold/satin-fold.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "scan-glow",
      "type": "registry:component",
      "title": "Scan glow",
      "description": "Fine scanlines with one soft refresh band sweeping down on a slow cycle, under a faint vignette.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/scan-glow",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/scan-glow",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set sweepSeconds to 0 and only the still line texture and vignette remain",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-6RcIEkIs+95eOWz7dynnNskMeQTkF0egaplRqYNhlM4="
      },
      "files": [
        {
          "path": "components/scan-glow/scan-glow.tsx",
          "type": "registry:component",
          "target": "videos/components/scan-glow/scan-glow.tsx"
        },
        {
          "path": "components/scan-glow/scan-glow.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/scan-glow/scan-glow.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "screenshot-focus",
      "type": "registry:component",
      "title": "Screenshot focus",
      "description": "A camera move from the whole interface to one detail.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/screenshot-focus",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/screenshot-focus",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "caption": 64
          },
          "reducedMotion": "the wide frame is held, with the marker in place",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-n1qj+/ofnFrQblc37nnxirJNF+EImIcZYJ2AVfhDrj4="
      },
      "files": [
        {
          "path": "components/screenshot-focus/screenshot-focus.tsx",
          "type": "registry:component",
          "target": "videos/components/screenshot-focus/screenshot-focus.tsx"
        },
        {
          "path": "components/screenshot-focus/screenshot-focus.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/screenshot-focus/screenshot-focus.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "settings-toggles",
      "type": "registry:component",
      "title": "Settings toggles",
      "description": "Switches flipping one at a time, the knob travelling and the track filling behind it.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/settings-toggles",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/settings-toggles",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "title": 24
          },
          "reducedMotion": "switches shown in final state",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-TvnjXixriupFIzx4DY5pDfVLT93efp0/vSPRC9QJk9s="
      },
      "files": [
        {
          "path": "components/settings-toggles/settings-toggles.tsx",
          "type": "registry:component",
          "target": "videos/components/settings-toggles/settings-toggles.tsx"
        },
        {
          "path": "components/settings-toggles/settings-toggles.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/settings-toggles/settings-toggles.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "shader-filter",
      "type": "registry:component",
      "title": "Shader filter",
      "description": "Grain, vignettes, and other WGSL passes drawn through WebGPU, layered over ordinary content.",
      "author": "Odori",
      "dependencies": [
        "odori",
        "vgpu"
      ],
      "registryDependencies": [
        "shader-stage"
      ],
      "docs": "https://odori.dev/components/shader-filter",
      "categories": [
        "Shaders"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Shaders",
        "category": "Shaders",
        "namespaced": "@odori/shader-filter",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "motion is the shader's own; pass calmer uniforms",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-V/tZOFWslr0bhMBAFvFECVmGPsogjwNfQkqEIeipEYM="
      },
      "files": [
        {
          "path": "components/shader-filter/shader-filter.tsx",
          "type": "registry:component",
          "target": "videos/components/shader-filter/shader-filter.tsx"
        },
        {
          "path": "components/shader-filter/shader-filter.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/shader-filter/shader-filter.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "shader-stage",
      "type": "registry:component",
      "title": "Shader stage",
      "description": "A WGSL fragment shader drawn through WebGPU on the frame clock.",
      "author": "Odori",
      "dependencies": [
        "odori",
        "vgpu"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/shader-stage",
      "categories": [
        "Shaders"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Shaders",
        "category": "Shaders",
        "namespaced": "@odori/shader-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "motion is the shader's own; pass calmer uniforms",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-e3Z9w34hUbXyTg0P6Fw0g3iZr45KzF9hDlEX0zYa05g="
      },
      "files": [
        {
          "path": "components/shader-stage/shader-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/shader-stage/shader-stage.tsx"
        },
        {
          "path": "components/shader-stage/shader-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/shader-stage/shader-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "shape-lattice",
      "type": "registry:component",
      "title": "Shape lattice",
      "description": "Circles, squares and triangles on a strict pitch, each turning a beat after the cell before it.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/shape-lattice",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/shape-lattice",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and every mark holds one angle",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-w5uWncjBKBT5fTPHzi+1Yd1n7JBcupSxANzeUhAFokk="
      },
      "files": [
        {
          "path": "components/shape-lattice/shape-lattice.tsx",
          "type": "registry:component",
          "target": "videos/components/shape-lattice/shape-lattice.tsx"
        },
        {
          "path": "components/shape-lattice/shape-lattice.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/shape-lattice/shape-lattice.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "shared-axis",
      "type": "registry:component",
      "title": "Shared axis",
      "description": "Related scenes travelling on one spatial axis.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/shared-axis",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/shared-axis",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 30,
          "entranceFrames": 12,
          "exitFrames": 12,
          "contentLimits": {},
          "reducedMotion": "the scenes cross-fade without moving",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-faQjntSj6q9iio6nLyxZkYjXTN7vEJ8dkFK80CCPD10="
      },
      "files": [
        {
          "path": "components/shared-axis/shared-axis.tsx",
          "type": "registry:component",
          "target": "videos/components/shared-axis/shared-axis.tsx"
        },
        {
          "path": "components/shared-axis/shared-axis.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/shared-axis/shared-axis.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "sheen-text",
      "type": "registry:component",
      "title": "Sheen text",
      "description": "A single accent sweep crosses an already-set line.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/sheen-text",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/sheen-text",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "text": 32
          },
          "reducedMotion": "the line is shown in the foreground color with no sweep",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-m31PVPgkLRzcq7zjFWAPXbnWU2Zl9sIilg9sDVAY634="
      },
      "files": [
        {
          "path": "components/sheen-text/sheen-text.tsx",
          "type": "registry:component",
          "target": "videos/components/sheen-text/sheen-text.tsx"
        },
        {
          "path": "components/sheen-text/sheen-text.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/sheen-text/sheen-text.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "sheet-panel",
      "type": "registry:component",
      "title": "Sheet",
      "description": "A side panel arriving while the page behind it gives way.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/sheet-panel",
      "categories": [
        "Interface",
        "Interface/Chrome"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Chrome",
        "namespaced": "@odori/sheet-panel",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "title": 32,
            "description": 48,
            "action": 24
          },
          "reducedMotion": "panel shown open, no slide",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-lJxjR4+0MacsaLFpBuQpVCpGMNGAV12h22WrLW2T7zw="
      },
      "files": [
        {
          "path": "components/sheet-panel/sheet-panel.tsx",
          "type": "registry:component",
          "target": "videos/components/sheet-panel/sheet-panel.tsx"
        },
        {
          "path": "components/sheet-panel/sheet-panel.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/sheet-panel/sheet-panel.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "skeleton-load",
      "type": "registry:component",
      "title": "Skeleton",
      "description": "Placeholders shimmering, then resolving row by row into content of the same height.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/skeleton-load",
      "categories": [
        "Interface",
        "Interface/Feedback"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Feedback",
        "namespaced": "@odori/skeleton-load",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {
            "title": 32
          },
          "reducedMotion": "content shown resolved, no shimmer",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-auzicEgfJ5QQRNQPJh4wuHA1Vef/FF9XQeS+oiZccbI="
      },
      "files": [
        {
          "path": "components/skeleton-load/skeleton-load.tsx",
          "type": "registry:component",
          "target": "videos/components/skeleton-load/skeleton-load.tsx"
        },
        {
          "path": "components/skeleton-load/skeleton-load.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/skeleton-load/skeleton-load.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "slack",
      "type": "registry:component",
      "title": "Slack",
      "description": "A Slack channel where a question is answered by an app in its thread.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/slack",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/slack",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "workspace": 24,
            "channel": 24
          },
          "reducedMotion": "messages placed, no working indicator",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-kQ0NEGoEZ5fSV2ke6kPbvoZ/5rCi3K/4j3K1X1E21nI="
      },
      "files": [
        {
          "path": "components/slack/slack.tsx",
          "type": "registry:component",
          "target": "videos/components/slack/slack.tsx"
        },
        {
          "path": "components/slack/slack.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/slack/slack.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "soft-blur-in",
      "type": "registry:component",
      "title": "Soft blur in",
      "description": "Content fades in from a soft blur.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/soft-blur-in",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/soft-blur-in",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 34,
          "exitFrames": 10,
          "contentLimits": {
            "title": 64,
            "detail": 96
          },
          "reducedMotion": "fades without blur",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-3btCwGa3uVWD58n0CYJvYdX9nTaop08XyVH3y/amuC0="
      },
      "files": [
        {
          "path": "components/soft-blur-in/soft-blur-in.tsx",
          "type": "registry:component",
          "target": "videos/components/soft-blur-in/soft-blur-in.tsx"
        },
        {
          "path": "components/soft-blur-in/soft-blur-in.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/soft-blur-in/soft-blur-in.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "spiral-arm",
      "type": "registry:component",
      "title": "Spiral arm",
      "description": "A galaxy under differential rotation: the core outruns the rim and the arms wind as it turns.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/spiral-arm",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/spiral-arm",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 300,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the galaxy holds still",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-xayazEx2KdwOlYwVNR15Dp9aYOf0ejXvW0uMnEVC0i0="
      },
      "files": [
        {
          "path": "components/spiral-arm/spiral-arm.tsx",
          "type": "registry:component",
          "target": "videos/components/spiral-arm/spiral-arm.tsx"
        },
        {
          "path": "components/spiral-arm/spiral-arm.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/spiral-arm/spiral-arm.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "split-layout",
      "type": "registry:component",
      "title": "Split layout",
      "description": "Responsive two-up composition for proof and explanation.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/split-layout",
      "categories": [
        "Foundation"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Foundation",
        "category": "Foundation",
        "namespaced": "@odori/split-layout",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 44,
          "exitFrames": 0,
          "contentLimits": {
            "title": 48,
            "detail": 96
          },
          "reducedMotion": "both panels fade without travel",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-jojDXS2a+Q0RpAgl60rvSrjbjXrOatYAS4W7n0qeSHE="
      },
      "files": [
        {
          "path": "components/split-layout/split-layout.tsx",
          "type": "registry:component",
          "target": "videos/components/split-layout/split-layout.tsx"
        },
        {
          "path": "components/split-layout/split-layout.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/split-layout/split-layout.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "split-wipe",
      "type": "registry:component",
      "title": "Split wipe",
      "description": "Two panels parting to reveal the scene behind them.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/split-wipe",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/split-wipe",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 26,
          "entranceFrames": 26,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the panels are open from the first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-snihIwbLp10dzbnHxp0DUR1euhUQ2p+cJX+yZHDQ8Fo="
      },
      "files": [
        {
          "path": "components/split-wipe/split-wipe.tsx",
          "type": "registry:component",
          "target": "videos/components/split-wipe/split-wipe.tsx"
        },
        {
          "path": "components/split-wipe/split-wipe.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/split-wipe/split-wipe.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "spotlight-card",
      "type": "registry:component",
      "title": "Spotlight card",
      "description": "A row of cards that a soft light visits in turn, dwelling and travelling on the frame clock.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/spotlight-card",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/spotlight-card",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 64,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {
            "items": 4,
            "title": 20,
            "body": 48
          },
          "reducedMotion": "the light rests on the first card and nothing dims or lifts",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-xQcIUk1YFkGXx1w8zrZG3qfRc4xib/YXNuSv5i+c0ks="
      },
      "files": [
        {
          "path": "components/spotlight-card/spotlight-card.tsx",
          "type": "registry:component",
          "target": "videos/components/spotlight-card/spotlight-card.tsx"
        },
        {
          "path": "components/spotlight-card/spotlight-card.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/spotlight-card/spotlight-card.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "stage",
      "type": "registry:component",
      "title": "Stage",
      "description": "The shared backdrop: hairline grid, soft glow, and vignette.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/stage",
      "categories": [
        "Foundation"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Foundation",
        "category": "Foundation",
        "namespaced": "@odori/stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 24,
          "entranceFrames": 24,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "static grid without drift",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-1yxK16o3ao4w5fkf6WXRBKmW84fjiu3h0+J80BlLvjQ="
      },
      "files": [
        {
          "path": "components/stage/stage.tsx",
          "type": "registry:component",
          "target": "videos/components/stage/stage.tsx"
        },
        {
          "path": "components/stage/stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/stage/stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "staggered-lines",
      "type": "registry:component",
      "title": "Staggered lines",
      "description": "Two line hierarchy with independent entrance timing.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/staggered-lines",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/staggered-lines",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 48,
          "entranceFrames": 32,
          "exitFrames": 10,
          "contentLimits": {
            "lines": 3,
            "lineLength": 42
          },
          "reducedMotion": "lines fade in together",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-VBKd1ztz5DBAoPFtC9GZ7AeagKy1dwwB1d5NwjG6vuE="
      },
      "files": [
        {
          "path": "components/staggered-lines/staggered-lines.tsx",
          "type": "registry:component",
          "target": "videos/components/staggered-lines/staggered-lines.tsx"
        },
        {
          "path": "components/staggered-lines/staggered-lines.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/staggered-lines/staggered-lines.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "starfield",
      "type": "registry:component",
      "title": "Starfield",
      "description": "Drifting, twinkling stars with parallax.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/starfield",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/starfield",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed and twinkle to 0 and the sky is a still seeded star chart",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-GVswx46jy9b+pHv9zQyV8PRlQ0ajt4JUFtUDvnFuHnw="
      },
      "files": [
        {
          "path": "components/starfield/starfield.tsx",
          "type": "registry:component",
          "target": "videos/components/starfield/starfield.tsx"
        },
        {
          "path": "components/starfield/starfield.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/starfield/starfield.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "state-transition",
      "type": "registry:component",
      "title": "State transition",
      "description": "Before, processing, and resolved product states.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/state-transition",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/state-transition",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 120,
          "entranceFrames": 14,
          "exitFrames": 0,
          "contentLimits": {
            "from": 24,
            "during": 32,
            "to": 24
          },
          "reducedMotion": "states cut without a spinner",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-OfMCexqwiYxfPx87IgQDea4pp/LslMSGUrlRefOt0Ac="
      },
      "files": [
        {
          "path": "components/state-transition/state-transition.tsx",
          "type": "registry:component",
          "target": "videos/components/state-transition/state-transition.tsx"
        },
        {
          "path": "components/state-transition/state-transition.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/state-transition/state-transition.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "statement",
      "type": "registry:component",
      "title": "Statement",
      "description": "Animated text with inline product controls.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/statement",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/statement",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 54,
          "entranceFrames": 30,
          "exitFrames": 10,
          "contentLimits": {
            "parts": 9,
            "partLength": 44,
            "chipLabel": 14
          },
          "reducedMotion": "every part appears together, and a swap cuts",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-rMbSUqoVWNZ3XjVDMoTJ8uKK6jX/BoIx1SmNkm9QWW0="
      },
      "files": [
        {
          "path": "components/statement/statement.tsx",
          "type": "registry:component",
          "target": "videos/components/statement/statement.tsx"
        },
        {
          "path": "components/statement/statement.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/statement/statement.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "sting-close",
      "type": "registry:item",
      "title": "Closing chord",
      "description": "A falling chord for an end card.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/sting-close",
      "categories": [
        "Sound",
        "Sound/Stings"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Stings",
        "namespaced": "@odori/sting-close",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 75,
          "minimumDurationInFrames": 75,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "sting.close",
          "export": "stingClose"
        },
        "integrity": "sha256-VVIWsvAOuoLJL4rAzYnjjjQ54NuYthw4qOkiWBPRa4Y="
      },
      "files": [
        {
          "path": "components/sting-close/sting-close.tsx",
          "type": "registry:item",
          "target": "videos/components/sting-close/sting-close.tsx"
        },
        {
          "path": "components/sting-close/sting-close.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/sting-close/sting-close.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "sting-open",
      "type": "registry:item",
      "title": "Opening chord",
      "description": "A swell and chord for an opening title.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/sting-open",
      "categories": [
        "Sound",
        "Sound/Stings"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Stings",
        "namespaced": "@odori/sting-open",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 60,
          "minimumDurationInFrames": 60,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "sting.open",
          "export": "stingOpen"
        },
        "integrity": "sha256-ynV4sRvcUVT9fBeogo3aMaJmcUCDCkOG5FGXsCFt79A="
      },
      "files": [
        {
          "path": "components/sting-open/sting-open.tsx",
          "type": "registry:item",
          "target": "videos/components/sting-open/sting-open.tsx"
        },
        {
          "path": "components/sting-open/sting-open.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/sting-open/sting-open.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "success",
      "type": "registry:item",
      "title": "Confirmation",
      "description": "Two rising notes for a confirmation.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/success",
      "categories": [
        "Sound",
        "Sound/Interface"
      ],
      "meta": {
        "odori": "v1",
        "kind": "cue",
        "family": "Sound",
        "category": "Sound/Interface",
        "namespaced": "@odori/success",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 15,
          "minimumDurationInFrames": 15,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "cue": {
          "name": "ui.success",
          "export": "success"
        },
        "integrity": "sha256-NlY8bCYeFZWi4CIgtkGc7AZFN75oRRLwfXtb6xr1WjI="
      },
      "files": [
        {
          "path": "components/success/success.tsx",
          "type": "registry:item",
          "target": "videos/components/success/success.tsx"
        },
        {
          "path": "components/success/success.preview.tsx",
          "type": "registry:item",
          "target": "videos/components/success/success.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "table-focus",
      "type": "registry:component",
      "title": "Table focus",
      "description": "Rows and columns with one animated focal selection.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/table-focus",
      "categories": [
        "Interface",
        "Interface/Surfaces"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Surfaces",
        "namespaced": "@odori/table-focus",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 14,
          "exitFrames": 0,
          "contentLimits": {
            "columns": 6,
            "rows": 8
          },
          "reducedMotion": "the focused row is marked without the others dimming",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-sClbYEW0nnk7O8CkKcicwqExHilVGAe6nanVJLaf4j0="
      },
      "files": [
        {
          "path": "components/table-focus/table-focus.tsx",
          "type": "registry:component",
          "target": "videos/components/table-focus/table-focus.tsx"
        },
        {
          "path": "components/table-focus/table-focus.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/table-focus/table-focus.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "tabs-switch",
      "type": "registry:component",
      "title": "Tabs",
      "description": "Tabs switching with the indicator travelling between them.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/tabs-switch",
      "categories": [
        "Interface",
        "Interface/Controls"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Controls",
        "namespaced": "@odori/tabs-switch",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 90,
          "entranceFrames": 14,
          "exitFrames": 10,
          "contentLimits": {},
          "reducedMotion": "final tab shown, indicator placed",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-0uN/vXmW7Mi9g3FabVSxtWiDKkhKV7ozq2/JKv0MbHo="
      },
      "files": [
        {
          "path": "components/tabs-switch/tabs-switch.tsx",
          "type": "registry:component",
          "target": "videos/components/tabs-switch/tabs-switch.tsx"
        },
        {
          "path": "components/tabs-switch/tabs-switch.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/tabs-switch/tabs-switch.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "tape-static",
      "type": "registry:component",
      "title": "Tape static",
      "description": "Falling pixels that loop across the frame.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/tape-static",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/tape-static",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and every flake holds its seeded position",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-kJ5T2s2I2jGAADMLR5Cu3mX8GVRKhJWkA/2cf/r5bFI="
      },
      "files": [
        {
          "path": "components/tape-static/tape-static.tsx",
          "type": "registry:component",
          "target": "videos/components/tape-static/tape-static.tsx"
        },
        {
          "path": "components/tape-static/tape-static.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/tape-static/tape-static.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "teams",
      "type": "registry:component",
      "title": "Microsoft Teams",
      "description": "A Teams channel where an app answers a post with a card.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/teams",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/teams",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "team": 24,
            "channel": 24
          },
          "reducedMotion": "post and card placed, no working indicator",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-ZkCjIm3uLy0ihfFc9ynDLRZHgVEWxPCU0H48atMDJX4="
      },
      "files": [
        {
          "path": "components/teams/teams.tsx",
          "type": "registry:component",
          "target": "videos/components/teams/teams.tsx"
        },
        {
          "path": "components/teams/teams.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/teams/teams.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "telegram",
      "type": "registry:component",
      "title": "Telegram",
      "description": "A Telegram client with the chat list beside a bot answering in the open chat.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/telegram",
      "categories": [
        "Products"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Products",
        "category": "Products",
        "namespaced": "@odori/telegram",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 270,
          "minimumDurationInFrames": 150,
          "entranceFrames": 14,
          "exitFrames": 12,
          "contentLimits": {
            "title": 24,
            "status": 24
          },
          "reducedMotion": "bubbles placed, no grow or typing line",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-3ChyMmsnv27JSvlSf3PdhX60g3UZ53N0666KR1uMvc8="
      },
      "files": [
        {
          "path": "components/telegram/telegram.tsx",
          "type": "registry:component",
          "target": "videos/components/telegram/telegram.tsx"
        },
        {
          "path": "components/telegram/telegram.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/telegram/telegram.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "terminal",
      "type": "registry:component",
      "title": "Terminal",
      "description": "A typed command session with deterministic output reveals.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/terminal",
      "categories": [
        "Developer proof",
        "Developer proof/Terminal"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Terminal",
        "namespaced": "@odori/terminal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 60,
          "entranceFrames": 12,
          "exitFrames": 10,
          "contentLimits": {
            "commandLength": 58,
            "steps": 4
          },
          "reducedMotion": "prints commands without typing",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-/0dP8YtH4KqEyCvVHYgDksUmifXjRyyA7znPRHEQPrU="
      },
      "files": [
        {
          "path": "components/terminal/terminal.tsx",
          "type": "registry:component",
          "target": "videos/components/terminal/terminal.tsx"
        },
        {
          "path": "components/terminal/terminal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/terminal/terminal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "terminal-zoom",
      "type": "registry:component",
      "title": "Terminal zoom",
      "description": "A typed command with a camera zoom.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/terminal-zoom",
      "categories": [
        "Developer proof",
        "Developer proof/Terminal"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Developer proof",
        "category": "Developer proof/Terminal",
        "namespaced": "@odori/terminal-zoom",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 240,
          "minimumDurationInFrames": 120,
          "entranceFrames": 14,
          "exitFrames": 26,
          "contentLimits": {
            "command": 72,
            "title": 40,
            "output": 72
          },
          "reducedMotion": "camera held at 1x, no push",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-oQtnBngC0QAUV0LiPbPnCUrUaqH/w77ZYP0dZ7zTySg="
      },
      "files": [
        {
          "path": "components/terminal-zoom/terminal-zoom.tsx",
          "type": "registry:component",
          "target": "videos/components/terminal-zoom/terminal-zoom.tsx"
        },
        {
          "path": "components/terminal-zoom/terminal-zoom.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/terminal-zoom/terminal-zoom.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "timeline",
      "type": "registry:component",
      "title": "Timeline",
      "description": "Milestones revealed along a timeline.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/timeline",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/timeline",
        "contract": {
          "aspectRatios": [
            "16:9",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 75,
          "entranceFrames": 72,
          "exitFrames": 0,
          "contentLimits": {
            "milestones": 5,
            "labelLength": 18
          },
          "reducedMotion": "the axis and markers appear at once",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-3DiJ9r7r01K2rMSEGsja4QWW2J4xCjIYrLWMo7DgHHM="
      },
      "files": [
        {
          "path": "components/timeline/timeline.tsx",
          "type": "registry:component",
          "target": "videos/components/timeline/timeline.tsx"
        },
        {
          "path": "components/timeline/timeline.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/timeline/timeline.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "title-reveal",
      "type": "registry:component",
      "title": "Title reveal",
      "description": "A staggered, word-masked headline.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/title-reveal",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/title-reveal",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 45,
          "entranceFrames": 20,
          "exitFrames": 10,
          "contentLimits": {
            "title": 64
          },
          "reducedMotion": "fades without translation",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-Jw8g2b0MiBwOIHvHMqcZtUW1yYRTLZOhc76z4sXnmtU="
      },
      "files": [
        {
          "path": "components/title-reveal/title-reveal.tsx",
          "type": "registry:component",
          "target": "videos/components/title-reveal/title-reveal.tsx"
        },
        {
          "path": "components/title-reveal/title-reveal.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/title-reveal/title-reveal.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "toast-stack",
      "type": "registry:component",
      "title": "Toast stack",
      "description": "Timed notifications with entry, hold, and dismissal.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/toast-stack",
      "categories": [
        "Interface",
        "Interface/Feedback"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Interface",
        "category": "Interface/Feedback",
        "namespaced": "@odori/toast-stack",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 40,
          "entranceFrames": 10,
          "exitFrames": 10,
          "contentLimits": {
            "title": 48,
            "detail": 72
          },
          "reducedMotion": "toasts appear and disappear without sliding",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-3Y/+xIIX3hIu5lXcFqZqz450c6teKbK9BnTlysnTRKA="
      },
      "files": [
        {
          "path": "components/toast-stack/toast-stack.tsx",
          "type": "registry:component",
          "target": "videos/components/toast-stack/toast-stack.tsx"
        },
        {
          "path": "components/toast-stack/toast-stack.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/toast-stack/toast-stack.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "topo-lines",
      "type": "registry:component",
      "title": "Topo lines",
      "description": "Slowly shifting contour lines.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/topo-lines",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/topo-lines",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the contours hold one still map",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-D5Klm15072I7fqKMehx9xvMtu6xI6tH8x96tLCGq8/w="
      },
      "files": [
        {
          "path": "components/topo-lines/topo-lines.tsx",
          "type": "registry:component",
          "target": "videos/components/topo-lines/topo-lines.tsx"
        },
        {
          "path": "components/topo-lines/topo-lines.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/topo-lines/topo-lines.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "typewriter",
      "type": "registry:component",
      "title": "Typewriter",
      "description": "Deterministic typing with a frame-driven caret.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/typewriter",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/typewriter",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 60,
          "entranceFrames": 8,
          "exitFrames": 0,
          "contentLimits": {
            "text": 48
          },
          "reducedMotion": "the full string is shown with a static caret",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-SBhWn21nyma4i6S4bb8MhKgzCVpDosDmTzRdG3ra0Eg="
      },
      "files": [
        {
          "path": "components/typewriter/typewriter.tsx",
          "type": "registry:component",
          "target": "videos/components/typewriter/typewriter.tsx"
        },
        {
          "path": "components/typewriter/typewriter.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/typewriter/typewriter.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "typing",
      "type": "registry:item",
      "title": "Typing",
      "description": "A recording of keyboard typing.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/typing",
      "categories": [
        "Sound",
        "Sound/Foley"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Foley",
        "namespaced": "@odori/typing",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 445,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": true
        },
        "asset": {
          "cue": "ui.typing",
          "url": "/audio/typing.m4a",
          "target": "public/audio/typing.m4a",
          "bytes": 255442,
          "integrity": "sha256-srOr6dWbMW180q3y+3C3XomBQNDpWowudO4ufyeXd+Y="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "ui-key",
      "type": "registry:item",
      "title": "Key click",
      "description": "A recorded keystroke.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/ui-key",
      "categories": [
        "Sound",
        "Sound/Foley"
      ],
      "meta": {
        "odori": "v1",
        "kind": "asset",
        "family": "Sound",
        "category": "Sound/Foley",
        "namespaced": "@odori/ui-key",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 5,
          "minimumDurationInFrames": 5,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the waveform renders without a playhead",
          "requires": {
            "fonts": [
              "mono"
            ],
            "audio": []
          },
          "loops": false
        },
        "asset": {
          "cue": "ui.key",
          "url": "/audio/ui-key.m4a",
          "target": "public/audio/ui-key.m4a",
          "bytes": 4049,
          "integrity": "sha256-HikBX7drcPosn0VZBo87/PrFD+Yta6UD4jnI8KG8/a0="
        },
        "integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
      },
      "files": []
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "v0",
      "type": "registry:component",
      "title": "v0",
      "description": "A v0 composer with an animated prompt.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/v0",
      "categories": [
        "Agents"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Agents",
        "category": "Agents",
        "namespaced": "@odori/v0",
        "contract": {
          "aspectRatios": [
            "16:9"
          ],
          "recommendedDurationInFrames": 210,
          "minimumDurationInFrames": 90,
          "entranceFrames": 16,
          "exitFrames": 12,
          "contentLimits": {
            "prompt": 140,
            "heading": 48
          },
          "reducedMotion": "starters hidden rather than cleared",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-+Tg3EibvCE+iQ2yKBH3jjxPTBgmVuTzhR6KkVnXsEl0="
      },
      "files": [
        {
          "path": "components/v0/v0.tsx",
          "type": "registry:component",
          "target": "videos/components/v0/v0.tsx"
        },
        {
          "path": "components/v0/v0.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/v0/v0.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "value-swap",
      "type": "registry:component",
      "title": "Value swap",
      "description": "Replace one label or value while preserving alignment.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/value-swap",
      "categories": [
        "Typography",
        "Typography/Figures"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Figures",
        "namespaced": "@odori/value-swap",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 90,
          "minimumDurationInFrames": 60,
          "entranceFrames": 14,
          "exitFrames": 0,
          "contentLimits": {
            "from": 24,
            "to": 24
          },
          "reducedMotion": "the values cross-fade without travel",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-06XFsT8sX18Xcbq/HPM6pYcXJGJAs7mZCydXwVp3r90="
      },
      "files": [
        {
          "path": "components/value-swap/value-swap.tsx",
          "type": "registry:component",
          "target": "videos/components/value-swap/value-swap.tsx"
        },
        {
          "path": "components/value-swap/value-swap.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/value-swap/value-swap.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "video-stage",
      "type": "registry:component",
      "title": "Video stage",
      "description": "Video footage synchronized to the scene frame.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/video-stage",
      "categories": [
        "Media",
        "Media/Footage"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Media",
        "category": "Media/Footage",
        "namespaced": "@odori/video-stage",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 150,
          "minimumDurationInFrames": 30,
          "entranceFrames": 12,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the clip holds its first frame",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-dbFjMOwFXZxJmxK3Sf7bndJdHnVuzduCXTEbbX0DQNg="
      },
      "files": [
        {
          "path": "components/video-stage/video-stage.tsx",
          "type": "registry:component",
          "target": "videos/components/video-stage/video-stage.tsx"
        },
        {
          "path": "components/video-stage/video-stage.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/video-stage/video-stage.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "volumetrics",
      "type": "registry:component",
      "title": "Volumetrics",
      "description": "Soft, translucent beams of light.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/volumetrics",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/volumetrics",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 30,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the beams hold one still pose",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-enYERyUwUMN7fBwW2yvyT1RSRthkgBrPArjtMS1937M="
      },
      "files": [
        {
          "path": "components/volumetrics/volumetrics.tsx",
          "type": "registry:component",
          "target": "videos/components/volumetrics/volumetrics.tsx"
        },
        {
          "path": "components/volumetrics/volumetrics.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/volumetrics/volumetrics.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "warp-tunnel",
      "type": "registry:component",
      "title": "Warp tunnel",
      "description": "Streaks of light rushing past a vanishing point.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/warp-tunnel",
      "categories": [
        "Backgrounds"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Backgrounds",
        "category": "Backgrounds",
        "namespaced": "@odori/warp-tunnel",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 24,
          "entranceFrames": 0,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "set speed to 0 and the streaks hold as a star chart",
          "requires": {
            "fonts": [],
            "audio": [],
            "graphics": [
              "webgl2"
            ]
          }
        },
        "integrity": "sha256-nxbI5TtXsQ3XY/o0hnW+M0gVg8qsXlZv0jb0lKb78i0="
      },
      "files": [
        {
          "path": "components/warp-tunnel/warp-tunnel.tsx",
          "type": "registry:component",
          "target": "videos/components/warp-tunnel/warp-tunnel.tsx"
        },
        {
          "path": "components/warp-tunnel/warp-tunnel.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/warp-tunnel/warp-tunnel.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "whip-pan",
      "type": "registry:component",
      "title": "Whip pan",
      "description": "A fast directional camera move with a clean settle.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/whip-pan",
      "categories": [
        "Motion"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Motion",
        "category": "Motion",
        "namespaced": "@odori/whip-pan",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 45,
          "minimumDurationInFrames": 18,
          "entranceFrames": 18,
          "exitFrames": 0,
          "contentLimits": {},
          "reducedMotion": "the content is settled, with no travel and no blur",
          "requires": {
            "fonts": [],
            "audio": []
          }
        },
        "integrity": "sha256-bn+B2Z7gsVVLPX7NVYfkk+Nd0b9bzclNGwRwnwvSGQY="
      },
      "files": [
        {
          "path": "components/whip-pan/whip-pan.tsx",
          "type": "registry:component",
          "target": "videos/components/whip-pan/whip-pan.tsx"
        },
        {
          "path": "components/whip-pan/whip-pan.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/whip-pan/whip-pan.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "word-cascade",
      "type": "registry:component",
      "title": "Word cascade",
      "description": "Words enter in a paced vertical sequence.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/word-cascade",
      "categories": [
        "Typography",
        "Typography/Titles"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Typography",
        "category": "Typography/Titles",
        "namespaced": "@odori/word-cascade",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 120,
          "minimumDurationInFrames": 48,
          "entranceFrames": 30,
          "exitFrames": 10,
          "contentLimits": {
            "words": 5,
            "wordLength": 18
          },
          "reducedMotion": "all words fade in together",
          "requires": {
            "fonts": [
              "sans"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-6OTchMxsKz9vkbFmrEcpZikREK/qw3+f7JxpQSyYGHs="
      },
      "files": [
        {
          "path": "components/word-cascade/word-cascade.tsx",
          "type": "registry:component",
          "target": "videos/components/word-cascade/word-cascade.tsx"
        },
        {
          "path": "components/word-cascade/word-cascade.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/word-cascade/word-cascade.preview.tsx"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "workflow-steps",
      "type": "registry:component",
      "title": "Workflow steps",
      "description": "Sequential process with one active focal point.",
      "author": "Odori",
      "dependencies": [
        "odori"
      ],
      "registryDependencies": [],
      "docs": "https://odori.dev/components/workflow-steps",
      "categories": [
        "Narrative"
      ],
      "meta": {
        "odori": "v1",
        "kind": "component",
        "family": "Narrative",
        "category": "Narrative",
        "namespaced": "@odori/workflow-steps",
        "contract": {
          "aspectRatios": [
            "16:9",
            "9:16",
            "1:1"
          ],
          "recommendedDurationInFrames": 180,
          "minimumDurationInFrames": 90,
          "entranceFrames": 30,
          "exitFrames": 0,
          "contentLimits": {
            "steps": 5,
            "stepLength": 26
          },
          "reducedMotion": "every step shows without a moving focus",
          "requires": {
            "fonts": [
              "sans",
              "mono"
            ],
            "audio": []
          }
        },
        "integrity": "sha256-tCE1fyHEGqROrVYHPyH5IH91qtptidiYwPi+l8dpvcE="
      },
      "files": [
        {
          "path": "components/workflow-steps/workflow-steps.tsx",
          "type": "registry:component",
          "target": "videos/components/workflow-steps/workflow-steps.tsx"
        },
        {
          "path": "components/workflow-steps/workflow-steps.preview.tsx",
          "type": "registry:component",
          "target": "videos/components/workflow-steps/workflow-steps.preview.tsx"
        }
      ]
    }
  ]
}
