{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "keyframery",
  "homepage": "https://keyframery.com",
  "items": [
    {
      "name": "cuts",
      "type": "registry:component",
      "title": "Cuts",
      "description": "Film cuts for shadcn. Add <Cuts /> once to your root layout.",
      "files": [
        {
          "path": "components/keyframery/cuts.tsx",
          "type": "registry:component",
          "target": "components/keyframery/cuts.tsx"
        },
        {
          "path": "components/keyframery/keyframery.css",
          "type": "registry:file",
          "target": "components/keyframery/keyframery.css"
        },
        {
          "path": "lib/keyframery/engine.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/engine.ts"
        },
        {
          "path": "lib/keyframery/state.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/state.ts"
        },
        {
          "path": "lib/keyframery/motion.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/motion.ts"
        },
        {
          "path": "lib/keyframery/press.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/press.ts"
        },
        {
          "path": "lib/keyframery/aim.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/aim.ts"
        },
        {
          "path": "lib/keyframery/ghost.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/ghost.ts"
        },
        {
          "path": "lib/keyframery/observe.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/observe.ts"
        },
        {
          "path": "lib/keyframery/adapters/overlay.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/overlay.ts"
        },
        {
          "path": "lib/keyframery/adapters/panel.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/panel.ts"
        },
        {
          "path": "lib/keyframery/adapters/tabs.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/tabs.ts"
        },
        {
          "path": "lib/keyframery/adapters/toast.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/toast.ts"
        },
        {
          "path": "lib/keyframery/adapters/tuned.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/tuned.ts"
        },
        {
          "path": "lib/keyframery/adapters/toggle.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/toggle.ts"
        },
        {
          "path": "lib/keyframery/adapters/highlight.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/highlight.ts"
        },
        {
          "path": "lib/keyframery/adapters/error.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/error.ts"
        },
        {
          "path": "lib/keyframery/adapters/arrival.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/arrival.ts"
        },
        {
          "path": "lib/keyframery/adapters/appear.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/appear.ts"
        },
        {
          "path": "lib/keyframery/adapters/calendar.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/calendar.ts"
        },
        {
          "path": "lib/keyframery/adapters/steps.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/adapters/steps.ts"
        },
        {
          "path": "lib/keyframery/icon.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/icon.ts"
        }
      ]
    },
    {
      "name": "value-cut",
      "type": "registry:component",
      "title": "ValueCut",
      "description": "A value that changes in place (a price, a count, a status) punches in.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/value-cut.tsx",
          "type": "registry:component",
          "target": "components/keyframery/value-cut.tsx"
        },
        {
          "path": "lib/keyframery/value.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/value.ts"
        }
      ]
    },
    {
      "name": "load-cut",
      "type": "registry:component",
      "title": "LoadCut",
      "description": "A placeholder becomes real without a jump; fast data never flashes a skeleton.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/load-cut.tsx",
          "type": "registry:component",
          "target": "components/keyframery/load-cut.tsx"
        },
        {
          "path": "lib/keyframery/load.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/load.ts"
        }
      ]
    },
    {
      "name": "list-cut",
      "type": "registry:component",
      "title": "ListCut",
      "description": "Lists that change without jumping: arrivals, departures and reorders, keyed by id.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/list-cut.tsx",
          "type": "registry:component",
          "target": "components/keyframery/list-cut.tsx"
        },
        {
          "path": "lib/keyframery/list.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/list.ts"
        }
      ]
    },
    {
      "name": "state-cut",
      "type": "registry:component",
      "title": "StateCut",
      "description": "Whole-content state changes settle with a fade or slide and a smooth container height.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/state-cut.tsx",
          "type": "registry:component",
          "target": "components/keyframery/state-cut.tsx"
        }
      ]
    },
    {
      "name": "icon-moves",
      "type": "registry:component",
      "title": "IconMoves",
      "description": "When a control with an icon is pressed, its icon plays its own move: a gear turns, a bell rings, a lid lifts. Works with the lucide icons already in your app.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/icon-moves.tsx",
          "type": "registry:component",
          "target": "components/keyframery/icon-moves.tsx"
        },
        {
          "path": "lib/keyframery/moves.ts",
          "type": "registry:lib",
          "target": "lib/keyframery/moves.ts"
        }
      ]
    },
    {
      "name": "match-cut",
      "type": "registry:component",
      "title": "MatchCut",
      "description": "A thing opens into its bigger self (card → detail), on the same page or across a route change.",
      "registryDependencies": [
        "@keyframery/cuts"
      ],
      "files": [
        {
          "path": "components/keyframery/match-cut.tsx",
          "type": "registry:component",
          "target": "components/keyframery/match-cut.tsx"
        }
      ]
    },
    {
      "name": "combination-otp",
      "type": "registry:component",
      "title": "Combination OTP",
      "description": "An OTP input where each digit rolls into place on its own drum, like a combination lock, and a soft light follows you from slot to slot. The right code folds the slots into a Verified chip.",
      "dependencies": [
        "motion",
        "input-otp"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "components/keyframery/combination-otp.tsx",
          "type": "registry:component",
          "target": "components/keyframery/combination-otp.tsx"
        }
      ]
    },
    {
      "name": "peek-pagination",
      "type": "registry:component",
      "title": "Peek Pagination",
      "description": "Pagination that previews a page before you click it. Point at a number, an arrow or a gap to see its rows, or drag across a gap to browse.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "components/keyframery/peek-pagination.tsx",
          "type": "registry:component",
          "target": "components/keyframery/peek-pagination.tsx"
        }
      ]
    },
    {
      "name": "wave-photo-upload",
      "type": "registry:component",
      "title": "Wave Photo Upload",
      "description": "An image upload where a beam of light prints your photo line by line as it uploads, the picture developing right behind it. Drag and drop, paste and retry built in.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "components/keyframery/wave-photo-upload.tsx",
          "type": "registry:component",
          "target": "components/keyframery/wave-photo-upload.tsx"
        }
      ]
    },
    {
      "name": "photocopy-code-block",
      "type": "registry:component",
      "title": "Photocopy Code Block",
      "description": "A code block whose copy button photocopies the code: a lamp of light reads it line by line, runs back and folds into the button. Select lines and press ⌘C to see exactly what you copied. Prompts never reach the clipboard.",
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "components/keyframery/photocopy-code-block.tsx",
          "type": "registry:component",
          "target": "components/keyframery/photocopy-code-block.tsx"
        }
      ]
    },
    {
      "name": "relay-bento",
      "type": "registry:component",
      "title": "Relay Bento",
      "description": "A bento grid that animates itself: a light carries each step from tile to tile through the gaps between them, so the grid tells one story, on a loop, while it is on screen.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "components/keyframery/relay-bento.tsx",
          "type": "registry:component",
          "target": "components/keyframery/relay-bento.tsx"
        }
      ]
    }
  ]
}
