{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "coming-soon",
  "title": "Coming Soon",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/coming-soon/coming-soon.component.ts",
      "content": "// Interactive launch and maintenance workbench with high-impact countdown, VIP early\n// access waitlist queue allocator, live launch roadmap progress tracker, and feature\n// sneak-peek previews. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, computed, Input, OnDestroy, OnInit, signal } from '@angular/core'\nimport {\n  Activity,\n  ArrowRight,\n  ArrowUpRight,\n  Bot,\n  Check,\n  CheckCircle2,\n  Copy,\n  LucideAngularModule,\n  Palette,\n  Rocket,\n  ShieldCheck,\n  Terminal,\n  Zap,\n  type LucideIconData,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\n\nfunction pad(value: number): string {\n  return String(value).padStart(2, '0')\n}\n\nexport interface ComingSoonMilestone {\n  id: string\n  title: string\n  category: string\n  status: 'completed' | 'in_progress' | 'scheduled'\n  completionPercent: number\n  date: string\n}\n\nconst initialMilestones: ComingSoonMilestone[] = [\n  {\n    id: 'm1',\n    title: 'Dual-Framework Compiler & Monorepo Architecture',\n    category: 'Core Infra',\n    status: 'completed',\n    completionPercent: 100,\n    date: 'Aug 15, 2026',\n  },\n  {\n    id: 'm2',\n    title: 'Tailwind CSS v4 OKLCH Dynamic Theming Engine',\n    category: 'Design System',\n    status: 'completed',\n    completionPercent: 100,\n    date: 'Aug 18, 2026',\n  },\n  {\n    id: 'm3',\n    title: 'Zero-Lockin Code Distribution Registry & CLI',\n    category: 'DX & Tooling',\n    status: 'completed',\n    completionPercent: 100,\n    date: 'Aug 21, 2026',\n  },\n  {\n    id: 'm4',\n    title: 'Multi-Region Edge Registry Cache & Global SLA Testing',\n    category: 'Infrastructure',\n    status: 'in_progress',\n    completionPercent: 88,\n    date: 'Target: 3 Days',\n  },\n  {\n    id: 'm5',\n    title: 'Public V2.0 Global General Availability Rollout',\n    category: 'Release',\n    status: 'scheduled',\n    completionPercent: 0,\n    date: 'Target: 7 Days',\n  },\n]\n\nexport interface FeatureTeaser {\n  id: string\n  badge: string\n  title: string\n  description: string\n  icon: LucideIconData\n  statLabel: string\n  statValue: string\n  codeSnippet: string\n}\n\nconst teasers: FeatureTeaser[] = [\n  {\n    id: 'agentic',\n    badge: 'Flagship AI',\n    title: 'Autonomous Multi-Agent Orchestrator',\n    description: 'Decompose complex workflow DAGs into parallel subagent execution with real-time vector memory.',\n    icon: Bot,\n    statLabel: 'DAG Execution Speed',\n    statValue: '120ms P99',\n    codeSnippet: 'npx shadcn-vue@latest add @uipkge/ai-agent-orchestrator',\n  },\n  {\n    id: 'design',\n    badge: 'Design Engineering',\n    title: 'Tailwind v4 OKLCH Fluid Theme Tokens',\n    description: 'Perceptually uniform color spaces with automatic high-contrast dark mode switching & zero CSS bloat.',\n    icon: Palette,\n    statLabel: 'Bundle Size Overhead',\n    statValue: '0.00 kB',\n    codeSnippet: 'npx shadcn-vue@latest add @uipkge/theme-customize',\n  },\n  {\n    id: 'edge',\n    badge: 'Ultra Low Latency',\n    title: 'Cloudflare Workers Multi-Region Cache',\n    description: 'Global component manifest resolution with smart geo-routing and edge-cached JSON trees.',\n    icon: Zap,\n    statLabel: 'Global Median Latency',\n    statValue: '8.4ms',\n    codeSnippet: 'curl -s https://uipkge.dev/r/vue/init.json',\n  },\n]\n\nconst roleOptions = [\n  { id: 'frontend', label: 'Frontend / UI' },\n  { id: 'architect', label: 'Tech Lead / Arch' },\n  { id: 'founder', label: 'CTO / Founder' },\n] as const\n\nexport type WaitlistRole = (typeof roleOptions)[number]['id']\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-coming-soon, [ui-coming-soon]',\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: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiInputComponent,\n    UiProgressComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <section data-slot=\"coming-soon\" [class]=\"rootClass\">\n      <!-- Top Telemetry & Status Bar -->\n      <div\n        class=\"border-border/70 mx-auto flex w-full max-w-6xl flex-col items-center justify-between gap-4 border-b pb-12 sm:flex-row\"\n      >\n        <div class=\"flex items-center gap-3\">\n          <div\n            class=\"bg-primary text-primary-foreground flex size-9 items-center justify-center rounded-xl font-bold shadow-xs\"\n          >\n            <lucide-icon [img]=\"Rocket\" class=\"size-5\" />\n          </div>\n          <div>\n            <div class=\"flex items-center gap-2\">\n              <span class=\"text-foreground text-sm font-semibold tracking-tight\">UIPKGE Engine</span>\n              <span ui-badge variant=\"outline\" class=\"border-primary/30 text-primary px-1.5 py-0.5 font-mono text-xs\">\n                {{ productVersion }}\n              </span>\n            </div>\n            <p class=\"text-muted-foreground text-xs\">Dual-framework registry & visual workbench suite</p>\n          </div>\n        </div>\n\n        <!-- Global SLA Readiness Pill -->\n        <div class=\"bg-muted/40 border-border flex items-center gap-3 rounded-full border px-3.5 py-1.5\">\n          <div class=\"bg-success flex size-2 animate-pulse rounded-full\"></div>\n          <span class=\"text-muted-foreground font-mono text-xs\">\n            Staging Infrastructure: <strong class=\"text-foreground font-semibold\">99.99% Operational</strong>\n          </span>\n          <div ui-separator orientation=\"vertical\" class=\"h-3.5\"></div>\n          <a\n            [href]=\"statusUrl\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            class=\"text-primary inline-flex items-center gap-1 font-mono text-xs hover:underline\"\n          >\n            Live Status <lucide-icon [img]=\"ArrowUpRight\" class=\"size-3\" />\n          </a>\n        </div>\n      </div>\n\n      <!-- Main Hero & Countdown Body -->\n      <div class=\"mx-auto my-auto w-full max-w-6xl space-y-16 py-10\">\n        <!-- Headline & Subtitle -->\n        <div class=\"mx-auto max-w-3xl space-y-4 text-center\">\n          <span ui-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n            <lucide-icon [img]=\"Rocket\" class=\"text-primary size-3.5\" />\n            V2.0 General Availability Launch Matrix\n          </span>\n          <h1 class=\"text-foreground text-4xl leading-[1.1] font-bold tracking-tight sm:text-5xl lg:text-6xl\">\n            Production-grade design engineering workbenches.\n          </h1>\n          <p class=\"text-muted-foreground mx-auto max-w-2xl text-base leading-relaxed sm:text-lg\">\n            We are deploying 281+ production-grade primitives and composed workbenches with zero package dependencies.\n            Own your source code with complete architectural freedom.\n          </p>\n        </div>\n\n        <!-- High-Impact Digital Countdown Grid -->\n        <div class=\"mx-auto grid max-w-2xl grid-cols-2 gap-4 sm:grid-cols-4\">\n          @for (unit of units(); track unit.label) {\n            <div\n              ui-card\n              class=\"border-border bg-card/70 group hover:border-primary/40 relative overflow-hidden p-5 text-center shadow-xs backdrop-blur-xs transition-colors\"\n            >\n              <div class=\"text-foreground font-mono text-4xl font-bold tracking-tight tabular-nums sm:text-5xl\">\n                {{ unit.value }}\n              </div>\n              <div class=\"text-muted-foreground mt-2 font-mono text-xs font-medium tracking-widest uppercase\">\n                {{ unit.label }}\n              </div>\n              <div\n                class=\"bg-primary/20 group-hover:bg-primary absolute right-0 bottom-0 left-0 h-0.5 transition-colors\"\n              ></div>\n            </div>\n          }\n        </div>\n\n        <!-- Early Access & Queue Tracker Section -->\n        <div class=\"mx-auto w-full max-w-xl\">\n          <div ui-card class=\"border-border bg-card overflow-hidden shadow-sm\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex items-center justify-between\">\n                <h3 ui-card-title class=\"flex items-center gap-2 text-base font-semibold\">\n                  <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-4\" />\n                  Early Access Allocation\n                </h3>\n                <span ui-badge variant=\"outline\" class=\"border-success/20 bg-success/10 text-success font-mono text-xs\">\n                  Batch #2 Opening Soon\n                </span>\n              </div>\n              <p ui-card-description class=\"text-xs\">\n                Request priority invite access. Get instant sandbox access to all 281+ blocks before general public\n                launch.\n              </p>\n            </div>\n\n            <div ui-card-content>\n              @if (!submitted()) {\n                <form class=\"space-y-4\" (submit)=\"onWaitlistSubmit($event)\">\n                  <!-- Role Selector Tabs -->\n                  <div class=\"space-y-1.5\">\n                    <label class=\"text-foreground text-xs font-medium\">Your Primary Engineering Focus</label>\n                    <div class=\"grid grid-cols-3 gap-2\">\n                      @for (r of roles; track r.id) {\n                        <button\n                          type=\"button\"\n                          [class]=\"roleClass(r.id)\"\n                          (click)=\"role.set(r.id)\"\n                        >\n                          {{ r.label }}\n                        </button>\n                      }\n                    </div>\n                  </div>\n\n                  <!-- Email Input & Submit -->\n                  <div class=\"flex flex-col gap-2 sm:flex-row\">\n                    <div class=\"relative flex-1\">\n                      <ui-input\n                        [value]=\"email()\"\n                        (valueChange)=\"email.set($event)\"\n                        type=\"email\"\n                        placeholder=\"you@company.com\"\n                        required\n                        class=\"h-10 font-mono text-xs\"\n                      />\n                    </div>\n                    <button ui-button type=\"submit\" class=\"h-10 gap-1.5 px-5 text-xs font-semibold\">\n                      <span>Reserve Spot</span>\n                      <lucide-icon [img]=\"ArrowRight\" class=\"size-3.5\" />\n                    </button>\n                  </div>\n                  <p class=\"text-muted-foreground text-center text-xs\">\n                    No spam. You will only receive your single cryptographic invite token.\n                  </p>\n                </form>\n              } @else {\n                <div class=\"bg-muted/40 border-border space-y-4 rounded-xl border p-4 text-center\">\n                  <div class=\"bg-success/10 text-success mx-auto flex size-10 items-center justify-center rounded-full\">\n                    <lucide-icon [img]=\"Check\" class=\"size-5\" />\n                  </div>\n                  <div class=\"space-y-1\">\n                    <p class=\"text-foreground text-sm font-semibold\">You are #{{ queuePosition() }} in queue!</p>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Invitation tokens for Batch #2 will be delivered to\n                      <strong class=\"text-foreground font-mono\">{{ email() }}</strong\n                      >.\n                    </p>\n                  </div>\n\n                  <div class=\"border-border flex flex-col items-center justify-between gap-3 border-t pt-2 sm:flex-row\">\n                    <span class=\"text-muted-foreground font-mono text-xs\">Move up 5 spots per teammate invite:</span>\n                    <button\n                      ui-button\n                      variant=\"outline\"\n                      size=\"sm\"\n                      class=\"h-8 gap-1.5 font-mono text-xs\"\n                      (click)=\"copyReferral()\"\n                    >\n                      @if (copiedReferral()) {\n                        <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                      } @else {\n                        <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                      }\n                      <span>{{ copiedReferral() ? 'Copied Link' : 'Copy Invite Link' }}</span>\n                    </button>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        </div>\n\n        <!-- Interactive Feature Sneak-Peek Carousel & Terminal Preview -->\n        <div class=\"space-y-6\">\n          <div class=\"flex flex-col justify-between gap-4 sm:flex-row sm:items-center\">\n            <div>\n              <h2 class=\"text-foreground flex items-center gap-2 text-lg font-semibold tracking-tight\">\n                <lucide-icon [img]=\"Zap\" class=\"text-primary size-4\" />\n                Incoming Flagship Capabilities\n              </h2>\n              <p class=\"text-muted-foreground text-xs\">Sneak peek preview of the upcoming architecture release</p>\n            </div>\n\n            <!-- Teaser Navigation Tabs -->\n            <div class=\"bg-muted/40 border-border flex items-center gap-1.5 rounded-lg border p-1\">\n              @for (t of teasersList; track t.id; let idx = $index) {\n                <button\n                  type=\"button\"\n                  [class]=\"teaserTabClass(idx)\"\n                  (click)=\"activeTeaserIndex.set(idx)\"\n                >\n                  {{ t.badge }}\n                </button>\n              }\n            </div>\n          </div>\n\n          <!-- Active Teaser Card -->\n          <div ui-card class=\"border-border bg-card overflow-hidden\">\n            <div class=\"divide-border grid grid-cols-1 divide-y lg:grid-cols-12 lg:divide-x lg:divide-y-0\">\n              <div class=\"space-y-4 p-6 sm:p-8 lg:col-span-7\">\n                <div class=\"flex items-center gap-2.5\">\n                  <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                    <lucide-icon [img]=\"activeTeaser().icon\" class=\"size-5\" />\n                  </div>\n                  <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                    {{ activeTeaser().badge }}\n                  </span>\n                </div>\n\n                <h3 class=\"text-foreground text-xl font-bold tracking-tight\">{{ activeTeaser().title }}</h3>\n                <p class=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">\n                  {{ activeTeaser().description }}\n                </p>\n\n                <div class=\"flex items-center gap-6 pt-2\">\n                  <div>\n                    <p class=\"text-muted-foreground font-mono text-xs\">{{ activeTeaser().statLabel }}</p>\n                    <p class=\"text-foreground mt-0.5 font-mono text-xl font-bold\">\n                      {{ activeTeaser().statValue }}\n                    </p>\n                  </div>\n                  <div ui-separator orientation=\"vertical\" class=\"h-8\"></div>\n                  <div>\n                    <p class=\"text-muted-foreground font-mono text-xs\">Framework Support</p>\n                    <p class=\"text-success mt-1 text-xs font-semibold\">Vue 3.5 & React 19 Parity</p>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Terminal Snippet Box -->\n              <div class=\"bg-muted/20 flex flex-col justify-between space-y-4 p-6 lg:col-span-5\">\n                <div class=\"space-y-2\">\n                  <div class=\"flex items-center justify-between\">\n                    <span class=\"text-muted-foreground flex items-center gap-1.5 font-mono text-xs font-medium\">\n                      <lucide-icon [img]=\"Terminal\" class=\"size-3.5\" /> Direct CLI Command\n                    </span>\n                    <button\n                      ui-button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      class=\"h-7 gap-1.5 px-2 font-mono text-xs\"\n                      (click)=\"copyTeaserSnippet(activeTeaser().codeSnippet)\"\n                    >\n                      @if (copiedCli()) {\n                        <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                      } @else {\n                        <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                      }\n                      <span>{{ copiedCli() ? 'Copied' : 'Copy' }}</span>\n                    </button>\n                  </div>\n                  <div\n                    class=\"bg-background border-border text-foreground selection:bg-primary/20 overflow-x-auto rounded-lg border p-3 font-mono text-xs\"\n                  >\n                    <code>{{ activeTeaser().codeSnippet }}</code>\n                  </div>\n                </div>\n\n                <div\n                  class=\"border-border/80 bg-background/50 text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-xs\"\n                >\n                  <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-3.5 shrink-0\" />\n                  <span>Transitive dependencies, OKLCH styles & TS types included.</span>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Launch Readiness Milestones Tracker -->\n        <div class=\"border-border/70 space-y-6 border-t pt-4\">\n          <div class=\"flex flex-col justify-between gap-4 sm:flex-row sm:items-center\">\n            <div>\n              <h2 class=\"text-foreground flex items-center gap-2 text-lg font-semibold tracking-tight\">\n                <lucide-icon [img]=\"Activity\" class=\"text-primary size-4\" />\n                V2.0 Launch Milestones & Engineering Progress\n              </h2>\n              <p class=\"text-muted-foreground text-xs\">Transparent real-time build and release status</p>\n            </div>\n            <div class=\"flex items-center gap-3\">\n              <span class=\"text-foreground font-mono text-xs font-semibold\"\n                >Overall Readiness: {{ overallReadiness() }}%</span\n              >\n              <div ui-progress [value]=\"overallReadiness()\" class=\"h-2 w-28\"></div>\n            </div>\n          </div>\n\n          <div class=\"grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3\">\n            @for (m of milestones; track m.id) {\n              <div\n                class=\"border-border bg-card hover:border-primary/30 flex flex-col justify-between space-y-3 rounded-xl border p-4 shadow-xs transition-colors\"\n              >\n                <div class=\"flex items-start justify-between gap-2\">\n                  <span\n                    ui-badge\n                    variant=\"outline\"\n                    [class]=\"milestoneBadgeClass(m.status)\"\n                  >\n                    {{ milestoneLabel(m.status) }}\n                  </span>\n                  <span class=\"text-muted-foreground font-mono text-xs\">{{ m.date }}</span>\n                </div>\n\n                <div>\n                  <p class=\"text-foreground text-xs leading-snug font-semibold\">{{ m.title }}</p>\n                  <p class=\"text-muted-foreground mt-1 font-mono text-xs\">{{ m.category }}</p>\n                </div>\n\n                <div class=\"space-y-1 pt-1\">\n                  <div class=\"text-muted-foreground flex justify-between font-mono text-xs\">\n                    <span>Progress</span>\n                    <span>{{ m.completionPercent }}%</span>\n                  </div>\n                  <div ui-progress [value]=\"m.completionPercent\" class=\"h-1.5\"></div>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n\n      <!-- Footer -->\n      <footer\n        class=\"border-border text-muted-foreground mx-auto flex w-full max-w-6xl flex-col items-center justify-between gap-4 border-t pt-8 text-xs sm:flex-row\"\n      >\n        <div class=\"flex items-center gap-2\">\n          <span>&copy; {{ currentYear }} UIPKGE. Open source under MIT License.</span>\n        </div>\n        <div class=\"flex items-center gap-4\">\n          <a\n            href=\"https://github.com/uday-a/uipkge-registry\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            class=\"hover:text-foreground transition-colors\"\n          >\n            GitHub\n          </a>\n          <div ui-separator orientation=\"vertical\" class=\"h-3\"></div>\n          <a href=\"https://uipkge.dev\" target=\"_blank\" rel=\"noreferrer\" class=\"hover:text-foreground transition-colors\">\n            Registry Docs\n          </a>\n          <div ui-separator orientation=\"vertical\" class=\"h-3\"></div>\n          <a [href]=\"statusUrl\" target=\"_blank\" rel=\"noreferrer\" class=\"hover:text-foreground transition-colors\">\n            Status Page\n          </a>\n        </div>\n      </footer>\n    </section>\n  `,\n})\nexport class UiComingSoonComponent implements OnInit, OnDestroy {\n  protected readonly Activity = Activity\n  protected readonly ArrowRight = ArrowRight\n  protected readonly ArrowUpRight = ArrowUpRight\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Copy = Copy\n  protected readonly Rocket = Rocket\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Terminal = Terminal\n  protected readonly Zap = Zap\n\n  protected readonly milestones = initialMilestones\n  protected readonly teasersList = teasers\n  protected readonly roles = roleOptions\n\n  @Input() targetIso = ''\n  @Input() statusUrl = 'https://status.uipkge.dev'\n  @Input() productVersion = 'v2.0 Beta'\n  @Input('class') className?: string\n\n  readonly days = signal('00')\n  readonly hours = signal('00')\n  readonly minutes = signal('00')\n  readonly seconds = signal('00')\n  readonly activeTeaserIndex = signal(0)\n\n  // Waitlist form state\n  readonly email = signal('')\n  readonly role = signal<WaitlistRole>('frontend')\n  readonly submitted = signal(false)\n  readonly queuePosition = signal<number | null>(null)\n  readonly copiedReferral = signal(false)\n  readonly copiedCli = signal(false)\n\n  private deadline = 0\n  private timer: ReturnType<typeof setInterval> | undefined\n  private copyTimers: ReturnType<typeof setTimeout>[] = []\n\n  readonly units = computed(() => [\n    { label: 'Days', value: this.days() },\n    { label: 'Hours', value: this.hours() },\n    { label: 'Minutes', value: this.minutes() },\n    { label: 'Seconds', value: this.seconds() },\n  ])\n\n  readonly overallReadiness = computed(() =>\n    Math.round(initialMilestones.reduce((acc, m) => acc + m.completionPercent, 0) / initialMilestones.length),\n  )\n\n  readonly activeTeaser = computed(() => teasers[this.activeTeaserIndex()] ?? teasers[0])\n\n  get currentYear(): number {\n    return new Date().getFullYear()\n  }\n\n  get rootClass(): string {\n    return cn(\n      'bg-background relative flex min-h-screen flex-col justify-between overflow-hidden px-4 py-16 sm:px-6 lg:px-8',\n      this.className,\n    )\n  }\n\n  ngOnInit(): void {\n    this.deadline = this.targetIso ? new Date(this.targetIso).getTime() : Date.now() + 7 * 24 * 60 * 60 * 1000\n    this.tick()\n    this.timer = setInterval(() => this.tick(), 1000)\n  }\n\n  ngOnDestroy(): void {\n    clearInterval(this.timer)\n    this.copyTimers.forEach((t) => clearTimeout(t))\n  }\n\n  tick(): void {\n    const diff = Math.max(0, this.deadline - Date.now())\n    this.days.set(pad(Math.floor(diff / 86_400_000)))\n    this.hours.set(pad(Math.floor((diff % 86_400_000) / 3_600_000)))\n    this.minutes.set(pad(Math.floor((diff % 3_600_000) / 60_000)))\n    this.seconds.set(pad(Math.floor((diff % 60_000) / 1000)))\n  }\n\n  onWaitlistSubmit(event: Event): void {\n    event.preventDefault()\n    this.handleWaitlistSubmit()\n  }\n\n  handleWaitlistSubmit(): void {\n    if (!this.email()) return\n    const randomPos = Math.floor(Math.random() * 80) + 120\n    this.queuePosition.set(randomPos)\n    this.submitted.set(true)\n  }\n\n  copyReferral(): void {\n    void navigator.clipboard?.writeText(`https://uipkge.dev/invite?ref=queue_${this.queuePosition()}`)\n    this.copiedReferral.set(true)\n    this.copyTimers.push(setTimeout(() => this.copiedReferral.set(false), 2000))\n  }\n\n  copyTeaserSnippet(snippet: string): void {\n    void navigator.clipboard?.writeText(snippet)\n    this.copiedCli.set(true)\n    this.copyTimers.push(setTimeout(() => this.copiedCli.set(false), 2000))\n  }\n\n  roleClass(id: WaitlistRole): string {\n    return cn(\n      'rounded-lg border px-2.5 py-1.5 text-center text-xs font-medium transition-colors',\n      this.role() === id\n        ? 'border-primary bg-primary/10 text-primary font-semibold shadow-xs'\n        : 'border-border bg-background text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  teaserTabClass(idx: number): string {\n    return cn(\n      'rounded-md px-3 py-1 text-xs font-medium transition-colors',\n      this.activeTeaserIndex() === idx\n        ? 'bg-background text-foreground font-semibold shadow-xs'\n        : 'text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  milestoneBadgeClass(status: ComingSoonMilestone['status']): string {\n    return cn(\n      'px-2 py-0.5 font-mono text-xs',\n      status === 'completed' && 'border-success/20 bg-success/10 text-success',\n      status === 'in_progress' && 'border-warning/20 bg-warning/10 text-warning',\n      status === 'scheduled' && 'bg-muted text-muted-foreground border-border',\n    )\n  }\n\n  milestoneLabel(status: ComingSoonMilestone['status']): string {\n    if (status === 'completed') return 'Completed'\n    if (status === 'in_progress') return 'In Progress'\n    return 'Scheduled'\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/coming-soon/coming-soon.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/coming-soon/index.ts",
      "content": "export {\n  UiComingSoonComponent,\n  type ComingSoonMilestone,\n  type FeatureTeaser,\n  type WaitlistRole,\n} from './coming-soon.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/coming-soon/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",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/progress.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Interactive launch and maintenance workbench with high-impact countdown, VIP early access waitlist queue allocator, live launch roadmap progress tracker, and feature sneak-peek previews.",
  "categories": [
    "marketing"
  ]
}