{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "social-proof-video-wall",
  "title": "Social Proof Video Wall",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/social-proof-video-wall/social-proof-video-wall.component.ts",
      "content": "// Engineering case study and video testimonial wall with playback simulation,\n// category filtering, and metric highlights. Port of the Vue/React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport { ArrowRight, LucideAngularModule, Play, Video, X } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiCardComponent, UiCardContentComponent } from '@/ui/card/card.component'\n\nexport interface VideoTestimonial {\n  id: string\n  name: string\n  role: string\n  company: string\n  category: 'fintech' | 'saas' | 'ai'\n  quote: string\n  duration: string\n  metricHighlight: string\n  metricLabel: string\n}\n\nexport type VideoWallCategory = 'all' | 'fintech' | 'saas' | 'ai'\n\nconst defaultTestimonials: VideoTestimonial[] = [\n  {\n    id: 'story-1',\n    name: 'Elena Rostova',\n    role: 'Staff Frontend Architect',\n    company: 'FinFlow Global',\n    category: 'fintech',\n    quote:\n      'Unbundled components gave our core engineering team complete ownership over PCI-compliant ledger tables without maintaining a bloated bespoke fork.',\n    duration: '2:14',\n    metricHighlight: '4.2x Faster',\n    metricLabel: 'Sprint delivery velocity',\n  },\n  {\n    id: 'story-2',\n    name: 'Marcus Vance',\n    role: 'VP of Engineering',\n    company: 'Synthetix AI',\n    category: 'ai',\n    quote:\n      'Our AI canvas needed sub-millisecond AST updates. Copying pure Vue and React primitives eliminated hours of npm dependency version conflicts.',\n    duration: '1:48',\n    metricHighlight: '-380 KB',\n    metricLabel: 'Zero runtime bundle overhead',\n  },\n  {\n    id: 'story-3',\n    name: 'Sarah Chen',\n    role: 'Head of Product Design',\n    company: 'Linearis Cloud',\n    category: 'saas',\n    quote:\n      'The Tailwind v4 token system and OKLCH color palettes match our design system tokens 1:1. Zero translation friction between Figma and code.',\n    duration: '3:05',\n    metricHighlight: '100% Token Sync',\n    metricLabel: 'Figma to code parity',\n  },\n  {\n    id: 'story-4',\n    name: 'Devon Wright',\n    role: 'Principal Engineer',\n    company: 'OmniStream Data',\n    category: 'saas',\n    quote:\n      'We replaced 14 disparate npm UI libraries with a single clean registry pull. Full keyboard ergonomics and ARIA compliance right out of the box.',\n    duration: '2:30',\n    metricHighlight: '14 → 1',\n    metricLabel: 'Vendor dependency consolidation',\n  },\n]\n\nconst categories: { id: VideoWallCategory; label: string }[] = [\n  { id: 'all', label: 'All Customer Stories' },\n  { id: 'saas', label: 'Enterprise SaaS' },\n  { id: 'fintech', label: 'Fintech & Security' },\n  { id: 'ai', label: 'AI & Data Platforms' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-social-proof-video-wall, [ui-social-proof-video-wall]',\n  standalone: true,\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [LucideAngularModule, UiBadgeComponent, UiCardComponent, UiCardContentComponent],\n  template: `\n    <section data-slot=\"social-proof-video-wall\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n        <div class=\"mx-auto max-w-3xl space-y-4 text-center\">\n          <a\n            href=\"#customer-stories\"\n            class=\"group border-border/80 bg-secondary/60 hover:bg-secondary text-foreground inline-flex items-center gap-2 rounded-full border px-3.5 py-1 text-xs font-medium shadow-2xs transition-colors\"\n          >\n            <lucide-icon [img]=\"Video\" class=\"text-primary size-3.5\" />\n            <span>Engineering Case Studies</span>\n            <lucide-icon\n              [img]=\"ArrowRight\"\n              class=\"text-muted-foreground size-3 transition-transform group-hover:translate-x-0.5\"\n            />\n          </a>\n\n          <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">{{ title }}</h2>\n          <p class=\"text-muted-foreground text-base sm:text-lg\">{{ description }}</p>\n\n          <div class=\"flex flex-wrap items-center justify-center gap-2 pt-2\">\n            @for (cat of filterCategories; track cat.id) {\n              <button type=\"button\" [class]=\"filterButtonClass(cat.id)\" (click)=\"selectedCategory.set(cat.id)\">\n                {{ cat.label }}\n              </button>\n            }\n          </div>\n        </div>\n\n        <div class=\"mt-12 grid grid-cols-1 gap-6 md:grid-cols-2\">\n          @for (item of filteredTestimonials(); track item.id) {\n            <div\n              ui-card\n              class=\"group border-border bg-card hover:border-primary/40 relative flex flex-col justify-between overflow-hidden shadow-xs transition-colors hover:shadow-sm\"\n            >\n              <div ui-card-content class=\"space-y-5 p-6\">\n                <div\n                  class=\"border-border bg-muted/60 focus-visible:ring-ring group/video relative flex aspect-16/9 w-full cursor-pointer items-center justify-center overflow-hidden rounded-lg border focus-visible:ring-2 focus-visible:outline-none\"\n                  (click)=\"openVideoModal(item)\"\n                  (keydown.enter)=\"openVideoModal(item)\"\n                  tabindex=\"0\"\n                  role=\"button\"\n                  [attr.aria-label]=\"'Play testimonial from ' + item.name\"\n                >\n                  <div\n                    class=\"bg-background/90 text-primary flex size-12 items-center justify-center rounded-full shadow-md transition-transform group-hover/video:scale-110\"\n                  >\n                    <lucide-icon [img]=\"Play\" class=\"fill-primary size-5 pl-0.5\" />\n                  </div>\n                  <div\n                    class=\"bg-background/80 text-foreground absolute right-2.5 bottom-2.5 rounded px-2 py-0.5 font-mono text-xs font-medium backdrop-blur-xs\"\n                  >\n                    {{ item.duration }}\n                  </div>\n                  <div class=\"absolute top-2.5 left-2.5\">\n                    <span\n                      ui-badge\n                      variant=\"outline\"\n                      class=\"border-border/80 bg-background/80 font-mono text-xs tracking-wider uppercase backdrop-blur-xs\"\n                    >\n                      {{ item.company }}\n                    </span>\n                  </div>\n                </div>\n\n                <div class=\"space-y-3\">\n                  <p class=\"text-muted-foreground text-xs leading-relaxed italic\">&ldquo;{{ item.quote }}&rdquo;</p>\n                  <div class=\"border-border/80 flex items-center justify-between border-t pt-3\">\n                    <div>\n                      <div class=\"text-foreground text-xs font-bold\">{{ item.name }}</div>\n                      <div class=\"text-muted-foreground text-xs\">{{ item.role }} &bull; {{ item.company }}</div>\n                    </div>\n                    <div class=\"text-right\">\n                      <div class=\"text-success font-mono text-sm font-bold\">{{ item.metricHighlight }}</div>\n                      <div class=\"text-muted-foreground text-xs\">{{ item.metricLabel }}</div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          }\n        </div>\n\n        @if (activeVideo(); as av) {\n          <div\n            class=\"bg-background/80 fixed inset-0 z-50 flex items-center justify-center p-4 backdrop-blur-sm\"\n            (click)=\"closeVideoModal()\"\n          >\n            <div\n              class=\"border-border bg-card relative w-full max-w-2xl space-y-4 rounded-xl border p-6 shadow-sm\"\n              (click)=\"$event.stopPropagation()\"\n            >\n              <div class=\"border-border flex items-center justify-between border-b pb-3\">\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Video\" class=\"text-primary size-4\" />\n                  <span class=\"text-foreground text-sm font-bold\">{{ av.company }} &bull; Architecture Deep-Dive</span>\n                </div>\n                <button\n                  type=\"button\"\n                  class=\"text-muted-foreground hover:text-foreground rounded-md p-1\"\n                  aria-label=\"Close video\"\n                  (click)=\"closeVideoModal()\"\n                >\n                  <lucide-icon [img]=\"X\" class=\"size-4\" />\n                </button>\n              </div>\n              <div\n                class=\"border-border bg-muted/40 flex aspect-16/9 w-full flex-col items-center justify-center space-y-2 rounded-lg border p-6 text-center\"\n              >\n                <div\n                  class=\"bg-primary text-primary-foreground flex size-14 animate-pulse items-center justify-center rounded-full shadow-lg\"\n                >\n                  <lucide-icon [img]=\"Play\" class=\"fill-primary-foreground size-6 pl-0.5\" />\n                </div>\n                <div class=\"text-foreground text-xs font-bold\">Streaming Case Study (HD 1080p)</div>\n                <div class=\"text-muted-foreground text-xs\">{{ av.name }} &bull; {{ av.role }}</div>\n              </div>\n              <div class=\"text-muted-foreground text-xs\">&ldquo;{{ av.quote }}&rdquo;</div>\n            </div>\n          </div>\n        }\n      </div>\n    </section>\n  `,\n})\nexport class UiSocialProofVideoWallComponent {\n  protected readonly ArrowRight = ArrowRight\n  protected readonly Play = Play\n  protected readonly Video = Video\n  protected readonly X = X\n\n  @Input() title = 'Trusted by world-class design engineers and platform architects.'\n  @Input()\n  description =\n    'Discover how high-velocity engineering organizations leverage unbundled UI primitives to build ultra-fast, accessible products.'\n  @Input() testimonials?: VideoTestimonial[]\n  @Input('class') className?: string\n\n  readonly selectedCategory = signal<VideoWallCategory>('all')\n  readonly activeVideo = signal<VideoTestimonial | null>(null)\n  readonly filterCategories = categories\n\n  readonly activeTestimonials = computed(() => this.testimonials ?? defaultTestimonials)\n  readonly filteredTestimonials = computed(() => {\n    const cat = this.selectedCategory()\n    const all = this.activeTestimonials()\n    if (cat === 'all') return all\n    return all.filter((t) => t.category === cat)\n  })\n\n  get rootClass(): string {\n    return cn('bg-background relative overflow-hidden py-16 sm:py-24', this.className)\n  }\n\n  filterButtonClass(id: VideoWallCategory): string {\n    return cn(\n      'rounded-lg border px-3 py-1.5 text-xs font-medium transition-colors',\n      this.selectedCategory() === id\n        ? 'border-primary bg-primary/10 text-primary font-semibold'\n        : 'border-border bg-card text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  openVideoModal(t: VideoTestimonial): void {\n    this.activeVideo.set(t)\n  }\n\n  closeVideoModal(): void {\n    this.activeVideo.set(null)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/social-proof-video-wall/social-proof-video-wall.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/social-proof-video-wall/index.ts",
      "content": "export {\n  UiSocialProofVideoWallComponent,\n  type VideoTestimonial,\n  type VideoWallCategory,\n} from './social-proof-video-wall.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/social-proof-video-wall/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/card.json"
  ],
  "description": "Engineering case study and video testimonial wall with playback simulation, category filtering, and metric highlights.",
  "categories": [
    "marketing",
    "feature"
  ]
}