{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "press-kit-brand-assets",
  "title": "Press Kit Brand Assets",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/press-kit-brand-assets/press-kit-brand-assets.component.ts",
      "content": "// Brand guidelines and press kit hub: official logo downloads (SVG/4K PNG/WebP),\n// OKLCH brand palette tokens, executive leadership headshots (300 DPI), and press\n// contact resources. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  Check,\n  CheckCircle2,\n  Copy,\n  Download,\n  ExternalLink,\n  FileArchive,\n  FileCode,\n  FileImage,\n  FileText,\n  Globe,\n  Info,\n  Layers,\n  LucideAngularModule,\n  Mail,\n  Palette,\n  ShieldCheck,\n  User,\n  XCircle,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiAvatarComponent, UiAvatarFallbackComponent, UiAvatarImageComponent } from '@/ui/avatar/avatar.component'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardFooterComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\n\nexport interface LogoAsset {\n  id: string\n  title: string\n  category: string\n  description: string\n  dimensions: string\n  bestFor: string\n  theme: 'light' | 'dark' | 'adaptive'\n  formats: { label: string; ext: string; size: string }[]\n}\n\nexport interface BrandColor {\n  id: string\n  name: string\n  hex: string\n  oklch: string\n  rgb: string\n  role: string\n  contrast: string\n  usage: string\n  bgClass: string\n  textDark?: boolean\n}\n\nexport interface Executive {\n  id: string\n  name: string\n  role: string\n  bio: string\n  avatarUrl?: string\n  initials: string\n  fileSize: string\n  dimensions: string\n  topics: string[]\n  socials: { platform: 'x' | 'linkedin' | 'github'; url: string }[]\n}\n\nexport interface BrandGuidelineRule {\n  type: 'do' | 'dont'\n  text: string\n}\n\nconst DEFAULT_LOGOS: LogoAsset[] = [\n  {\n    id: 'horizontal-primary',\n    title: 'Primary Horizontal Logo',\n    category: 'Full Wordmark',\n    description: 'The standard lockup combining the faceted block logomark with horizontal typography and .dev badge.',\n    dimensions: '3840 × 1080 px',\n    bestFor: 'Light surfaces, navigation bars, marketing hero headers, and pitch decks.',\n    theme: 'light',\n    formats: [\n      { label: 'Vector SVG', ext: 'svg', size: '14 KB' },\n      { label: '4K PNG (Alpha)', ext: 'png', size: '280 KB' },\n      { label: 'Modern WebP', ext: 'webp', size: '94 KB' },\n    ],\n  },\n  {\n    id: 'app-icon-mark',\n    title: 'Square App Icon Mark',\n    category: 'Logomark Symbol',\n    description: 'Standalone geometric prism icon optimized for square aspect ratios and high-density icons.',\n    dimensions: '1024 × 1024 px',\n    bestFor: 'Favicons, desktop dock icons, app store assets, and square social avatars.',\n    theme: 'adaptive',\n    formats: [\n      { label: 'Vector SVG', ext: 'svg', size: '8 KB' },\n      { label: 'High-Res PNG', ext: 'png', size: '165 KB' },\n      { label: 'Icon WebP', ext: 'webp', size: '62 KB' },\n    ],\n  },\n  {\n    id: 'monochrome-dark',\n    title: 'Dark Mode Monochromatic Logo',\n    category: 'Dark Backgrounds',\n    description: 'Single-tone pure-white silhouette engineered for deep slate surfaces and obsidian backgrounds.',\n    dimensions: '3840 × 1080 px',\n    bestFor: 'Developer terminals, dark theme dashboards, midnight wallpapers, and video overlays.',\n    theme: 'dark',\n    formats: [\n      { label: 'Vector SVG', ext: 'svg', size: '12 KB' },\n      { label: '4K PNG (White)', ext: 'png', size: '240 KB' },\n      { label: 'Dark WebP', ext: 'webp', size: '88 KB' },\n    ],\n  },\n  {\n    id: 'monochrome-light',\n    title: 'Light Mode Inverted Logo',\n    category: 'Print & Documents',\n    description: 'High-density obsidian monochrome lockup for single-ink printing and high-contrast editorial media.',\n    dimensions: '3840 × 1080 px',\n    bestFor: 'Whitepapers, physical print collateral, invoices, PDF documents, and newsprint.',\n    theme: 'light',\n    formats: [\n      { label: 'Vector SVG', ext: 'svg', size: '12 KB' },\n      { label: '4K PNG (Black)', ext: 'png', size: '235 KB' },\n      { label: 'Print WebP', ext: 'webp', size: '85 KB' },\n    ],\n  },\n]\n\nconst DEFAULT_COLORS: BrandColor[] = [\n  {\n    id: 'primary-emerald',\n    name: 'Primary Emerald',\n    hex: '#10B981',\n    oklch: 'oklch(0.696 0.170 162.48)',\n    rgb: 'rgb(16, 185, 129)',\n    role: 'Primary Interactive Brand Color',\n    contrast: 'WCAG AAA 7.4:1',\n    usage: 'Primary brand color for CTAs, active pills, key highlights, and success indicators.',\n    bgClass: 'bg-[#10B981]',\n    textDark: true,\n  },\n  {\n    id: 'midnight-slate',\n    name: 'Midnight Slate',\n    hex: '#0F172A',\n    oklch: 'oklch(0.208 0.042 265.75)',\n    rgb: 'rgb(15, 23, 42)',\n    role: 'Dark Neutral Surface Base',\n    contrast: 'WCAG AAA 16.2:1',\n    usage: 'Core neutral background and high-contrast dark surface foundations across dark layouts.',\n    bgClass: 'bg-[#0F172A]',\n    textDark: false,\n  },\n  {\n    id: 'accent-blue',\n    name: 'Accent Blue',\n    hex: '#3B82F6',\n    oklch: 'oklch(0.623 0.214 259.80)',\n    rgb: 'rgb(59, 130, 246)',\n    role: 'Secondary Interactive Accent',\n    contrast: 'WCAG AA 4.8:1',\n    usage: 'Secondary accent for active links, information badges, focus rings, and secondary metrics.',\n    bgClass: 'bg-[#3B82F6]',\n    textDark: true,\n  },\n  {\n    id: 'background-base',\n    name: 'Background Base',\n    hex: '#F8FAFC',\n    oklch: 'oklch(0.985 0.002 247.80)',\n    rgb: 'rgb(248, 250, 252)',\n    role: 'Light Neutral Surface Fills',\n    contrast: 'WCAG AAA 19.5:1',\n    usage: 'Clean ambient light surface foundation, card backgrounds, and elevated container fills.',\n    bgClass: 'bg-[#F8FAFC]',\n    textDark: true,\n  },\n  {\n    id: 'amber-highlight',\n    name: 'Amber Highlight',\n    hex: '#F59E0B',\n    oklch: 'oklch(0.769 0.188 70.08)',\n    rgb: 'rgb(245, 158, 11)',\n    role: 'Warning & Spotlight Accent',\n    contrast: 'WCAG AAA 8.1:1',\n    usage: 'Warm highlight for warnings, pro tier tags, system notices, and featured sponsor badges.',\n    bgClass: 'bg-[#F59E0B]',\n    textDark: true,\n  },\n]\n\nconst DEFAULT_EXECUTIVES: Executive[] = [\n  {\n    id: 'elena-rostova',\n    name: 'Elena Rostova',\n    role: 'Chief Executive Officer & Co-Founder',\n    bio: 'Pioneered component registry architecture and headless design systems. Former principal architect at NextGen UI. Leading UIPKGE’s mission to make design-engineering frictionless for global software teams.',\n    avatarUrl: 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?q=80&w=400&auto=format&fit=crop',\n    initials: 'ER',\n    fileSize: '12.4 MB',\n    dimensions: '4000 × 5000 px · 300 DPI',\n    topics: ['Component Architecture', 'Design Systems', 'Open-Source Sustainability', 'Developer Experience'],\n    socials: [\n      { platform: 'x', url: 'https://x.com/elenarostova' },\n      { platform: 'linkedin', url: 'https://linkedin.com/in/elenarostova' },\n      { platform: 'github', url: 'https://github.com/elenarostova' },\n    ],\n  },\n  {\n    id: 'marcus-vance',\n    name: 'Marcus Vance',\n    role: 'Chief Technology Officer & Co-Founder',\n    bio: 'Specializes in multi-framework compiler tooling, zero-runtime tokens, and high-performance WebAssembly render pipelines. Previously led frontend infrastructure and UI performance engineering at CloudScale.',\n    avatarUrl: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?q=80&w=400&auto=format&fit=crop',\n    initials: 'MV',\n    fileSize: '11.8 MB',\n    dimensions: '4000 × 5000 px · 300 DPI',\n    topics: ['Web Performance', 'AST Tooling', 'Tailwind v4 Engine', 'Reka UI Headless Core'],\n    socials: [\n      { platform: 'x', url: 'https://x.com/marcusvance' },\n      { platform: 'linkedin', url: 'https://linkedin.com/in/marcusvance' },\n      { platform: 'github', url: 'https://github.com/marcusvance' },\n    ],\n  },\n]\n\nconst DEFAULT_GUIDELINES: BrandGuidelineRule[] = [\n  { type: 'do', text: 'Maintain minimum clear space equal to 50% of the logomark height around all sides.' },\n  { type: 'do', text: 'Use the official OKLCH and Hex values when reproducing brand swatches in digital media.' },\n  { type: 'do', text: 'Use high-contrast monochromatic variants for single-color print, laser etching, or stamps.' },\n  { type: 'dont', text: 'Do not stretch, distort, rotate, or alter the aspect ratio of official logo assets.' },\n  { type: 'dont', text: 'Do not add drop shadows, outer glows, strokes, or unapproved gradients to the mark.' },\n  { type: 'dont', text: 'Do not place the full-color primary mark on low-contrast or visually busy backgrounds.' },\n]\n\ntype PressKitTab = 'all' | 'logos' | 'colors' | 'leadership' | 'press'\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-press-kit-brand-assets, [ui-press-kit-brand-assets]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiAvatarImageComponent,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardFooterComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <div data-slot=\"press-kit-brand-assets\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-8 lg:py-16\">\n        <!-- Header Hero Section -->\n        <div class=\"border-border bg-card relative overflow-hidden rounded-2xl border p-6 shadow-xs sm:p-10\">\n          <div class=\"relative z-10 flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n            <div class=\"max-w-3xl space-y-4\">\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <span\n                  ui-badge\n                  variant=\"outline\"\n                  class=\"border-primary/30 bg-primary/10 text-primary gap-1.5 font-medium\"\n                >\n                  <lucide-icon [img]=\"Palette\" class=\"size-3.5 shrink-0\" />\n                  <span>Media & Brand Hub</span>\n                </span>\n                <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                  {{ version }}\n                </span>\n                <span class=\"text-muted-foreground text-xs\">Updated {{ lastUpdated }}</span>\n              </div>\n\n              <h1 class=\"text-3xl font-bold tracking-tight sm:text-4xl lg:text-5xl\">\n                {{ title }}\n              </h1>\n\n              <p class=\"text-muted-foreground max-w-2xl text-base leading-relaxed sm:text-lg\">\n                {{ subtitle }}\n              </p>\n\n              <div class=\"text-muted-foreground flex flex-wrap items-center gap-4 pt-1 text-xs\">\n                <div class=\"flex items-center gap-1.5\">\n                  <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-4 shrink-0\" />\n                  <span>Editorial Use License (CC BY-NC 4.0)</span>\n                </div>\n                <ui-separator orientation=\"vertical\" class=\"hidden h-3 sm:block\" />\n                <div class=\"flex items-center gap-1.5\">\n                  <lucide-icon [img]=\"FileArchive\" class=\"text-muted-foreground size-4 shrink-0\" />\n                  <span>24 Verified Brand Assets</span>\n                </div>\n                <ui-separator orientation=\"vertical\" class=\"hidden h-3 sm:block\" />\n                <div class=\"flex items-center gap-1.5\">\n                  <lucide-icon [img]=\"Globe\" class=\"text-muted-foreground size-4 shrink-0\" />\n                  <span>Vector & 300 DPI Print Ready</span>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"flex flex-col gap-3 sm:min-w-[280px] lg:flex-col\">\n              <button\n                ui-button\n                aria-label=\"Download complete press kit\"\n                size=\"lg\"\n                class=\"focus-visible:ring-ring h-auto min-h-10 w-full gap-2 py-2.5 text-center font-semibold whitespace-normal shadow-sm focus-visible:ring-2\"\n                (click)=\"handleDownload('all-zip')\"\n              >\n                @if (downloadedKey() === 'all-zip') {\n                  <lucide-icon [img]=\"Check\" class=\"size-4 shrink-0\" />\n                } @else {\n                  <lucide-icon [img]=\"Download\" class=\"size-4 shrink-0\" />\n                }\n                <span>\n                  {{\n                    downloadedKey() === 'all-zip'\n                      ? 'Press Kit Downloaded'\n                      : 'Download Complete Press Kit (.ZIP · ' + pressKitZipSize + ')'\n                  }}\n                </span>\n              </button>\n\n              <div class=\"grid grid-cols-2 gap-2\">\n                <button\n                  ui-button\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"h-auto min-h-8 w-full gap-1.5 text-center text-xs whitespace-normal\"\n                  (click)=\"copyToClipboard('email-header', pressEmail)\"\n                >\n                  @if (copiedKey() === 'email-header') {\n                    <lucide-icon [img]=\"Check\" class=\"text-primary size-3.5 shrink-0\" />\n                  } @else {\n                    <lucide-icon [img]=\"Mail\" class=\"size-3.5 shrink-0\" />\n                  }\n                  <span>{{ copiedKey() === 'email-header' ? 'Copied' : 'Press Desk' }}</span>\n                </button>\n\n                <button\n                  ui-button\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"h-auto min-h-8 w-full gap-1.5 text-center text-xs whitespace-normal\"\n                  (click)=\"copyToClipboard('boilerplate-header', boilerplateText)\"\n                >\n                  @if (copiedKey() === 'boilerplate-header') {\n                    <lucide-icon [img]=\"Check\" class=\"text-primary size-3.5 shrink-0\" />\n                  } @else {\n                    <lucide-icon [img]=\"Copy\" class=\"size-3.5 shrink-0\" />\n                  }\n                  <span>{{ copiedKey() === 'boilerplate-header' ? 'Copied' : 'Boilerplate' }}</span>\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Quick Section Anchor Tabs (Default Variant) -->\n        @if (variant === 'default') {\n          <div class=\"mt-8 flex items-center gap-2 overflow-x-auto pb-2\">\n            <button\n              ui-button\n              [variant]=\"activeTab() === 'all' ? 'default' : 'ghost'\"\n              size=\"sm\"\n              class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n              (click)=\"activeTab.set('all')\"\n            >\n              <lucide-icon [img]=\"Layers\" class=\"size-3.5 shrink-0\" />\n              <span>All Assets</span>\n            </button>\n            <button\n              ui-button\n              [variant]=\"activeTab() === 'logos' ? 'default' : 'ghost'\"\n              size=\"sm\"\n              class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n              (click)=\"activeTab.set('logos')\"\n            >\n              <lucide-icon [img]=\"FileImage\" class=\"size-3.5 shrink-0\" />\n              <span>Logos & Marks ({{ activeLogos().length }})</span>\n            </button>\n            <button\n              ui-button\n              [variant]=\"activeTab() === 'colors' ? 'default' : 'ghost'\"\n              size=\"sm\"\n              class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n              (click)=\"activeTab.set('colors')\"\n            >\n              <lucide-icon [img]=\"Palette\" class=\"size-3.5 shrink-0\" />\n              <span>Color Palette ({{ activeColors().length }})</span>\n            </button>\n            <button\n              ui-button\n              [variant]=\"activeTab() === 'leadership' ? 'default' : 'ghost'\"\n              size=\"sm\"\n              class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n              (click)=\"activeTab.set('leadership')\"\n            >\n              <lucide-icon [img]=\"User\" class=\"size-3.5 shrink-0\" />\n              <span>Leadership ({{ activeExecutives().length }})</span>\n            </button>\n            <button\n              ui-button\n              [variant]=\"activeTab() === 'press' ? 'default' : 'ghost'\"\n              size=\"sm\"\n              class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n              (click)=\"activeTab.set('press')\"\n            >\n              <lucide-icon [img]=\"Mail\" class=\"size-3.5 shrink-0\" />\n              <span>Press Contact</span>\n            </button>\n          </div>\n        }\n\n        <!-- SECTION 1: Official Logo Downloads -->\n        @if (activeTab() === 'all' || activeTab() === 'logos') {\n          <div class=\"mt-12 space-y-6\">\n            <div class=\"flex flex-col justify-between gap-4 sm:flex-row sm:items-end\">\n              <div>\n                <div class=\"text-primary flex items-center gap-2 text-xs font-semibold tracking-wider uppercase\">\n                  <lucide-icon [img]=\"FileImage\" class=\"size-4 shrink-0\" />\n                  <span>Official Vectors & Assets</span>\n                </div>\n                <h2 class=\"mt-1 text-2xl font-bold tracking-tight sm:text-3xl\">Official Logo Downloads</h2>\n                <p class=\"text-muted-foreground mt-1 max-w-2xl text-sm\">\n                  High-resolution vector assets for print and digital publishing. Please preserve minimum clear space.\n                </p>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"gap-1 self-start font-mono text-xs sm:self-auto\">\n                <span>4 Approved Variants</span>\n              </span>\n            </div>\n\n            <div class=\"grid gap-6 md:grid-cols-2\">\n              @for (logo of activeLogos(); track logo.id) {\n                <div\n                  ui-card\n                  class=\"border-border hover:border-border/80 flex flex-col justify-between overflow-hidden border shadow-xs transition-colors\"\n                >\n                  <div>\n                    <div [class]=\"logoPreviewClass(logo)\">\n                      {{ logoPreviewLabel(logo) }}\n                      <div class=\"absolute right-2.5 bottom-2.5\">\n                        <span\n                          class=\"bg-background/80 text-foreground border-border/50 rounded border px-2 py-0.5 font-mono text-xs backdrop-blur-sm\"\n                        >\n                          {{ logo.dimensions }}\n                        </span>\n                      </div>\n                    </div>\n\n                    <div ui-card-header class=\"p-5 pb-3\">\n                      <div class=\"flex flex-wrap items-center justify-between gap-2\">\n                        <h3 ui-card-title class=\"text-base font-semibold\">{{ logo.title }}</h3>\n                        <span ui-badge variant=\"secondary\" class=\"text-xs\">{{ logo.category }}</span>\n                      </div>\n                      <p ui-card-description class=\"mt-1 text-xs leading-relaxed\">\n                        {{ logo.description }}\n                      </p>\n                      <div class=\"text-muted-foreground flex items-center gap-1.5 pt-1 text-xs\">\n                        <lucide-icon [img]=\"Info\" class=\"text-primary size-3.5 shrink-0\" />\n                        <span class=\"line-clamp-1\"\n                          ><strong class=\"text-foreground font-medium\">Best for:</strong> {{ logo.bestFor }}</span\n                        >\n                      </div>\n                    </div>\n                  </div>\n\n                  <div ui-card-footer class=\"p-5 pt-0\">\n                    <div class=\"w-full space-y-2\">\n                      <div class=\"text-muted-foreground flex items-center justify-between text-xs font-medium\">\n                        <span>Available Formats</span>\n                        <span class=\"font-mono text-xs\">Vector & Bitmaps</span>\n                      </div>\n                      <div class=\"grid grid-cols-3 gap-2\">\n                        @for (fmt of logo.formats; track fmt.ext) {\n                          <button\n                            ui-button\n                            aria-label=\"Download logo file\"\n                            variant=\"outline\"\n                            size=\"sm\"\n                            class=\"focus-visible:ring-ring h-auto min-h-8 w-full flex-col gap-0.5 px-1.5 py-2 text-center text-xs whitespace-normal focus-visible:ring-2\"\n                            (click)=\"handleDownload(logo.id + '-' + fmt.ext)\"\n                          >\n                            <div class=\"flex items-center gap-1 font-medium\">\n                              @if (downloadedKey() === logo.id + '-' + fmt.ext) {\n                                <lucide-icon [img]=\"Check\" class=\"text-primary size-3 shrink-0\" />\n                              } @else {\n                                <lucide-icon [img]=\"Download\" class=\"text-muted-foreground size-3 shrink-0\" />\n                              }\n                              <span class=\"truncate\">{{ fmt.label.split(' ')[0] }}</span>\n                            </div>\n                            <span class=\"text-muted-foreground font-mono text-xs\">{{ fmt.size }}</span>\n                          </button>\n                        }\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        }\n\n        <!-- SECTION 2: Official Brand Palette & OKLCH Color Swatches -->\n        @if (activeTab() === 'all' || activeTab() === 'colors') {\n          <div class=\"mt-16 space-y-6\">\n            <div class=\"flex flex-col justify-between gap-4 sm:flex-row sm:items-end\">\n              <div>\n                <div class=\"text-primary flex items-center gap-2 text-xs font-semibold tracking-wider uppercase\">\n                  <lucide-icon [img]=\"Palette\" class=\"size-4 shrink-0\" />\n                  <span>Token Palette & Swatches</span>\n                </div>\n                <h2 class=\"mt-1 text-2xl font-bold tracking-tight sm:text-3xl\">Official Brand Palette & OKLCH</h2>\n                <p class=\"text-muted-foreground mt-1 max-w-2xl text-sm\">\n                  Perceptually uniform color tokens with high WCAG contrast ratings for both dark and light UI surfaces.\n                </p>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"gap-1 self-start font-mono text-xs sm:self-auto\">\n                <span>5 Core Swatches</span>\n              </span>\n            </div>\n\n            <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-5\">\n              @for (color of activeColors(); track color.id) {\n                <div ui-card class=\"border-border flex flex-col justify-between overflow-hidden border shadow-xs\">\n                  <div>\n                    <div [class]=\"swatchClass(color)\">\n                      <div class=\"flex items-center justify-between\">\n                        <span [class]=\"contrastPillClass(color)\">\n                          {{ color.contrast }}\n                        </span>\n                      </div>\n                      <div class=\"flex items-center justify-between\">\n                        <span\n                          [class]=\"\n                            color.textDark\n                              ? 'font-mono text-xs font-bold text-black'\n                              : 'font-mono text-xs font-bold text-white'\n                          \"\n                        >\n                          {{ color.hex }}\n                        </span>\n                      </div>\n                    </div>\n\n                    <div class=\"space-y-3 p-4\">\n                      <div>\n                        <h3 class=\"text-foreground text-sm font-semibold\">{{ color.name }}</h3>\n                        <p class=\"text-primary mt-0.5 text-xs font-medium\">{{ color.role }}</p>\n                      </div>\n\n                      <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                        {{ color.usage }}\n                      </p>\n\n                      <div class=\"space-y-1.5 pt-1\">\n                        <div\n                          class=\"bg-muted/60 border-border/40 flex items-center justify-between rounded-md border px-2.5 py-1.5 text-xs\"\n                        >\n                          <span class=\"text-muted-foreground truncate font-mono text-xs\">{{ color.hex }}</span>\n                          <button\n                            type=\"button\"\n                            class=\"text-foreground hover:text-primary focus-visible:ring-ring flex min-h-6 items-center gap-1 rounded px-1 text-xs transition-colors focus-visible:ring-2\"\n                            [attr.aria-label]=\"'Copy ' + color.name + ' HEX'\"\n                            (click)=\"copyToClipboard('hex-' + color.id, color.hex)\"\n                          >\n                            @if (copiedKey() === 'hex-' + color.id) {\n                              <lucide-icon [img]=\"Check\" class=\"text-primary size-3 shrink-0\" />\n                            } @else {\n                              <lucide-icon [img]=\"Copy\" class=\"size-3 shrink-0\" />\n                            }\n                            <span class=\"text-xs\">{{ copiedKey() === 'hex-' + color.id ? 'Copied' : 'HEX' }}</span>\n                          </button>\n                        </div>\n\n                        <div\n                          class=\"bg-muted/60 border-border/40 flex items-center justify-between rounded-md border px-2.5 py-1.5 text-xs\"\n                        >\n                          <span class=\"text-muted-foreground truncate font-mono text-xs\" [attr.title]=\"color.oklch\">\n                            {{ oklchInner(color.oklch) }}\n                          </span>\n                          <button\n                            type=\"button\"\n                            class=\"text-foreground hover:text-primary focus-visible:ring-ring flex min-h-6 items-center gap-1 rounded px-1 text-xs transition-colors focus-visible:ring-2\"\n                            [attr.aria-label]=\"'Copy ' + color.name + ' OKLCH'\"\n                            (click)=\"copyToClipboard('oklch-' + color.id, color.oklch)\"\n                          >\n                            @if (copiedKey() === 'oklch-' + color.id) {\n                              <lucide-icon [img]=\"Check\" class=\"text-primary size-3 shrink-0\" />\n                            } @else {\n                              <lucide-icon [img]=\"Copy\" class=\"size-3 shrink-0\" />\n                            }\n                            <span class=\"text-xs\">{{ copiedKey() === 'oklch-' + color.id ? 'Copied' : 'OKLCH' }}</span>\n                          </button>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        }\n\n        <!-- SECTION 3: Executive Leadership Headshots & Bios -->\n        @if (activeTab() === 'all' || activeTab() === 'leadership') {\n          <div class=\"mt-16 space-y-6\">\n            <div class=\"flex flex-col justify-between gap-4 sm:flex-row sm:items-end\">\n              <div>\n                <div class=\"text-primary flex items-center gap-2 text-xs font-semibold tracking-wider uppercase\">\n                  <lucide-icon [img]=\"User\" class=\"size-4 shrink-0\" />\n                  <span>Media Spokespersons</span>\n                </div>\n                <h2 class=\"mt-1 text-2xl font-bold tracking-tight sm:text-3xl\">Executive Leadership & Bios</h2>\n                <p class=\"text-muted-foreground mt-1 max-w-2xl text-sm\">\n                  Official executive headshots and media blurbs for press releases, podcasts, and event keynotes.\n                </p>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"gap-1 self-start font-mono text-xs sm:self-auto\">\n                <span>300 DPI Studio Photography</span>\n              </span>\n            </div>\n\n            <div class=\"grid gap-6 md:grid-cols-2\">\n              @for (exec of activeExecutives(); track exec.id) {\n                <div ui-card class=\"border-border flex flex-col justify-between overflow-hidden border shadow-xs\">\n                  <div class=\"space-y-5 p-6\">\n                    <div class=\"flex flex-col items-start gap-4 sm:flex-row sm:items-center\">\n                      <ui-avatar class=\"border-border size-20 shrink-0 rounded-2xl border-2 shadow-sm\">\n                        <ui-avatar-image [src]=\"exec.avatarUrl\" [alt]=\"exec.name\" class=\"object-cover\" />\n                        <ui-avatar-fallback class=\"bg-primary/10 text-primary rounded-2xl text-lg font-bold\">\n                          {{ exec.initials }}\n                        </ui-avatar-fallback>\n                      </ui-avatar>\n\n                      <div class=\"space-y-1\">\n                        <div class=\"flex flex-wrap items-center gap-2\">\n                          <h3 class=\"text-foreground text-lg font-bold\">{{ exec.name }}</h3>\n                          <span ui-badge variant=\"secondary\" class=\"text-xs font-normal\">Executive</span>\n                        </div>\n                        <p class=\"text-primary text-xs font-medium\">{{ exec.role }}</p>\n                        <p class=\"text-muted-foreground font-mono text-xs\">{{ exec.dimensions }}</p>\n                      </div>\n                    </div>\n\n                    <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                      {{ exec.bio }}\n                    </p>\n\n                    <div class=\"space-y-1.5\">\n                      <span class=\"text-foreground text-xs font-medium\">Speaking Topics & Focus Areas:</span>\n                      <div class=\"flex flex-wrap gap-1.5\">\n                        @for (topic of exec.topics; track topic) {\n                          <span ui-badge variant=\"outline\" class=\"bg-muted/40 text-xs font-normal\">\n                            {{ topic }}\n                          </span>\n                        }\n                      </div>\n                    </div>\n                  </div>\n\n                  <div\n                    ui-card-footer\n                    class=\"border-border/40 bg-muted/20 mt-2 flex flex-col items-stretch justify-between gap-3 border-t p-6 pt-0 sm:flex-row sm:items-center\"\n                  >\n                    <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                      <lucide-icon [img]=\"FileImage\" class=\"text-primary size-3.5 shrink-0\" />\n                      <span>{{ exec.fileSize }} RAW TIFF & JPG</span>\n                    </div>\n\n                    <button\n                      ui-button\n                      aria-label=\"Download executive headshot\"\n                      size=\"sm\"\n                      variant=\"default\"\n                      class=\"focus-visible:ring-ring h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal focus-visible:ring-2\"\n                      (click)=\"handleDownload('headshot-' + exec.id)\"\n                    >\n                      @if (downloadedKey() === 'headshot-' + exec.id) {\n                        <lucide-icon [img]=\"Check\" class=\"size-3.5 shrink-0\" />\n                      } @else {\n                        <lucide-icon [img]=\"Download\" class=\"size-3.5 shrink-0\" />\n                      }\n                      <span>{{\n                        downloadedKey() === 'headshot-' + exec.id\n                          ? 'Headshot Downloaded'\n                          : 'Download Headshot (300 DPI)'\n                      }}</span>\n                    </button>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        }\n\n        <!-- SECTION 4: Press Hub & Media Contact + Brand Guidelines -->\n        @if (activeTab() === 'all' || activeTab() === 'press') {\n          <div class=\"mt-16 grid gap-6 lg:grid-cols-2\">\n            <div ui-card class=\"border-border flex flex-col justify-between border shadow-xs\">\n              <div ui-card-header class=\"p-6 pb-4\">\n                <div class=\"flex flex-wrap items-center justify-between gap-2\">\n                  <div class=\"text-primary flex items-center gap-2 text-xs font-semibold tracking-wider uppercase\">\n                    <lucide-icon [img]=\"Mail\" class=\"size-4 shrink-0\" />\n                    <span>Press & Media Inquiries</span>\n                  </div>\n                  <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">{{ version }}</span>\n                </div>\n                <h3 ui-card-title class=\"mt-1 text-xl font-bold\">Get in Touch with Media Relations</h3>\n                <p ui-card-description class=\"text-xs leading-relaxed\">\n                  Direct access for accredited tech journalists, conference organizers, analysts, and podcast hosts.\n                </p>\n              </div>\n\n              <div ui-card-content class=\"space-y-4 p-6 pt-0\">\n                <div\n                  class=\"border-border bg-muted/40 flex flex-wrap items-center justify-between gap-3 rounded-lg border p-3.5\"\n                >\n                  <div class=\"flex min-w-0 items-center gap-3\">\n                    <div class=\"bg-primary/10 text-primary flex size-9 shrink-0 items-center justify-center rounded-md\">\n                      <lucide-icon [img]=\"Mail\" class=\"size-4 shrink-0\" />\n                    </div>\n                    <div>\n                      <p class=\"text-foreground text-xs font-semibold\">{{ pressEmail }}</p>\n                      <p class=\"text-muted-foreground text-xs\">Official Media & Inquiries Desk</p>\n                    </div>\n                  </div>\n                  <button\n                    ui-button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n                    (click)=\"copyToClipboard('press-email', pressEmail)\"\n                  >\n                    @if (copiedKey() === 'press-email') {\n                      <lucide-icon [img]=\"Check\" class=\"text-primary size-3.5 shrink-0\" />\n                    } @else {\n                      <lucide-icon [img]=\"Copy\" class=\"size-3.5 shrink-0\" />\n                    }\n                    <span>{{ copiedKey() === 'press-email' ? 'Copied' : 'Copy' }}</span>\n                  </button>\n                </div>\n\n                <div class=\"grid grid-cols-2 gap-3 pt-1\">\n                  <div class=\"border-border/60 bg-card space-y-1 rounded-lg border p-3\">\n                    <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                      <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-3.5 shrink-0\" />\n                      <span>&lt; 24h Response</span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Prompt turnaround on verified interview and quote requests.\n                    </p>\n                  </div>\n\n                  <div class=\"border-border/60 bg-card space-y-1 rounded-lg border p-3\">\n                    <div class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                      <lucide-icon [img]=\"Globe\" class=\"text-primary size-3.5 shrink-0\" />\n                      <span>Embargo Previews</span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Advance beta access and documentation under NDA/embargo.\n                    </p>\n                  </div>\n                </div>\n              </div>\n\n              <div ui-card-footer class=\"border-border/40 bg-muted/10 mt-2 border-t p-6 pt-0\">\n                <div class=\"flex w-full flex-col items-stretch justify-between gap-3 pt-3 sm:flex-row sm:items-center\">\n                  <span class=\"text-muted-foreground text-xs\">Need company numbers & metrics?</span>\n                  <button\n                    ui-button\n                    aria-label=\"Download company fact sheet\"\n                    variant=\"outline\"\n                    size=\"sm\"\n                    class=\"h-auto min-h-8 gap-1.5 text-center text-xs whitespace-normal\"\n                    (click)=\"handleDownload('factsheet-pdf')\"\n                  >\n                    @if (downloadedKey() === 'factsheet-pdf') {\n                      <lucide-icon [img]=\"Check\" class=\"text-primary size-3.5 shrink-0\" />\n                    } @else {\n                      <lucide-icon [img]=\"FileText\" class=\"size-3.5 shrink-0\" />\n                    }\n                    <span>{{\n                      downloadedKey() === 'factsheet-pdf'\n                        ? 'Downloaded'\n                        : 'Company Fact Sheet (.PDF · ' + factSheetPdfSize + ')'\n                    }}</span>\n                  </button>\n                </div>\n              </div>\n            </div>\n\n            <div ui-card class=\"border-border flex flex-col justify-between border shadow-xs\">\n              <div ui-card-header class=\"p-6 pb-4\">\n                <div class=\"flex flex-wrap items-center justify-between gap-2\">\n                  <div class=\"text-primary flex items-center gap-2 text-xs font-semibold tracking-wider uppercase\">\n                    <lucide-icon [img]=\"FileCode\" class=\"size-4 shrink-0\" />\n                    <span>Brand Rules & Boilerplate</span>\n                  </div>\n                  <button\n                    ui-button\n                    variant=\"ghost\"\n                    size=\"xs\"\n                    class=\"text-primary h-auto min-h-8 gap-1 text-center text-xs whitespace-normal\"\n                    (click)=\"copyToClipboard('boilerplate-text', boilerplateText)\"\n                  >\n                    @if (copiedKey() === 'boilerplate-text') {\n                      <lucide-icon [img]=\"Check\" class=\"size-3 shrink-0\" />\n                    } @else {\n                      <lucide-icon [img]=\"Copy\" class=\"size-3 shrink-0\" />\n                    }\n                    <span>{{ copiedKey() === 'boilerplate-text' ? 'Copied Boilerplate' : 'Copy Boilerplate' }}</span>\n                  </button>\n                </div>\n                <h3 ui-card-title class=\"mt-1 text-xl font-bold\">Official Company Boilerplate</h3>\n                <p ui-card-description class=\"text-xs leading-relaxed\">\n                  Approved copy for standard \"About the Company\" sections in press releases and event booklets.\n                </p>\n              </div>\n\n              <div ui-card-content class=\"space-y-4 p-6 pt-0\">\n                <div\n                  class=\"border-border bg-muted/40 text-muted-foreground rounded-lg border p-3.5 text-xs leading-relaxed italic\"\n                >\n                  \"{{ boilerplateText }}\"\n                </div>\n\n                <div class=\"space-y-2\">\n                  <span class=\"text-foreground text-xs font-semibold\">Brand Usage Rules:</span>\n                  <div class=\"grid gap-2\">\n                    @for (rule of visibleGuidelines(); track rule.text) {\n                      <div class=\"text-muted-foreground flex items-start gap-2 text-xs\">\n                        @if (rule.type === 'do') {\n                          <lucide-icon [img]=\"CheckCircle2\" class=\"text-success mt-0.5 size-3.5 shrink-0\" />\n                        } @else {\n                          <lucide-icon [img]=\"XCircle\" class=\"text-warning mt-0.5 size-3.5 shrink-0\" />\n                        }\n                        <span class=\"leading-normal\">{{ rule.text }}</span>\n                      </div>\n                    }\n                  </div>\n                </div>\n              </div>\n\n              <div ui-card-footer class=\"border-border/40 bg-muted/10 mt-2 border-t p-6 pt-0\">\n                <div class=\"text-muted-foreground flex w-full items-center justify-between pt-3 text-xs\">\n                  <span>Questions regarding brand trademark usage?</span>\n                  <a\n                    [href]=\"'mailto:' + pressEmail + '?subject=Brand%20Guideline%20Inquiry'\"\n                    class=\"text-primary inline-flex items-center gap-1 font-medium hover:underline\"\n                  >\n                    Contact Legal Desk\n                    <lucide-icon [img]=\"ExternalLink\" class=\"size-3 shrink-0\" />\n                  </a>\n                </div>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n})\nexport class UiPressKitBrandAssetsComponent {\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Copy = Copy\n  protected readonly Download = Download\n  protected readonly ExternalLink = ExternalLink\n  protected readonly FileArchive = FileArchive\n  protected readonly FileCode = FileCode\n  protected readonly FileImage = FileImage\n  protected readonly FileText = FileText\n  protected readonly Globe = Globe\n  protected readonly Info = Info\n  protected readonly Layers = Layers\n  protected readonly Mail = Mail\n  protected readonly Palette = Palette\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly User = User\n  protected readonly XCircle = XCircle\n\n  @Input() companyName = 'UIPKGE'\n  @Input() title = 'Brand Guidelines & Press Kit'\n  @Input() subtitle = 'Official logos, brand colors, typography rules, and executive media assets.'\n  @Input() version = 'v2.4'\n  @Input() lastUpdated = 'August 2026'\n  @Input() pressEmail = 'press@uipkge.dev'\n  @Input() pressKitZipSize = '48 MB'\n  @Input() pressKitZipUrl = '#'\n  @Input() factSheetPdfSize = '2.4 MB'\n  @Input()\n  boilerplateText =\n    'UIPKGE is an open-source multi-framework UI registry providing accessible standalone components for Vue, React, and Angular with 100% code ownership. Headquartered in San Francisco with a distributed core maintainer team.'\n  @Input() variant: 'default' | 'compact' = 'default'\n  @Input('class') className?: string\n\n  private readonly logosInput = signal<LogoAsset[] | undefined>(undefined)\n  private readonly colorsInput = signal<BrandColor[] | undefined>(undefined)\n  private readonly executivesInput = signal<Executive[] | undefined>(undefined)\n  private readonly guidelinesInput = signal<BrandGuidelineRule[] | undefined>(undefined)\n\n  @Input() set logos(v: LogoAsset[] | undefined) {\n    this.logosInput.set(v)\n  }\n  @Input() set colors(v: BrandColor[] | undefined) {\n    this.colorsInput.set(v)\n  }\n  @Input() set executives(v: Executive[] | undefined) {\n    this.executivesInput.set(v)\n  }\n  @Input() set guidelines(v: BrandGuidelineRule[] | undefined) {\n    this.guidelinesInput.set(v)\n  }\n\n  readonly activeLogos = computed(() => this.logosInput() ?? DEFAULT_LOGOS)\n  readonly activeColors = computed(() => this.colorsInput() ?? DEFAULT_COLORS)\n  readonly activeExecutives = computed(() => this.executivesInput() ?? DEFAULT_EXECUTIVES)\n  readonly activeGuidelines = computed(() => this.guidelinesInput() ?? DEFAULT_GUIDELINES)\n  readonly visibleGuidelines = computed(() => this.activeGuidelines().slice(0, 4))\n\n  readonly activeTab = signal<PressKitTab>('all')\n  readonly copiedKey = signal<string | null>(null)\n  readonly downloadedKey = signal<string | null>(null)\n\n  private copyTimer: ReturnType<typeof setTimeout> | undefined\n  private downloadTimer: ReturnType<typeof setTimeout> | undefined\n\n  get rootClass(): string {\n    return cn('bg-background text-foreground w-full transition-colors', this.className)\n  }\n\n  logoPreviewClass(logo: LogoAsset): string {\n    return cn(\n      'relative flex min-h-[190px] items-center justify-center overflow-hidden p-4 text-center transition-colors sm:p-8',\n      logo.theme === 'dark'\n        ? 'bg-zinc-950 text-white'\n        : logo.theme === 'light' && logo.id === 'monochrome-light'\n          ? 'bg-zinc-100 text-zinc-950 dark:bg-zinc-200'\n          : 'bg-muted/40 text-foreground bg-[radial-gradient(var(--border)_1px,transparent_1px)] [background-size:12px_12px]',\n    )\n  }\n\n  /** Short wordmark preview label (the Vue block renders inline SVGs per logo id). */\n  logoPreviewLabel(logo: LogoAsset): string {\n    if (logo.id === 'app-icon-mark') return '◈'\n    return `${this.companyName} .dev`\n  }\n\n  swatchClass(color: BrandColor): string {\n    return cn('border-border/40 relative flex h-24 w-full flex-col justify-between border-b p-3', color.bgClass)\n  }\n\n  contrastPillClass(color: BrandColor): string {\n    return cn(\n      'rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-md',\n      color.textDark ? 'bg-black/10 text-black' : 'bg-white/20 text-white',\n    )\n  }\n\n  oklchInner(oklch: string): string {\n    const open = oklch.indexOf('(')\n    const close = oklch.lastIndexOf(')')\n    if (open >= 0 && close > open) return oklch.slice(open + 1, close)\n    return oklch\n  }\n\n  async copyToClipboard(key: string, text: string): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(text)\n    } catch {\n      // Clipboard unavailable (jsdom) — still show feedback.\n    }\n    this.copiedKey.set(key)\n    clearTimeout(this.copyTimer)\n    this.copyTimer = setTimeout(() => {\n      if (this.copiedKey() === key) this.copiedKey.set(null)\n    }, 1800)\n  }\n\n  handleDownload(key: string): void {\n    this.downloadedKey.set(key)\n    clearTimeout(this.downloadTimer)\n    this.downloadTimer = setTimeout(() => {\n      if (this.downloadedKey() === key) this.downloadedKey.set(null)\n    }, 2000)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/press-kit-brand-assets/press-kit-brand-assets.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/press-kit-brand-assets/index.ts",
      "content": "export {\n  UiPressKitBrandAssetsComponent,\n  type BrandColor,\n  type BrandGuidelineRule,\n  type Executive,\n  type LogoAsset,\n} from './press-kit-brand-assets.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/press-kit-brand-assets/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/avatar.json",
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Comprehensive brand guidelines and press kit hub with official logo downloads in vector SVG/4K PNG/WebP, OKLCH brand palette tokens, executive leadership headshots (300 DPI), and press contact resources.",
  "categories": [
    "marketing",
    "brand",
    "media"
  ]
}