{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "hero-video-modal-walkthrough",
  "title": "Hero Video Modal Walkthrough",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/hero-video-modal-walkthrough/hero-video-modal-walkthrough.component.ts",
      "content": "// Product walkthrough hero with an interactive video modal player: chapter\n// timestamps, playback speed controls, mute/play toggles and social proof.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport { BookOpen, LucideAngularModule, Maximize2, Pause, Play, Star, Volume2, VolumeX, X } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport { UiCardComponent } from '@/ui/card/card.component'\n\nexport interface HeroVideoChapter {\n  id: string\n  title: string\n  timestamp: string\n  description: string\n}\n\nconst chapters: HeroVideoChapter[] = [\n  {\n    id: 'intro',\n    title: '1. Architecture & Registry Engine',\n    timestamp: '0:45',\n    description: 'Learn how unbundled components provide 100% source ownership without npm dependencies.',\n  },\n  {\n    id: 'tokens',\n    title: '2. OKLCH Theme & Token System',\n    timestamp: '1:30',\n    description: 'Explore the fluid color space engine and dynamic contrast balancing in Tailwind v4.',\n  },\n  {\n    id: 'parity',\n    title: '3. Dual-Framework Parity Model',\n    timestamp: '2:15',\n    description: 'Deep dive into mirror synchronization between Vue 3.5 SFC and React 19 TSX.',\n  },\n]\n\nconst avatarTiles = [\n  { initials: 'RF', tone: 'bg-primary/20 text-primary' },\n  { initials: 'PC', tone: 'bg-success/20 text-success' },\n  { initials: 'EK', tone: 'bg-info/20 text-info' },\n  { initials: 'SH', tone: 'bg-warning/20 text-warning' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-hero-video-modal-walkthrough, [ui-hero-video-modal-walkthrough]',\n  standalone: true,\n  // React renders the root <section> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [LucideAngularModule, UiBadgeComponent, UiButtonComponent, UiCardComponent],\n  template: `\n    <section data-slot=\"hero-video-modal-walkthrough\" [class]=\"rootClass\">\n      <!-- Ambient Glow Background -->\n      <div\n        class=\"bg-primary/10 pointer-events-none absolute top-12 left-1/2 -z-10 h-72 w-full max-w-5xl -translate-x-1/2 rounded-full blur-xl\"\n      ></div>\n\n      <div class=\"mx-auto max-w-6xl space-y-12 text-center\">\n        <!-- Headline & Subtitle -->\n        <div class=\"mx-auto max-w-3xl space-y-5\">\n          <span ui-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n            <lucide-icon [img]=\"Play\" class=\"text-primary fill-primary/20 size-3.5\" />\n            Interactive 3-Minute Architecture Walkthrough\n          </span>\n\n          <h1 class=\"text-foreground text-4xl leading-[1.12] font-bold tracking-tight sm:text-5xl lg:text-6xl\">\n            See how top engineering teams build with UIPKGE.\n          </h1>\n\n          <p class=\"text-muted-foreground text-base leading-relaxed sm:text-lg\">\n            Watch a full walkthrough of our design engineering principles, OKLCH token engine, and dual-framework\n            component architecture.\n          </p>\n\n          <!-- CTA Action Buttons -->\n          <div class=\"flex flex-wrap items-center justify-center gap-3 pt-2\">\n            <button ui-button size=\"lg\" class=\"gap-2 font-semibold shadow-xs\" (click)=\"openModal(0)\">\n              <lucide-icon [img]=\"Play\" class=\"size-4 fill-current\" />\n              <span>Watch Product Tour (3:30)</span>\n            </button>\n\n            <a ui-button href=\"#docs\" variant=\"outline\" size=\"lg\" class=\"gap-2 font-medium\">\n              <lucide-icon [img]=\"BookOpen\" class=\"text-muted-foreground size-4\" />\n              <span>Read Architecture RFC</span>\n            </a>\n          </div>\n\n          <!-- Social Proof Avatars & Stars -->\n          <div class=\"text-muted-foreground flex flex-wrap items-center justify-center gap-6 pt-3 text-xs\">\n            <div class=\"flex -space-x-2 overflow-hidden\">\n              @for (avatar of avatars; track avatar.initials) {\n                <div\n                  [class]=\"\n                    'ring-background flex inline-block size-7 items-center justify-center rounded-full text-xs font-bold ring-2 ' +\n                    avatar.tone\n                  \"\n                >\n                  {{ avatar.initials }}\n                </div>\n              }\n            </div>\n            <div class=\"text-warning flex items-center gap-1\">\n              @for (star of stars; track star) {\n                <lucide-icon [img]=\"Star\" class=\"size-3.5 fill-current\" />\n              }\n              <span class=\"text-foreground ml-1 font-mono text-xs font-medium\">4.9/5 by 1,400+ Design Engineers</span>\n            </div>\n          </div>\n        </div>\n\n        <!-- Video Preview Card & Chapter Trigger Grid -->\n        <div class=\"mx-auto max-w-4xl\">\n          <div\n            ui-card\n            class=\"border-border bg-card group focus-visible:ring-ring cursor-pointer overflow-hidden rounded-2xl p-2 shadow-sm transition-[box-shadow,transform] duration-150 focus-visible:ring-2 focus-visible:outline-none active:scale-[0.99]\"\n            role=\"button\"\n            tabindex=\"0\"\n            aria-label=\"Launch interactive video player\"\n            (click)=\"openModal(0)\"\n            (keydown.enter)=\"openModal(0)\"\n            (keydown.space)=\"$event.preventDefault(); openModal(0)\"\n          >\n            <!-- Video Thumbnail Frame -->\n            <div\n              class=\"bg-muted/60 border-border/80 relative flex aspect-video flex-col justify-between overflow-hidden rounded-lg border p-6 text-left\"\n            >\n              <!-- Overlay Backdrop Texture -->\n              <div\n                class=\"from-background/95 via-background/40 absolute inset-0 z-0 bg-gradient-to-t to-transparent\"\n              ></div>\n\n              <!-- Top Row: Badge & Length -->\n              <div class=\"relative z-10 flex items-center justify-between\">\n                <span\n                  class=\"bg-background/80 border-border text-foreground inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 font-mono text-xs font-medium backdrop-blur-md\"\n                >\n                  <span class=\"bg-success size-2 animate-pulse rounded-full\"></span>\n                  <span>Full HD &bull; 60 FPS</span>\n                </span>\n                <span\n                  class=\"bg-background/80 border-border text-muted-foreground rounded-md border px-2.5 py-1 font-mono text-xs backdrop-blur-md\"\n                >\n                  Total runtime: 3m 30s\n                </span>\n              </div>\n\n              <!-- Center: Play Button Beacon -->\n              <div class=\"relative z-10 flex flex-col items-center justify-center py-8\">\n                <div\n                  class=\"bg-primary text-primary-foreground shadow-primary/25 flex size-16 items-center justify-center rounded-full shadow-lg transition-transform duration-300 group-hover:scale-110 sm:size-20\"\n                >\n                  <lucide-icon [img]=\"Play\" class=\"ml-1 size-7 fill-current sm:size-8\" />\n                </div>\n                <p class=\"text-foreground mt-4 text-sm font-semibold tracking-tight\">\n                  Click to Launch Interactive Player\n                </p>\n              </div>\n\n              <!-- Bottom: Chapter Navigation Strip -->\n              <div class=\"border-border/60 relative z-10 grid grid-cols-1 gap-2 border-t pt-2 sm:grid-cols-3\">\n                @for (chapter of chapterList; track chapter.id; let idx = $index) {\n                  <div\n                    class=\"bg-background/60 border-border/50 hover:bg-background/90 focus-visible:ring-ring rounded-lg border p-2 text-left backdrop-blur-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                    role=\"button\"\n                    tabindex=\"0\"\n                    [attr.aria-label]=\"'Play chapter: ' + chapter.title\"\n                    (click)=\"openModalFromStrip($event, idx)\"\n                    (keydown.enter)=\"openModalFromStrip($event, idx)\"\n                    (keydown.space)=\"$event.preventDefault(); openModalFromStrip($event, idx)\"\n                  >\n                    <div class=\"text-muted-foreground flex items-center justify-between font-mono text-xs\">\n                      <span class=\"truncate\">{{ chapterShortTitle(chapter.title) }}</span>\n                      <span class=\"text-primary font-bold\">{{ chapter.timestamp }}</span>\n                    </div>\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Interactive Video Dialog Modal -->\n      @if (isModalOpen()) {\n        <div class=\"bg-background/80 fixed inset-0 z-50 flex items-center justify-center p-4 backdrop-blur-md sm:p-6\">\n          <div\n            class=\"bg-card border-border relative w-full max-w-4xl overflow-hidden rounded-2xl border text-left shadow-sm\"\n            role=\"dialog\"\n            aria-modal=\"true\"\n            aria-label=\"Product walkthrough video player\"\n          >\n            <!-- Modal Top Bar -->\n            <div class=\"border-border bg-muted/40 flex items-center justify-between border-b px-4 py-3\">\n              <div class=\"flex items-center gap-2\">\n                <span class=\"bg-primary size-2.5 rounded-full\"></span>\n                <span class=\"text-foreground font-mono text-xs font-semibold\">{{ currentChapter().title }}</span>\n              </div>\n              <button\n                type=\"button\"\n                aria-label=\"Close video player\"\n                class=\"text-muted-foreground hover:text-foreground hover:bg-muted focus-visible:ring-ring rounded-md p-1 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                (click)=\"closeModal()\"\n              >\n                <lucide-icon [img]=\"X\" class=\"size-4\" />\n              </button>\n            </div>\n\n            <!-- Simulated Video Playback Viewport -->\n            <div class=\"relative flex aspect-video flex-col justify-between bg-neutral-950 p-6 text-white select-none\">\n              <div class=\"flex items-center justify-between font-mono text-xs opacity-80\">\n                <span>UIPKGE Architecture Masterclass</span>\n                <span>OKLCH Engine v2.4</span>\n              </div>\n\n              <!-- Video Mock Graphic -->\n              <div class=\"flex flex-col items-center justify-center space-y-3\">\n                <div\n                  class=\"flex size-16 items-center justify-center rounded-full border border-white/20 bg-white/10 backdrop-blur-md\"\n                >\n                  @if (!isPlaying()) {\n                    <lucide-icon [img]=\"Play\" class=\"ml-1 size-7 fill-current\" />\n                  } @else {\n                    <lucide-icon [img]=\"Pause\" class=\"size-7\" />\n                  }\n                </div>\n                <p class=\"max-w-md text-center font-mono text-xs text-neutral-400\">\n                  {{ currentChapter().description }}\n                </p>\n              </div>\n\n              <!-- Timeline Scrubber & Controls -->\n              <div class=\"space-y-2\">\n                <!-- Progress Bar -->\n                <div class=\"h-1.5 w-full cursor-pointer overflow-hidden rounded-full bg-white/20\">\n                  <div\n                    class=\"bg-primary h-full transition-[width] duration-200\"\n                    [style.width]=\"progressPercent() + '%'\"\n                  ></div>\n                </div>\n\n                <!-- Controls Row -->\n                <div class=\"flex items-center justify-between font-mono text-xs\">\n                  <div class=\"flex items-center gap-3\">\n                    <button\n                      type=\"button\"\n                      [attr.aria-label]=\"isPlaying() ? 'Pause video' : 'Play video'\"\n                      class=\"hover:text-primary focus-visible:ring-ring rounded-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                      (click)=\"togglePlay()\"\n                    >\n                      @if (isPlaying()) {\n                        <lucide-icon [img]=\"Pause\" class=\"size-4\" />\n                      } @else {\n                        <lucide-icon [img]=\"Play\" class=\"size-4 fill-current\" />\n                      }\n                    </button>\n                    <button\n                      type=\"button\"\n                      [attr.aria-label]=\"isMuted() ? 'Unmute video' : 'Mute video'\"\n                      class=\"hover:text-primary focus-visible:ring-ring rounded-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                      (click)=\"toggleMuted()\"\n                    >\n                      @if (isMuted()) {\n                        <lucide-icon [img]=\"VolumeX\" class=\"size-4\" />\n                      } @else {\n                        <lucide-icon [img]=\"Volume2\" class=\"size-4\" />\n                      }\n                    </button>\n                    <span class=\"text-neutral-400\">{{ currentChapter().timestamp }} / 3:30</span>\n                  </div>\n\n                  <div class=\"flex items-center gap-2\">\n                    <button\n                      type=\"button\"\n                      aria-label=\"Cycle playback speed\"\n                      class=\"focus-visible:ring-ring rounded bg-white/10 px-2 py-0.5 transition-colors hover:bg-white/20 focus-visible:ring-2 focus-visible:outline-none\"\n                      (click)=\"cyclePlaybackSpeed()\"\n                    >\n                      {{ playbackSpeed() }}x\n                    </button>\n                    <button\n                      type=\"button\"\n                      aria-label=\"Enter fullscreen\"\n                      class=\"hover:text-primary focus-visible:ring-ring rounded-xs p-1 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                    >\n                      <lucide-icon [img]=\"Maximize2\" class=\"size-3.5\" />\n                    </button>\n                  </div>\n                </div>\n              </div>\n            </div>\n\n            <!-- Modal Chapter Selector Footer -->\n            <div class=\"border-border bg-muted/20 grid grid-cols-3 border-t\">\n              @for (ch of chapterList; track ch.id; let idx = $index) {\n                <button type=\"button\" [class]=\"chapterFooterClass(idx)\" (click)=\"activeChapterIndex.set(idx)\">\n                  <div class=\"truncate\">{{ ch.title }}</div>\n                  <div class=\"text-muted-foreground mt-0.5 text-xs\">{{ ch.timestamp }}</div>\n                </button>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    </section>\n  `,\n})\nexport class UiHeroVideoModalWalkthroughComponent {\n  protected readonly BookOpen = BookOpen\n  protected readonly Maximize2 = Maximize2\n  protected readonly Pause = Pause\n  protected readonly Play = Play\n  protected readonly Star = Star\n  protected readonly Volume2 = Volume2\n  protected readonly VolumeX = VolumeX\n  protected readonly X = X\n\n  protected readonly chapterList = chapters\n  protected readonly avatars = avatarTiles\n  protected readonly stars = [1, 2, 3, 4, 5]\n\n  @Input('class') className?: string\n\n  readonly isModalOpen = signal(false)\n  readonly isPlaying = signal(true)\n  readonly isMuted = signal(false)\n  readonly playbackSpeed = signal<1 | 1.5 | 2>(1)\n  readonly activeChapterIndex = signal(0)\n  readonly progressPercent = signal(38)\n\n  currentChapter(): HeroVideoChapter {\n    return chapters[this.activeChapterIndex()] ?? chapters[0]!\n  }\n\n  get rootClass(): string {\n    return cn('bg-background relative overflow-hidden px-4 py-16 sm:px-6 sm:py-24 lg:px-8', this.className)\n  }\n\n  chapterShortTitle(title: string): string {\n    return title.split('.')[1] ?? title\n  }\n\n  chapterFooterClass(idx: number): string {\n    return cn(\n      'border-border border-r p-3 text-left font-mono text-xs transition-colors last:border-r-0 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none focus-visible:ring-inset',\n      this.activeChapterIndex() === idx\n        ? 'bg-background text-foreground font-semibold'\n        : 'text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  openModal(index = 0): void {\n    this.activeChapterIndex.set(index)\n    this.isModalOpen.set(true)\n    this.isPlaying.set(true)\n  }\n\n  openModalFromStrip(event: Event, index: number): void {\n    event.stopPropagation()\n    this.openModal(index)\n  }\n\n  closeModal(): void {\n    this.isModalOpen.set(false)\n    this.isPlaying.set(false)\n  }\n\n  togglePlay(): void {\n    this.isPlaying.update((v) => !v)\n  }\n\n  toggleMuted(): void {\n    this.isMuted.update((v) => !v)\n  }\n\n  cyclePlaybackSpeed(): void {\n    this.playbackSpeed.update((s) => (s === 1 ? 1.5 : s === 1.5 ? 2 : 1))\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/hero-video-modal-walkthrough/hero-video-modal-walkthrough.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/hero-video-modal-walkthrough/index.ts",
      "content": "export { UiHeroVideoModalWalkthroughComponent, type HeroVideoChapter } from './hero-video-modal-walkthrough.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/hero-video-modal-walkthrough/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json"
  ],
  "description": "Product walkthrough hero section with interactive video modal player, chapter timestamps navigation, playback speed controls, and social proof.",
  "categories": [
    "marketing"
  ],
  "deprecated": true,
  "replacedBy": "hero"
}