{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "adv",
  "homepage": "https://adventureland.io",
  "items": [
    {
      "name": "base",
      "type": "registry:style",
      "title": "Adventureland Theme Base",
      "description": "Foundation for the Adventureland registry: light/dark CSS variable theme tokens plus the cn() class-merging utility. Add this first so the other components render with the intended palette.",
      "dependencies": [
        "clsx",
        "tailwind-merge"
      ],
      "files": [
        {
          "path": "lib/utils.ts",
          "type": "registry:lib"
        }
      ],
      "cssVars": {
        "light": {
          "text-primary": "#3a3a3a",
          "text-secondary": "#6f6f6f",
          "background": "#fbfbfb",
          "color-neutral-600": "#525252",
          "color-neutral-100": "#f5f5f5",
          "color-hover": "rgba(0, 0, 0, 0.05)",
          "color-active": "#f0f0f0",
          "color-interactive": "#2563eb",
          "border-color": "#e5e5e5",
          "input-border": "#d4d4d4",
          "input-bg": "#ffffff",
          "input-text": "#3a3a3a",
          "input-placeholder": "#a3a3a3",
          "button-primary-bg": "#3a3a3a",
          "button-primary-text": "#ffffff",
          "button-primary-hover": "#525252",
          "button-primary-active": "#262626",
          "button-secondary-bg": "#f0f0f0",
          "button-secondary-text": "#3a3a3a",
          "button-secondary-hover": "#e5e5e5",
          "button-secondary-active": "#d4d4d4",
          "button-outline-border": "#d4d4d4",
          "button-outline-text": "#3a3a3a",
          "button-outline-hover": "#f0f0f0",
          "focus-ring": "rgba(37, 99, 235, 0.5)",
          "focus-ring-offset": "#ffffff",
          "pattern-line-color": "rgb(255, 255, 255)",
          "color-cobalt-600": "oklch(50.58% 0.2886 264.84)",
          "bottom-tray-height": "56px",
          "color-caption-text": "#525252",
          "color-caption-background": "#f5f5f5"
        },
        "dark": {
          "text-primary": "#f5f5f5",
          "text-secondary": "#cbcbcb",
          "background": "#121212",
          "color-neutral-600": "#d1d1d1",
          "color-neutral-100": "#272727",
          "color-hover": "rgba(255, 255, 255, 0.1)",
          "color-active": "#333333",
          "color-interactive": "#60a5fa",
          "border-color": "#333333",
          "input-border": "#444444",
          "input-bg": "#1e1e1e",
          "input-text": "#f5f5f5",
          "input-placeholder": "#808080",
          "button-primary-bg": "#f5f5f5",
          "button-primary-text": "#121212",
          "button-primary-hover": "#d1d1d1",
          "button-primary-active": "#a0a0a0",
          "button-secondary-bg": "#272727",
          "button-secondary-text": "#f5f5f5",
          "button-secondary-hover": "#333333",
          "button-secondary-active": "#3d3d3d",
          "button-outline-border": "#444444",
          "button-outline-text": "#f5f5f5",
          "button-outline-hover": "#272727",
          "focus-ring": "rgba(96, 165, 250, 0.5)",
          "focus-ring-offset": "#1e1e1e",
          "pattern-line-color": "rgba(0, 0, 0, 0.75)",
          "color-cobalt-600": "oklch(75% 0.2886 264.84)",
          "bottom-tray-height": "56px",
          "color-caption-text": "#d1d1d1",
          "color-caption-background": "#272727"
        }
      }
    },
    {
      "name": "cyberpunk-text",
      "type": "registry:component",
      "title": "Cyberpunk Text",
      "description": "Glitch/cyberpunk-styled text element with layered accents.",
      "files": [
        {
          "path": "components/ui/CyberpunkText.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "cyberpunk-text-box",
      "type": "registry:component",
      "title": "Cyberpunk Text Box",
      "description": "Bordered cyberpunk text container.",
      "files": [
        {
          "path": "components/ui/CyberpunkTextBox.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "cyberpunk-bracket",
      "type": "registry:component",
      "title": "Cyberpunk Bracket",
      "description": "Decorative corner-bracket frame in the cyberpunk style.",
      "files": [
        {
          "path": "components/ui/CyberpunkBracket.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "cyberpunk-pattern",
      "type": "registry:component",
      "title": "Cyberpunk Pattern",
      "description": "Animated cyberpunk background/line pattern.",
      "files": [
        {
          "path": "components/ui/CyberpunkPattern.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/cyberpunk-pattern.css",
          "type": "registry:file",
          "target": "components/ui/cyberpunk-pattern.css"
        }
      ]
    },
    {
      "name": "animated-cyberpunk-cursor",
      "type": "registry:component",
      "title": "Animated Cyberpunk Cursor",
      "description": "Custom animated cursor composed of the cyberpunk bracket, pattern and text pieces, driven by GSAP.",
      "dependencies": [
        "gsap"
      ],
      "registryDependencies": [
        "@adv/cyberpunk-bracket",
        "@adv/cyberpunk-pattern",
        "@adv/cyberpunk-text"
      ],
      "files": [
        {
          "path": "components/ui/AnimatedCyberpunkCursor.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/cyberpunkAnimations.ts",
          "type": "registry:lib",
          "target": "components/ui/cyberpunkAnimations.ts"
        }
      ]
    },
    {
      "name": "cyberpunk-stripe-banner-notification",
      "type": "registry:component",
      "title": "Cyberpunk Stripe Banner Notification",
      "description": "Striped cyberpunk banner notification with a GSAP entrance.",
      "dependencies": [
        "gsap"
      ],
      "registryDependencies": [
        "button"
      ],
      "files": [
        {
          "path": "components/ui/cyberpunk-stripe-banner-notification.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "text-scramble",
      "type": "registry:component",
      "title": "Text Scramble",
      "description": "Scramble-in text reveal powered by GSAP ScrambleTextPlugin.",
      "dependencies": [
        "gsap"
      ],
      "files": [
        {
          "path": "components/ui/TextScramble.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "shiny-text",
      "type": "registry:component",
      "title": "Shiny Text",
      "description": "Text with an animated sheen sweep.",
      "files": [
        {
          "path": "components/ShinyText.tsx",
          "type": "registry:component",
          "target": "components/ShinyText.tsx"
        },
        {
          "path": "components/ShinyText.css",
          "type": "registry:file",
          "target": "components/ShinyText.css"
        }
      ]
    },
    {
      "name": "text-shimmer",
      "type": "registry:component",
      "title": "Text Shimmer",
      "description": "Shimmering gradient text effect (GSAP).",
      "dependencies": [
        "gsap"
      ],
      "registryDependencies": [
        "@adv/base"
      ],
      "files": [
        {
          "path": "components/TextShimmer.tsx",
          "type": "registry:component",
          "target": "components/TextShimmer.tsx"
        },
        {
          "path": "components/text-shimmer.css",
          "type": "registry:file",
          "target": "components/text-shimmer.css"
        }
      ]
    },
    {
      "name": "blinking-cursor",
      "type": "registry:component",
      "title": "Blinking Cursor",
      "description": "Terminal-style blinking cursor (GSAP).",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "files": [
        {
          "path": "components/BlinkingCursor.tsx",
          "type": "registry:component",
          "target": "components/BlinkingCursor.tsx"
        }
      ]
    },
    {
      "name": "shine-button",
      "type": "registry:component",
      "title": "Shine Button",
      "description": "Button with a theme-aware shine sweep.",
      "dependencies": [
        "next-themes"
      ],
      "files": [
        {
          "path": "components/ui/shine-button.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/shine-button.css",
          "type": "registry:file",
          "target": "components/ui/shine-button.css"
        },
        {
          "path": "components/theme-provider.tsx",
          "type": "registry:component",
          "target": "components/theme-provider.tsx"
        },
        {
          "path": "hooks/use-system-theme.ts",
          "type": "registry:hook",
          "target": "hooks/use-system-theme.ts"
        }
      ]
    },
    {
      "name": "shine-animation",
      "type": "registry:component",
      "title": "Shine Animation",
      "description": "Reusable shine sweep overlay (Framer Motion).",
      "dependencies": [
        "framer-motion"
      ],
      "files": [
        {
          "path": "components/shine-animation.tsx",
          "type": "registry:component",
          "target": "components/shine-animation.tsx"
        }
      ]
    },
    {
      "name": "item-pagination",
      "type": "registry:component",
      "title": "Item Pagination",
      "description": "Prev/next pagination control for item pages.",
      "dependencies": [
        "lucide-react"
      ],
      "files": [
        {
          "path": "components/ui/ItemPagination.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "back-button",
      "type": "registry:component",
      "title": "Back Button",
      "description": "Router-aware back button.",
      "dependencies": [
        "lucide-react"
      ],
      "files": [
        {
          "path": "components/ui/back-button.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "item-header-blocks",
      "type": "registry:component",
      "title": "Item Header Blocks",
      "description": "Composable header blocks for item/detail pages (cover image, project meta, navigation).",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@adv/back-button"
      ],
      "files": [
        {
          "path": "components/ui/ItemHeaderBlocks.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "border-pattern",
      "type": "registry:component",
      "title": "Border Pattern",
      "description": "Decorative SVG border pattern.",
      "files": [
        {
          "path": "components/ui/BorderPattern.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/border-pattern.css",
          "type": "registry:file",
          "target": "components/ui/border-pattern.css"
        }
      ]
    },
    {
      "name": "content-card",
      "type": "registry:component",
      "title": "Content Card",
      "description": "Lightweight card surface using shadcn card tokens.",
      "files": [
        {
          "path": "components/ui/ContentCard.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "bottom-wiggle-notification",
      "type": "registry:component",
      "title": "Bottom Wiggle Notification",
      "description": "Bottom-anchored notification with a wiggle entrance (Framer Motion).",
      "dependencies": [
        "framer-motion"
      ],
      "files": [
        {
          "path": "components/ui/BottomWiggleNotification.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "item-page-layout",
      "type": "registry:component",
      "title": "Item Page Layout",
      "description": "Full item page scaffold composing header blocks, content card, pagination and the wiggle notification.",
      "dependencies": [
        "next"
      ],
      "registryDependencies": [
        "@adv/item-pagination",
        "@adv/content-card",
        "@adv/bottom-wiggle-notification",
        "@adv/item-header-blocks"
      ],
      "files": [
        {
          "path": "components/ui/ItemPageLayout.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "item-details-layout",
      "type": "registry:component",
      "title": "Item Details Layout",
      "description": "Two-column details layout with cover imagery.",
      "dependencies": [
        "next"
      ],
      "files": [
        {
          "path": "components/ui/ItemDetailsLayout.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "item-modal-footer",
      "type": "registry:component",
      "title": "Item Modal Footer",
      "description": "Footer bar for item modals with share dropdown and brand icons.",
      "dependencies": [
        "lucide-react",
        "@radix-ui/react-dropdown-menu",
        "next-themes"
      ],
      "registryDependencies": [
        "badge"
      ],
      "files": [
        {
          "path": "components/ui/ItemModalFooter.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/icons/brand-icons.tsx",
          "type": "registry:component",
          "target": "components/icons/brand-icons.tsx"
        },
        {
          "path": "components/theme-provider.tsx",
          "type": "registry:component",
          "target": "components/theme-provider.tsx"
        },
        {
          "path": "hooks/use-system-theme.ts",
          "type": "registry:hook",
          "target": "hooks/use-system-theme.ts"
        }
      ]
    },
    {
      "name": "paper-shader",
      "type": "registry:component",
      "title": "Paper Shader",
      "description": "WebGL paper-texture shader background (three.js).",
      "dependencies": [
        "three"
      ],
      "files": [
        {
          "path": "components/paper-shader.tsx",
          "type": "registry:component",
          "target": "components/paper-shader.tsx"
        }
      ]
    },
    {
      "name": "webgl-background",
      "type": "registry:component",
      "title": "WebGL Background",
      "description": "Full-screen WebGL shader background (three.js). Ships its own vertex/fragment shaders as TypeScript string modules \u2014 no glsl loader required.",
      "dependencies": [
        "three"
      ],
      "files": [
        {
          "path": "components/WebGLBackground.tsx",
          "type": "registry:component",
          "target": "components/WebGLBackground.tsx"
        },
        {
          "path": "components/shaders/vertex.glsl.ts",
          "type": "registry:lib",
          "target": "components/shaders/vertex.glsl.ts"
        },
        {
          "path": "components/shaders/fragment.glsl.ts",
          "type": "registry:lib",
          "target": "components/shaders/fragment.glsl.ts"
        }
      ]
    },
    {
      "name": "texture-pattern",
      "type": "registry:component",
      "title": "Texture Pattern",
      "description": "Lightweight CSS texture/grain pattern overlay.",
      "files": [
        {
          "path": "components/texture-pattern.tsx",
          "type": "registry:component",
          "target": "components/texture-pattern.tsx"
        }
      ]
    },
    {
      "name": "cursor",
      "type": "registry:component",
      "title": "Cursor",
      "description": "Custom pointer-follow cursor.",
      "files": [
        {
          "path": "components/ui/Cursor.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "audio-button",
      "type": "registry:component",
      "title": "Audio Button",
      "description": "Button that plays UI sound effects via a Howler-backed audio manager.",
      "dependencies": [
        "howler"
      ],
      "files": [
        {
          "path": "components/ui/audio-button.tsx",
          "type": "registry:component"
        },
        {
          "path": "hooks/useAudio.ts",
          "type": "registry:hook",
          "target": "hooks/useAudio.ts"
        },
        {
          "path": "lib/audio-manager.ts",
          "type": "registry:lib",
          "target": "lib/audio-manager.ts"
        }
      ]
    },
    {
      "name": "floating-action-button",
      "type": "registry:component",
      "title": "Floating Action Button",
      "description": "Expandable floating action button (Framer Motion).",
      "dependencies": [
        "framer-motion",
        "lucide-react"
      ],
      "files": [
        {
          "path": "components/floating-action-button.tsx",
          "type": "registry:component",
          "target": "components/floating-action-button.tsx"
        }
      ]
    },
    {
      "name": "preview-hover-card",
      "type": "registry:component",
      "title": "Preview Hover Card",
      "description": "Link hover card showing a rich preview.",
      "dependencies": [
        "next"
      ],
      "registryDependencies": [
        "hover-card"
      ],
      "files": [
        {
          "path": "components/ui/PreviewHoverCard.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "top-banner-notification",
      "type": "registry:component",
      "title": "Top Banner Notification",
      "description": "Top-anchored, themeable banner notification (Framer Motion).",
      "dependencies": [
        "framer-motion"
      ],
      "registryDependencies": [
        "button"
      ],
      "files": [
        {
          "path": "components/ui/top-banner-notification.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/banner-notification-theme-config.ts",
          "type": "registry:lib",
          "target": "components/ui/banner-notification-theme-config.ts"
        }
      ]
    },
    {
      "name": "theme-aware-toaster",
      "type": "registry:component",
      "title": "Theme-Aware Toaster",
      "description": "Sonner toaster wired to the current light/dark theme.",
      "dependencies": [
        "sonner",
        "next-themes"
      ],
      "files": [
        {
          "path": "components/ui/theme-aware-toaster.tsx",
          "type": "registry:component"
        },
        {
          "path": "components/ui/theme-aware-toaster.css",
          "type": "registry:file",
          "target": "components/ui/theme-aware-toaster.css"
        },
        {
          "path": "components/theme-provider.tsx",
          "type": "registry:component",
          "target": "components/theme-provider.tsx"
        },
        {
          "path": "hooks/use-system-theme.ts",
          "type": "registry:hook",
          "target": "hooks/use-system-theme.ts"
        }
      ]
    },
    {
      "name": "loader",
      "type": "registry:component",
      "title": "Loader",
      "description": "Boot-sequence loader animation with optional audio (GSAP + Howler).",
      "dependencies": [
        "gsap",
        "@gsap/react",
        "howler"
      ],
      "files": [
        {
          "path": "components/loader.tsx",
          "type": "registry:component",
          "target": "components/loader.tsx"
        },
        {
          "path": "hooks/useAudio.ts",
          "type": "registry:hook",
          "target": "hooks/useAudio.ts"
        },
        {
          "path": "lib/audio-manager.ts",
          "type": "registry:lib",
          "target": "lib/audio-manager.ts"
        },
        {
          "path": "lib/loader-config.ts",
          "type": "registry:lib",
          "target": "lib/loader-config.ts"
        }
      ]
    },
    {
      "name": "page-turn-effect",
      "type": "registry:component",
      "title": "Page Turn Effect",
      "description": "WebGL page-turn transition (three.js).",
      "dependencies": [
        "three"
      ],
      "files": [
        {
          "path": "components/page-turn-effect.tsx",
          "type": "registry:component",
          "target": "components/page-turn-effect.tsx"
        }
      ]
    },
    {
      "name": "animated-text-section",
      "type": "registry:component",
      "title": "Animated Text Section",
      "description": "Scroll-triggered animated text section (GSAP ScrollTrigger).",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "files": [
        {
          "path": "components/AnimatedTextSection.tsx",
          "type": "registry:component",
          "target": "components/AnimatedTextSection.tsx"
        },
        {
          "path": "components/animated-text-section.css",
          "type": "registry:file",
          "target": "components/animated-text-section.css"
        }
      ]
    },
    {
      "name": "shader-cover",
      "type": "registry:component",
      "title": "Shader Cover",
      "description": "Composed page-cover: a full-bleed shader background with a configurable blur/gradient overlay fade and foreground content. Pair with webgl-background (or any shader layer).",
      "registryDependencies": [
        "webgl-background"
      ],
      "files": [
        {
          "path": "components/shader-cover.tsx",
          "type": "registry:component",
          "target": "components/shader-cover.tsx"
        }
      ]
    },
    {
      "name": "posterized-frame",
      "type": "registry:hook",
      "title": "Posterized Frame Hook",
      "description": "usePosterizedFrame \u2014 steps the current frame so Remotion animations can opt into a stop-motion-on-twos cadence while the composition stays at its native fps.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/hooks/usePosterizedFrame.ts",
          "type": "registry:hook",
          "target": "components/motion/hooks/usePosterizedFrame.ts"
        }
      ]
    },
    {
      "name": "motion-easing",
      "type": "registry:lib",
      "title": "Motion Easing",
      "description": "GSAP-style easing curves for Remotion (power/back/long-ease-out, textRevealEase, dramaticEaseOut) as ready-to-use Easing functions.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/lib/easing.ts",
          "type": "registry:lib",
          "target": "components/motion/lib/easing.ts"
        }
      ]
    },
    {
      "name": "frame-velocity",
      "type": "registry:hook",
      "title": "Frame Velocity Hook",
      "description": "useFrameVelocity \u2014 derives per-frame velocity/direction from animated points, used to drive kinetic motion-blur amounts.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/kinetic/useFrameVelocity.ts",
          "type": "registry:hook",
          "target": "components/motion/components/kinetic/useFrameVelocity.ts"
        }
      ]
    },
    {
      "name": "streaming-text",
      "type": "registry:component",
      "title": "Streaming Text",
      "description": "Word-by-word streaming text reveal for Remotion, eased with textRevealEase.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "motion-easing"
      ],
      "files": [
        {
          "path": "../motion/src/components/text/RemotionStreamingText.tsx",
          "type": "registry:component",
          "target": "components/motion/components/text/RemotionStreamingText.tsx"
        }
      ]
    },
    {
      "name": "typing",
      "type": "registry:component",
      "title": "Typing Animation",
      "description": "Typewriter-style word appearance animation for Remotion.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/text/TypingAnimation.tsx",
          "type": "registry:component",
          "target": "components/motion/components/text/TypingAnimation.tsx"
        }
      ]
    },
    {
      "name": "redraw-text",
      "type": "registry:component",
      "title": "Redraw Text",
      "description": "Text that redraws/wipes in on each frame, eased with textRevealEase.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "motion-easing"
      ],
      "files": [
        {
          "path": "../motion/src/components/text/RemotionRedrawText.tsx",
          "type": "registry:component",
          "target": "components/motion/components/text/RemotionRedrawText.tsx"
        }
      ]
    },
    {
      "name": "shimmer",
      "type": "registry:component",
      "title": "Shimmer",
      "description": "Animated gradient shimmer sweep across text for Remotion.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/text/RemotionShimmer.tsx",
          "type": "registry:component",
          "target": "components/motion/components/text/RemotionShimmer.tsx"
        }
      ]
    },
    {
      "name": "emphasized-text",
      "type": "registry:component",
      "title": "Emphasized Text",
      "description": "Per-word emphasis reveal with posterized cadence and long-ease-out settling.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame",
        "motion-easing"
      ],
      "files": [
        {
          "path": "../motion/src/components/text/EmphasizedText.tsx",
          "type": "registry:component",
          "target": "components/motion/components/text/EmphasizedText.tsx"
        }
      ]
    },
    {
      "name": "boiling-texture",
      "type": "registry:component",
      "title": "Boiling Texture",
      "description": "Analog 'boiling line' SVG displacement texture on a posterized cadence.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame"
      ],
      "files": [
        {
          "path": "../motion/src/components/analog/BoilingTexture.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/BoilingTexture.tsx"
        }
      ]
    },
    {
      "name": "scribbled-text",
      "type": "registry:component",
      "title": "Scribbled Text",
      "description": "Hand-scribbled, jittering text outline driven by an SVG turbulence filter on a posterized cadence.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame"
      ],
      "files": [
        {
          "path": "../motion/src/components/analog/ScribbledText.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/ScribbledText.tsx"
        }
      ]
    },
    {
      "name": "turbulent-text",
      "type": "registry:component",
      "title": "Turbulent Text",
      "description": "Wobbling, turbulent-displaced text using an animated SVG feTurbulence filter on a posterized cadence.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame"
      ],
      "files": [
        {
          "path": "../motion/src/components/analog/TurbulentText.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/TurbulentText.tsx"
        }
      ]
    },
    {
      "name": "choker-reveal",
      "type": "registry:component",
      "title": "Choker Reveal",
      "description": "Mask-choke reveal that opens text/elements with a posterized cadence and long-ease-out.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame",
        "motion-easing"
      ],
      "files": [
        {
          "path": "../motion/src/components/analog/ChokerReveal.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/ChokerReveal.tsx"
        }
      ]
    },
    {
      "name": "chromatic-aberration",
      "type": "registry:component",
      "title": "Chromatic Aberration",
      "description": "RGB-split chromatic aberration wrappers (light and heavy) for an analog/lo-fi look.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/analog/ChromaticAberrationLight.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/ChromaticAberrationLight.tsx"
        },
        {
          "path": "../motion/src/components/analog/ChromaticAberrationHeavy.tsx",
          "type": "registry:component",
          "target": "components/motion/components/analog/ChromaticAberrationHeavy.tsx"
        }
      ]
    },
    {
      "name": "kinetic-blur",
      "type": "registry:component",
      "title": "Kinetic Blur",
      "description": "Velocity-driven directional motion blur for moving elements in Remotion.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "frame-velocity"
      ],
      "files": [
        {
          "path": "../motion/src/components/kinetic/KineticBlur.tsx",
          "type": "registry:component",
          "target": "components/motion/components/kinetic/KineticBlur.tsx"
        }
      ]
    },
    {
      "name": "camera-zoom",
      "type": "registry:component",
      "title": "Camera Zoom",
      "description": "Camera-style zoom layer + zoom container for push-in / pull-out moves in Remotion.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/layout/CameraZoomLayer.tsx",
          "type": "registry:component",
          "target": "components/motion/components/layout/CameraZoomLayer.tsx"
        },
        {
          "path": "../motion/src/components/layout/ZoomContainer.tsx",
          "type": "registry:component",
          "target": "components/motion/components/layout/ZoomContainer.tsx"
        }
      ]
    },
    {
      "name": "kinetic-cursor",
      "type": "registry:component",
      "title": "Kinetic Cursor",
      "description": "Animated cursor sprite that moves along a path with posterized cadence. Also copy the Kenney cursor sprites into public/cursors/ (arrow.png, pointer.png) referenced via staticFile().",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "posterized-frame"
      ],
      "files": [
        {
          "path": "../motion/src/components/cursor/RemotionCursor.tsx",
          "type": "registry:component",
          "target": "components/motion/components/cursor/RemotionCursor.tsx"
        }
      ]
    },
    {
      "name": "progressive-blur",
      "type": "registry:component",
      "title": "Progressive Blur",
      "description": "Layered progressive (gradient) blur overlay for edges/foreground depth.",
      "dependencies": [
        "remotion"
      ],
      "files": [
        {
          "path": "../motion/src/components/effects/ProgressiveBlur.tsx",
          "type": "registry:component",
          "target": "components/motion/components/effects/ProgressiveBlur.tsx"
        }
      ]
    },
    {
      "name": "media-viewer-types",
      "type": "registry:lib",
      "title": "Media Viewer Types",
      "description": "Shared TypeScript types for the media viewer / carousel suite: MediaData, Comment, MediaViewerProps and ViewMode.",
      "files": [
        {
          "path": "components/mediaViewer/types.ts",
          "type": "registry:lib",
          "target": "components/mediaViewer/types.ts"
        }
      ]
    },
    {
      "name": "use-embla-autoplay",
      "type": "registry:hook",
      "title": "Use Embla Autoplay",
      "description": "Hook that wraps the Embla autoplay plugin: exposes play/pause state, a toggle, and an interaction-aware button handler.",
      "dependencies": [
        "embla-carousel"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/hooks/useAutoplay.ts",
          "type": "registry:hook",
          "target": "components/mediaCarousel/hooks/useAutoplay.ts"
        }
      ]
    },
    {
      "name": "use-embla-autoplay-progress",
      "type": "registry:hook",
      "title": "Use Embla Autoplay Progress",
      "description": "Hook that derives autoplay progress visibility and remaining duration from the Embla autoplay plugin timer events.",
      "dependencies": [
        "embla-carousel"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/hooks/useAutoplayProgress.ts",
          "type": "registry:hook",
          "target": "components/mediaCarousel/hooks/useAutoplayProgress.ts"
        }
      ]
    },
    {
      "name": "use-media-viewer",
      "type": "registry:hook",
      "title": "Use Media Viewer",
      "description": "Hook managing media viewer zoom, pan/drag and view-mode state, including wheel-to-zoom toward the cursor.",
      "registryDependencies": [
        "@adv/media-viewer-types"
      ],
      "files": [
        {
          "path": "components/mediaViewer/hooks/use-media-viewer.ts",
          "type": "registry:hook",
          "target": "components/mediaViewer/hooks/use-media-viewer.ts"
        }
      ]
    },
    {
      "name": "use-gsap-transition",
      "type": "registry:hook",
      "title": "Use GSAP Transition",
      "description": "Hook that animates a thumbnail into a centered full-screen viewer (and back) by cloning the element and tweening it with GSAP.",
      "dependencies": [
        "gsap"
      ],
      "files": [
        {
          "path": "components/mediaViewer/hooks/use-gsap-transition.ts",
          "type": "registry:hook",
          "target": "components/mediaViewer/hooks/use-gsap-transition.ts"
        }
      ]
    },
    {
      "name": "circular-progress",
      "type": "registry:component",
      "title": "Circular Progress",
      "description": "Play/pause button ringed by a GSAP-animated circular progress indicator, sized for carousel autoplay controls.",
      "dependencies": [
        "gsap"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/circular-progress.tsx",
          "type": "registry:component",
          "target": "components/mediaCarousel/circular-progress.tsx"
        }
      ]
    },
    {
      "name": "lazy-load-image",
      "type": "registry:component",
      "title": "Lazy Load Image",
      "description": "Carousel slide that lazily swaps in its image only when in view, with a spinner placeholder, hover overlay and category badge.",
      "registryDependencies": [
        "@adv/base",
        "badge"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/lazy-load-image.tsx",
          "type": "registry:component",
          "target": "components/mediaCarousel/lazy-load-image.tsx"
        }
      ]
    },
    {
      "name": "carousel-arrow-buttons",
      "type": "registry:component",
      "title": "Carousel Arrow Buttons",
      "description": "Prev/next arrow buttons plus a usePrevNextButtons hook that tracks scroll-edge disabled state for an Embla carousel.",
      "dependencies": [
        "embla-carousel"
      ],
      "registryDependencies": [
        "@adv/base"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/carousel-arrow-buttons.tsx",
          "type": "registry:component",
          "target": "components/mediaCarousel/carousel-arrow-buttons.tsx"
        }
      ]
    },
    {
      "name": "carousel-dot-button",
      "type": "registry:component",
      "title": "Carousel Dot Button",
      "description": "Dot pagination button plus a useDotButton hook exposing selected index and scroll snaps for an Embla carousel.",
      "dependencies": [
        "embla-carousel"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/carousel-dot-button.tsx",
          "type": "registry:component",
          "target": "components/mediaCarousel/carousel-dot-button.tsx"
        }
      ]
    },
    {
      "name": "media-carousel",
      "type": "registry:component",
      "title": "Media Carousel",
      "description": "Embla-powered media carousel with autoplay, a MeshGradient backdrop, lazy-loaded slides, animated slide caption and a circular autoplay/progress control. Pass onItemClick to open a lightbox of your choice.",
      "dependencies": [
        "embla-carousel",
        "embla-carousel-react",
        "embla-carousel-autoplay",
        "@paper-design/shaders-react",
        "gsap"
      ],
      "registryDependencies": [
        "@adv/base",
        "badge",
        "@adv/carousel-dot-button",
        "@adv/carousel-arrow-buttons",
        "@adv/lazy-load-image",
        "@adv/circular-progress",
        "@adv/use-embla-autoplay",
        "@adv/use-embla-autoplay-progress"
      ],
      "files": [
        {
          "path": "components/mediaCarousel/media-carousel.tsx",
          "type": "registry:component",
          "target": "components/mediaCarousel/media-carousel.tsx"
        }
      ]
    },
    {
      "name": "auto-play-tabs-lazy-load-image",
      "type": "registry:component",
      "title": "Lazy Load Image (next/image)",
      "description": "A next/image wrapper that tracks idle/loading/loaded/error state, shows a spinner placeholder and fades the image in once loaded.",
      "dependencies": [
        "next"
      ],
      "registryDependencies": [
        "@adv/base"
      ],
      "files": [
        {
          "path": "components/autoPlayTabs/AutoPlayTabsLazyLoadImage.tsx",
          "type": "registry:component",
          "target": "components/autoPlayTabs/AutoPlayTabsLazyLoadImage.tsx"
        }
      ]
    },
    {
      "name": "featured-work-carousel",
      "type": "registry:component",
      "title": "Featured Work Carousel",
      "description": "A full-width, accessible featured-work carousel: one slide per item with a lazy-loaded hero image, year/company overlays, title/role/description and a 'View case study' link. Includes dot nav, hover/focus autoplay pause and a circular autoplay/progress control. Respects prefers-reduced-motion.",
      "dependencies": [
        "embla-carousel",
        "embla-carousel-react",
        "embla-carousel-autoplay",
        "framer-motion",
        "next"
      ],
      "registryDependencies": [
        "@adv/base",
        "@adv/auto-play-tabs-lazy-load-image",
        "@adv/use-embla-autoplay",
        "@adv/use-embla-autoplay-progress",
        "@adv/circular-progress",
        "@adv/carousel-arrow-buttons",
        "@adv/carousel-dot-button"
      ],
      "files": [
        {
          "path": "components/featuredWorkCarousel/FeaturedWorkCarousel.tsx",
          "type": "registry:component",
          "target": "components/featuredWorkCarousel/FeaturedWorkCarousel.tsx"
        }
      ]
    },
    {
      "name": "section-accordion-types",
      "type": "registry:lib",
      "title": "Section Accordion Types",
      "description": "Shared TypeScript interfaces (ContentItem, FilterOption) for the section-feeds / section-accordion suite. No seed data — import only the type shapes.",
      "files": [
        {
          "path": "components/sectionAccordion/types.ts",
          "type": "registry:lib",
          "target": "components/sectionAccordion/types.ts"
        }
      ]
    },
    {
      "name": "accordion-filter-group",
      "type": "registry:component",
      "title": "Accordion Filter Group",
      "description": "Single animated accordion panel of labelled checkboxes for sidebar filter UIs. CSS height animation via useLayoutEffect; staggered checkbox entrance.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "accordion",
        "checkbox",
        "@adv/section-accordion-types"
      ],
      "files": [
        {
          "path": "components/sectionAccordion/accordion-filter-group.tsx",
          "type": "registry:component",
          "target": "components/sectionAccordion/accordion-filter-group.tsx"
        }
      ]
    },
    {
      "name": "filter-section",
      "type": "registry:component",
      "title": "Filter Section",
      "description": "Sidebar filter panel composing two AccordionFilterGroup instances (Type + Topic). Filter options are fully prop-driven — bring your own data.",
      "registryDependencies": [
        "accordion",
        "button",
        "@adv/accordion-filter-group",
        "@adv/section-accordion-types"
      ],
      "files": [
        {
          "path": "components/sectionAccordion/filter-section.tsx",
          "type": "registry:component",
          "target": "components/sectionAccordion/filter-section.tsx"
        }
      ]
    },
    {
      "name": "content-list-item",
      "type": "registry:component",
      "title": "Content List Item",
      "description": "Expandable content row (date, name, type badge) with GSAP height/opacity tween and rotating Plus icon. Reveals summary, author and optional Watch CTA.",
      "dependencies": [
        "gsap",
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "@adv/section-accordion-types"
      ],
      "files": [
        {
          "path": "components/sectionAccordion/content-list-item.tsx",
          "type": "registry:component",
          "target": "components/sectionAccordion/content-list-item.tsx"
        }
      ]
    },
    {
      "name": "content-list-section",
      "type": "registry:component",
      "title": "Content List Section",
      "description": "Full content list panel: column header row (Date / Name / Type) plus a stack of expandable ContentListItem rows. Items are supplied via props.",
      "registryDependencies": [
        "@adv/content-list-item",
        "@adv/section-accordion-types"
      ],
      "files": [
        {
          "path": "components/sectionAccordion/content-list-section.tsx",
          "type": "registry:component",
          "target": "components/sectionAccordion/content-list-section.tsx"
        }
      ]
    },
    {
      "name": "section-feeds",
      "type": "registry:component",
      "title": "Section Feeds",
      "description": "Top-level feeds composer: 4-column responsive grid wiring FilterSection (left) and ContentListSection (right). Internal accordion/expansion state; all data via props.",
      "registryDependencies": [
        "@adv/filter-section",
        "@adv/content-list-section",
        "@adv/section-accordion-types"
      ],
      "files": [
        {
          "path": "components/section-feeds.tsx",
          "type": "registry:component",
          "target": "components/section-feeds.tsx"
        }
      ]
    },
    {
      "name": "magazine-grid",
      "type": "registry:component",
      "title": "Magazine Grid",
      "description": "A headless pagination utility that splits sized grid items across fixed-height pages and fires onPaginate with the result. Renders null.",
      "files": [
        {
          "path": "components/magazine-grid.tsx",
          "type": "registry:component",
          "target": "components/magazine-grid.tsx"
        }
      ]
    },
    {
      "name": "boot-footer",
      "type": "registry:component",
      "title": "Boot Footer",
      "description": "A themed terminal-style footer bar with an animated ENTER key prompt and optional countdown display. Pairs with boot-screen.",
      "dependencies": [
        "framer-motion"
      ],
      "files": [
        {
          "path": "components/boot-footer.tsx",
          "type": "registry:component",
          "target": "components/boot-footer.tsx"
        },
        {
          "path": "components/ui/banner-notification-theme-config.ts",
          "type": "registry:component",
          "target": "components/ui/banner-notification-theme-config.ts"
        }
      ]
    },
    {
      "name": "horizontal-scroll-section",
      "type": "registry:component",
      "title": "Horizontal Scroll Section",
      "description": "A GSAP-powered full-viewport section that translates a card track horizontally as the user scrolls, with snap points centred on each card.",
      "dependencies": [
        "gsap",
        "@gsap/react"
      ],
      "files": [
        {
          "path": "components/HorizontalScrollSection.tsx",
          "type": "registry:component",
          "target": "components/HorizontalScrollSection.tsx"
        }
      ]
    },
    {
      "name": "background-component",
      "type": "registry:component",
      "title": "Background Component",
      "description": "A polymorphic background renderer: dithering shader, mesh gradient, WebGL pixel art, dotted-grid pattern, or none — all theme-aware via next-themes.",
      "dependencies": [
        "@paper-design/shaders-react",
        "next-themes"
      ],
      "registryDependencies": [
        "@adv/base",
        "@adv/webgl-background"
      ],
      "files": [
        {
          "path": "components/BackgroundComponent.tsx",
          "type": "registry:component",
          "target": "components/BackgroundComponent.tsx"
        }
      ]
    },
    {
      "name": "envelope-animation",
      "type": "registry:component",
      "title": "Envelope Animation",
      "description": "A multi-stage Framer Motion animation that opens an envelope to reveal a paginated portfolio book. Fully data-agnostic via the EnvelopeData prop.",
      "dependencies": [
        "framer-motion",
        "lucide-react"
      ],
      "registryDependencies": [
        "@adv/base"
      ],
      "files": [
        {
          "path": "components/envelope-animation.tsx",
          "type": "registry:component",
          "target": "components/envelope-animation.tsx"
        }
      ]
    },
    {
      "name": "boot-screen",
      "type": "registry:component",
      "title": "Boot Screen",
      "description": "A full-screen terminal boot sequence with theme-aware colours, typewriter greeting, countdown auto-advance, and optional audio callbacks. Composes boot-footer and blinking-cursor.",
      "dependencies": [
        "framer-motion",
        "next-themes"
      ],
      "registryDependencies": [
        "@adv/base",
        "@adv/boot-footer",
        "@adv/blinking-cursor"
      ],
      "files": [
        {
          "path": "components/boot-screen.tsx",
          "type": "registry:component",
          "target": "components/boot-screen.tsx"
        }
      ]
    },
    {
      "name": "page-thumbnails",
      "type": "registry:component",
      "title": "Page Thumbnails",
      "description": "A fixed left-sidebar thumbnail navigator for multi-page document views with auto-scroll to the active thumbnail. Data-agnostic.",
      "files": [
        {
          "path": "components/page-thumbnails.tsx",
          "type": "registry:component",
          "target": "components/page-thumbnails.tsx"
        }
      ]
    },
    {
      "name": "mobile-page-thumbnails",
      "type": "registry:component",
      "title": "Mobile Page Thumbnails",
      "description": "A collapsible bottom-tray thumbnail navigator for mobile, with TextScramble title animation and click-outside collapse.",
      "registryDependencies": [
        "@adv/text-scramble"
      ],
      "files": [
        {
          "path": "components/mobile-page-thumbnails.tsx",
          "type": "registry:component",
          "target": "components/mobile-page-thumbnails.tsx"
        }
      ]
    },
    {
      "name": "mobile-portfolio-view",
      "type": "registry:component",
      "title": "Mobile Portfolio View",
      "description": "A mobile-first scrollable page layout with IntersectionObserver page tracking, a bottom thumbnail drawer, and a FloatingActionButton. Accepts pages as ReactNode[].",
      "registryDependencies": [
        "@adv/floating-action-button",
        "@adv/mobile-page-thumbnails"
      ],
      "files": [
        {
          "path": "components/mobile-portfolio-view.tsx",
          "type": "registry:component",
          "target": "components/mobile-portfolio-view.tsx"
        }
      ]
    },
    {
      "name": "recent-activity",
      "type": "registry:component",
      "title": "Recent Activity",
      "description": "Sidebar widget listing recent activity items with a configurable More link. Data-agnostic via the activities prop.",
      "dependencies": [
        "next"
      ],
      "files": [
        {
          "path": "components/sidebar/RecentActivity.tsx",
          "type": "registry:component",
          "target": "components/sidebar/RecentActivity.tsx"
        }
      ]
    },
    {
      "name": "sidebar-header",
      "type": "registry:component",
      "title": "Sidebar Header",
      "description": "Sidebar header with name, tagline, and a self-contained next-themes theme toggle.",
      "dependencies": [
        "next-themes"
      ],
      "files": [
        {
          "path": "components/sidebar/SidebarHeader.tsx",
          "type": "registry:component",
          "target": "components/sidebar/SidebarHeader.tsx"
        },
        {
          "path": "components/sidebar/theme-toggle.tsx",
          "type": "registry:component",
          "target": "components/sidebar/theme-toggle.tsx"
        }
      ]
    },
    {
      "name": "sidebar-navigation",
      "type": "registry:component",
      "title": "Sidebar Navigation",
      "description": "Sidebar nav with section-scroll and route links, badge support, and optional staggered reveal animation. Items and active section via props.",
      "dependencies": [
        "next"
      ],
      "registryDependencies": [
        "badge"
      ],
      "files": [
        {
          "path": "components/sidebar/SidebarNavigation.tsx",
          "type": "registry:component",
          "target": "components/sidebar/SidebarNavigation.tsx"
        }
      ]
    },
    {
      "name": "sidebar-footer",
      "type": "registry:component",
      "title": "Sidebar Footer",
      "description": "Sidebar footer with Resume link, a 'Work with me' contact dropdown, social icon row with tooltips, and framer-motion staggered reveal.",
      "dependencies": [
        "framer-motion",
        "next-themes",
        "lucide-react",
        "@radix-ui/react-tooltip",
        "@radix-ui/react-dropdown-menu"
      ],
      "files": [
        {
          "path": "components/sidebar/SidebarFooter.tsx",
          "type": "registry:component",
          "target": "components/sidebar/SidebarFooter.tsx"
        },
        {
          "path": "components/icons/brand-icons.tsx",
          "type": "registry:component",
          "target": "components/icons/brand-icons.tsx"
        }
      ]
    },
    {
      "name": "mobile-sidebar",
      "type": "registry:component",
      "title": "Mobile Sidebar",
      "description": "Mobile bottom-tray drawer sidebar (vaul) with section nav, recent activity, footer, and a TextScramble active-section label.",
      "dependencies": [
        "vaul",
        "lucide-react"
      ],
      "registryDependencies": [
        "@adv/sidebar-navigation",
        "@adv/sidebar-footer",
        "@adv/recent-activity",
        "@adv/text-scramble"
      ],
      "files": [
        {
          "path": "components/sidebar/MobileSidebar.tsx",
          "type": "registry:component",
          "target": "components/sidebar/MobileSidebar.tsx"
        },
        {
          "path": "components/ui/drawer.tsx",
          "type": "registry:component",
          "target": "components/ui/drawer.tsx"
        }
      ]
    },
    {
      "name": "sidebar",
      "type": "registry:component",
      "title": "Sidebar",
      "description": "Fixed desktop sidebar composer: header, navigation, recent activity, footer, and a theme-aware toaster, with framer-motion blur/opacity reveal and scroll-driven fade.",
      "dependencies": [
        "framer-motion",
        "sonner"
      ],
      "registryDependencies": [
        "@adv/sidebar-header",
        "@adv/sidebar-navigation",
        "@adv/recent-activity",
        "@adv/sidebar-footer",
        "@adv/theme-aware-toaster"
      ],
      "files": [
        {
          "path": "components/sidebar.tsx",
          "type": "registry:component",
          "target": "components/sidebar.tsx"
        }
      ]
    },
    {
      "name": "annotation-pin",
      "type": "registry:component",
      "title": "Annotation Pin",
      "description": "Clickable map pin positioned over the image; shows a hover tooltip with comment content.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "button", "card", "avatar", "badge"],
      "files": [{ "path": "components/mediaViewer/annotation-pin.tsx", "type": "registry:component", "target": "components/mediaViewer/annotation-pin.tsx" }]
    },
    {
      "name": "comment-item",
      "type": "registry:component",
      "title": "Comment Item",
      "description": "Single comment with author avatar, likes, reply button, and nested replies.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "button", "avatar"],
      "files": [{ "path": "components/mediaViewer/comment-item.tsx", "type": "registry:component", "target": "components/mediaViewer/comment-item.tsx" }]
    },
    {
      "name": "new-comment-dialog",
      "type": "registry:component",
      "title": "New Comment Dialog",
      "description": "Inline floating card for authoring a new annotation comment at a clicked position.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["button", "card", "textarea", "avatar"],
      "files": [{ "path": "components/mediaViewer/new-comment-dialog.tsx", "type": "registry:component", "target": "components/mediaViewer/new-comment-dialog.tsx" }]
    },
    {
      "name": "annotation-overlay",
      "type": "registry:component",
      "title": "Annotation Overlay",
      "description": "Transparent click-to-annotate layer over the image, rendering existing AnnotationPins.",
      "registryDependencies": ["@adv/media-viewer-types", "@adv/annotation-pin", "@adv/new-comment-dialog"],
      "files": [{ "path": "components/mediaViewer/annotation-overlay.tsx", "type": "registry:component", "target": "components/mediaViewer/annotation-overlay.tsx" }]
    },
    {
      "name": "comments-tab",
      "type": "registry:component",
      "title": "Comments Tab",
      "description": "Scrollable comment list with inline reply input.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "@adv/comment-item", "button", "avatar", "textarea", "scroll-area"],
      "files": [{ "path": "components/mediaViewer/comments-tab.tsx", "type": "registry:component", "target": "components/mediaViewer/comments-tab.tsx" }]
    },
    {
      "name": "details-content-tab",
      "type": "registry:component",
      "title": "Details Content Tab",
      "description": "Bottom-panel tab showing caption, description, process steps, and key insights.",
      "registryDependencies": ["@adv/media-viewer-types", "scroll-area"],
      "files": [{ "path": "components/mediaViewer/details-content-tab.tsx", "type": "registry:component", "target": "components/mediaViewer/details-content-tab.tsx" }]
    },
    {
      "name": "details-tab",
      "type": "registry:component",
      "title": "Details Tab",
      "description": "Sidebar panel showing file metadata, tags, external links (Figma, website, prototype), and related items.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "button", "badge", "separator", "scroll-area"],
      "files": [{ "path": "components/mediaViewer/details-tab.tsx", "type": "registry:component", "target": "components/mediaViewer/details-tab.tsx" }]
    },
    {
      "name": "media-meta-panel",
      "type": "registry:component",
      "title": "Media Meta Panel",
      "description": "Fixed-width sidebar that wraps DetailsTab.",
      "registryDependencies": ["@adv/media-viewer-types", "@adv/details-tab"],
      "files": [{ "path": "components/mediaViewer/media-meta-panel.tsx", "type": "registry:component", "target": "components/mediaViewer/media-meta-panel.tsx" }]
    },
    {
      "name": "viewer-content",
      "type": "registry:component",
      "title": "Viewer Content",
      "description": "Zoomable/draggable image pane with annotation overlay, or prototype iframe.",
      "dependencies": ["next", "lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "@adv/annotation-overlay"],
      "files": [{ "path": "components/mediaViewer/viewer-content.tsx", "type": "registry:component", "target": "components/mediaViewer/viewer-content.tsx" }]
    },
    {
      "name": "media-viewer-header",
      "type": "registry:component",
      "title": "Media Viewer Header",
      "description": "Navigation, zoom controls, view-mode tabs, and panel toggles for the MediaViewer.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/media-viewer-types", "button", "badge", "tooltip", "tabs", "separator"],
      "files": [{ "path": "components/mediaViewer/media-viewer-header.tsx", "type": "registry:component", "target": "components/mediaViewer/media-viewer-header.tsx" }]
    },
    {
      "name": "content-tabs",
      "type": "registry:component",
      "title": "Content Tabs",
      "description": "Static (non-resizable) tabbed panel below the viewer: Details and Comments tabs.",
      "registryDependencies": ["@adv/media-viewer-types", "@adv/viewer-content", "@adv/comments-tab", "@adv/details-content-tab", "tabs", "badge"],
      "files": [{ "path": "components/mediaViewer/content-tabs.tsx", "type": "registry:component", "target": "components/mediaViewer/content-tabs.tsx" }]
    },
    {
      "name": "resizable-content-tabs",
      "type": "registry:component",
      "title": "Resizable Content Tabs",
      "description": "Vertically resizable tabbed panel below the viewer image, with a drag handle.",
      "registryDependencies": ["@adv/media-viewer-types", "@adv/viewer-content", "@adv/comments-tab", "@adv/details-content-tab", "tabs", "badge"],
      "files": [{ "path": "components/mediaViewer/resizable-content-tabs.tsx", "type": "registry:component", "target": "components/mediaViewer/resizable-content-tabs.tsx" }]
    },
    {
      "name": "media-viewer",
      "type": "registry:component",
      "title": "Media Viewer",
      "description": "Full-screen media viewer with zoom, pan, prototype iframe, annotation pins, inline comments, resizable details panel, and optional GSAP transition.",
      "dependencies": ["@radix-ui/react-dialog", "lucide-react", "next", "gsap"],
      "registryDependencies": ["@adv/media-viewer-types", "@adv/use-media-viewer", "@adv/use-gsap-transition", "@adv/media-viewer-header", "@adv/resizable-content-tabs", "@adv/viewer-content", "@adv/media-meta-panel"],
      "files": [{ "path": "components/mediaViewer/index.tsx", "type": "registry:component", "target": "components/mediaViewer/index.tsx" }]
    },
    {
      "name": "intro-utils",
      "type": "registry:lib",
      "title": "Intro Utils",
      "description": "localStorage + URLSearchParams helpers for intro-sequence gating: shouldShowIntro, markIntroCompleted, getIntroFlags, attachIntroDebug, and related types.",
      "files": [{ "path": "lib/intro-utils.ts", "type": "registry:lib", "target": "lib/intro-utils.ts" }]
    },
    {
      "name": "section",
      "type": "registry:component",
      "title": "Section",
      "description": "A section wrapper with an optional WebGL background driven by palette-based per-shape colour schemes.",
      "dependencies": ["three"],
      "registryDependencies": ["@adv/webgl-background"],
      "files": [
        { "path": "components/Section.tsx", "type": "registry:component", "target": "components/Section.tsx" },
        { "path": "components/shaders/palettes.ts", "type": "registry:lib", "target": "components/shaders/palettes.ts" }
      ]
    },
    {
      "name": "discover-more",
      "type": "registry:component",
      "title": "Discover More",
      "description": "Renders two randomly-selected linked item cards from a caller-supplied list, fully decoupled from any data layer.",
      "dependencies": ["next"],
      "files": [{ "path": "components/ui/DiscoverMore.tsx", "type": "registry:component", "target": "components/ui/DiscoverMore.tsx" }]
    },
    {
      "name": "intro-sequence",
      "type": "registry:component",
      "title": "Intro Sequence",
      "description": "Multi-section intro renderer supporting animated-text, horizontal-scroll, meta, and static section types with localStorage-persisted completion.",
      "registryDependencies": ["@adv/animated-text-section", "@adv/horizontal-scroll-section", "@adv/section", "@adv/intro-utils"],
      "files": [{ "path": "components/IntroSequence.tsx", "type": "registry:component", "target": "components/IntroSequence.tsx" }]
    },
    {
      "name": "item-modal-content",
      "type": "registry:component",
      "title": "Item Modal Content",
      "description": "Full case-study / work-item layout: header, Embla carousel with MeshGradient, HTML prose with image zoom, mobile pagination, Discover More, and a MediaViewer lightbox.",
      "dependencies": ["next-themes"],
      "registryDependencies": ["@adv/item-header-blocks", "@adv/media-carousel", "@adv/item-pagination", "@adv/media-viewer", "@adv/discover-more", "@adv/item-modal-footer"],
      "files": [{ "path": "components/ui/ItemModalContent.tsx", "type": "registry:component", "target": "components/ui/ItemModalContent.tsx" }]
    },
    {
      "name": "intro-gate-case-study",
      "type": "registry:component",
      "title": "Intro Gate — Case Study",
      "description": "Drop-in page gate that plays an IntroSequence on first visit then renders ItemPageLayout + ItemModalContent. Supports ?intro=force / ?intro=disable URL overrides.",
      "dependencies": ["next"],
      "registryDependencies": ["@adv/intro-utils", "@adv/intro-sequence", "@adv/item-page-layout", "@adv/item-modal-content", "@adv/item-header-blocks"],
      "files": [{ "path": "components/IntroGateCaseStudy.tsx", "type": "registry:component", "target": "components/IntroGateCaseStudy.tsx" }]
    },
    {
      "name": "contact-section",
      "type": "registry:component",
      "title": "Contact Section",
      "description": "Scroll-triggered contact CTA section with GSAP ScrollTrigger entrance animation and button shine effect. Fully configurable via props.",
      "dependencies": ["gsap", "@gsap/react", "lucide-react"],
      "registryDependencies": ["@adv/base"],
      "files": [{ "path": "components/sections/contact-section.tsx", "type": "registry:component", "target": "components/sections/contact-section.tsx" }]
    },
    {
      "name": "about-section",
      "type": "registry:component",
      "title": "About Section",
      "description": "Structured about-me section with bio paragraphs, a learn-more link, and a two-column skills grid. All content is prop-driven.",
      "dependencies": ["lucide-react", "next"],
      "registryDependencies": ["@adv/base"],
      "files": [{ "path": "components/sections/about-section.tsx", "type": "registry:component", "target": "components/sections/about-section.tsx" }]
    },
    {
      "name": "work-list-with-preview",
      "type": "registry:component",
      "title": "Work List with Preview",
      "description": "Hover-driven work item list with a live right-side preview panel. Router-agnostic via onSelect / getItemHref props.",
      "dependencies": ["framer-motion", "lucide-react", "next"],
      "registryDependencies": ["@adv/base", "badge"],
      "files": [{ "path": "components/sections/work-list-with-preview.tsx", "type": "registry:component", "target": "components/sections/work-list-with-preview.tsx" }]
    },
    {
      "name": "work-section",
      "type": "registry:component",
      "title": "Work Section",
      "description": "Full work list with sticky leet-speak scramble heading, custom cyberpunk cursor, BorderPattern indicators, side preview panel, and per-item visibility gating.",
      "dependencies": ["gsap", "framer-motion", "lucide-react", "next", "react-progressive-blur"],
      "registryDependencies": ["@adv/base", "@adv/border-pattern", "@adv/animated-cyberpunk-cursor", "badge"],
      "files": [{ "path": "components/sections/work-section.tsx", "type": "registry:component", "target": "components/sections/work-section.tsx" }]
    },
    {
      "name": "all-work-browse",
      "type": "registry:component",
      "title": "All Work Browse",
      "description": "Company-grouped work browser with sticky horizontal jump-nav, inline scroll-spy active state, and per-group WorkSection panels.",
      "dependencies": ["framer-motion", "lucide-react", "next"],
      "registryDependencies": ["@adv/base", "@adv/work-section"],
      "files": [{ "path": "components/sections/all-work-browse.tsx", "type": "registry:component", "target": "components/sections/all-work-browse.tsx" }]
    },
    {
      "name": "feed-section",
      "type": "registry:component",
      "title": "Feed Section",
      "description": "Filterable, paginated feed list with sticky GSAP scramble heading, hover image-preview cursor, mobile Drawer filter sheet, and GSAP expand/collapse per item.",
      "dependencies": ["gsap", "framer-motion", "lucide-react", "next", "react-progressive-blur"],
      "registryDependencies": ["@adv/base", "@adv/accordion-filter-group", "badge", "button", "drawer", "accordion"],
      "files": [{ "path": "components/sections/feed-section.tsx", "type": "registry:component", "target": "components/sections/feed-section.tsx" }]
    },
    {
      "name": "orgs-overview-dialog",
      "type": "registry:component",
      "title": "Orgs Overview Dialog",
      "description": "Trigger button opening an org roster in a Dialog (desktop, scales from button origin) or Drawer (mobile). Per-org visibility gating.",
      "dependencies": ["lucide-react"],
      "registryDependencies": ["@adv/base", "dialog", "drawer"],
      "files": [{ "path": "components/autoPlayTabs/OrgsOverviewDialog.tsx", "type": "registry:component", "target": "components/autoPlayTabs/OrgsOverviewDialog.tsx" }]
    },
    {
      "name": "auto-play-tabs",
      "type": "registry:component",
      "title": "Auto Play Tabs",
      "description": "Autoplay tab strip with GSAP progress bar, per-tab visibility gating, custom cyberpunk cursor on content hover, and an optional WorkListWithPreview panel for a 'more-orgs' tab.",
      "dependencies": ["gsap", "framer-motion", "lucide-react", "next"],
      "registryDependencies": ["@adv/base", "@adv/auto-play-tabs-lazy-load-image", "@adv/animated-cyberpunk-cursor", "@adv/work-list-with-preview", "badge"],
      "files": [{ "path": "components/autoPlayTabs/AutoplayTabs.tsx", "type": "registry:component", "target": "components/autoPlayTabs/AutoplayTabs.tsx" }]
    },
    {
      "name": "hero-section",
      "type": "registry:component",
      "title": "Hero Section",
      "description": "Full-screen hero with word-by-word typing animation, blinking cursor, 'Previously at' scramble reveal, composable AutoplayTabs and OrgsOverviewDialog slots, and optional background slot.",
      "dependencies": ["gsap", "@gsap/react"],
      "registryDependencies": ["@adv/base", "@adv/auto-play-tabs", "@adv/orgs-overview-dialog"],
      "files": [{ "path": "components/sections/hero-section.tsx", "type": "registry:component", "target": "components/sections/hero-section.tsx" }]
    }
  ]
}
