{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "coming-soon",
  "title": "Coming Soon",
  "type": "registry:page",
  "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"
  ],
  "files": [
    {
      "path": "packages/elements-lit/src/blocks/coming-soon/coming-soon.ts",
      "content": "import { LitElement, css, html } from 'lit'\nimport {\n  Activity,\n  ArrowRight,\n  ArrowUpRight,\n  Bot,\n  Check,\n  CheckCircle2,\n  Copy,\n  Palette,\n  Rocket,\n  ShieldCheck,\n  Terminal,\n  Zap,\n  type IconNode,\n} from 'lucide'\nimport { cn } from '../../lib/utils'\nimport { tailwind } from '../../lib/styles'\nimport { ThemeController } from '../../lib/theme'\nimport { icon } from '../../lib/icon'\n// Side-effect imports: register the composed elements for standalone use\n// (consumers who install only this block still get working primitives).\nimport '../../components/badge/badge'\nimport '../../components/button/button'\nimport '../../components/input/input'\nimport type { UipInput } from '../../components/input/input'\n\nfunction pad(value: number) {\n  return String(value).padStart(2, '0')\n}\n\ninterface Milestone {\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: Milestone[] = [\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\ninterface FeatureTeaser {\n  id: string\n  badge: string\n  title: string\n  description: string\n  icon: IconNode\n  iconName: string\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    iconName: '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:\n      'Perceptually uniform color spaces with automatic high-contrast dark mode switching & zero CSS bloat.',\n    icon: Palette,\n    iconName: '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    iconName: 'zap',\n    statLabel: 'Global Median Latency',\n    statValue: '8.4ms',\n    codeSnippet: 'curl -s https://uipkge.dev/r/vue/init.json',\n  },\n]\n\n// Card chrome follows the registry Card verbatim (see the login-01 block:\n// surfaces stay plain divs so per-card classes like the zinc terminal paint\n// land on the painted box). Defaults resolved from cardVariants + the React\n// part classes; per-card className merged the way cn() would.\nconst countdownCardClass =\n  'bg-card/70 text-card-foreground rounded-xl border border-border group hover:border-primary/40 relative overflow-hidden p-5 text-center shadow-xs backdrop-blur-xs transition-colors duration-150'\nconst plainCardClass =\n  'bg-card text-card-foreground rounded-xl border border-border overflow-hidden shadow-sm transition-colors duration-150'\n\n/**\n * <uip-coming-soon> — the registry ComingSoon block as a web component.\n *\n * Class strings are React's ComingSoon verbatim. React state (useState)\n * becomes @state fields; the 1s countdown interval starts in\n * `connectedCallback` (recomputed when `target-iso` changes) and is cleared\n * in `disconnectedCallback`, as are the copy-label timeouts. The waitlist\n * form is fully internal like React (no callbacks).\n */\nexport class UipComingSoon extends LitElement {\n  static shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true }\n  // :host display can't be a utility class (the host has no template of its own).\n  static styles = [tailwind, css`:host { display: block; }`]\n\n  static properties = {\n    targetIso: { attribute: 'target-iso' },\n    statusUrl: { attribute: 'status-url' },\n    productVersion: { attribute: 'product-version' },\n    remaining: { state: true },\n    activeTeaserIndex: { state: true },\n    email: { state: true },\n    audience: { state: true },\n    submitted: { state: true },\n    queuePosition: { state: true },\n    copiedReferral: { state: true },\n    copiedCli: { state: true },\n  }\n\n  targetIso = ''\n  statusUrl = 'https://status.uipkge.dev'\n  productVersion = 'v2.0 Beta'\n  private remaining = { days: '00', hours: '00', minutes: '00', seconds: '00' }\n  private activeTeaserIndex = 0\n  private email = ''\n  private audience: 'frontend' | 'architect' | 'founder' = 'frontend'\n  private submitted = false\n  private queuePosition: number | null = null\n  private copiedReferral = false\n  private copiedCli = false\n  private deadline = 0\n  private timer?: number\n  private copyTimer?: number\n\n  constructor() {\n    super()\n    new ThemeController(this)\n  }\n\n  connectedCallback() {\n    super.connectedCallback()\n    this.setAttribute('data-uipkge', '')\n    this.setAttribute('data-slot', 'coming-soon')\n    this.resetDeadline()\n    this.tick()\n    this.timer = window.setInterval(() => this.tick(), 1000)\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    if (this.timer) window.clearInterval(this.timer)\n    if (this.copyTimer) window.clearTimeout(this.copyTimer)\n  }\n\n  protected updated(changed: Map<string, unknown>) {\n    if (changed.has('targetIso')) this.resetDeadline()\n  }\n\n  private resetDeadline() {\n    this.deadline = this.targetIso ? new Date(this.targetIso).getTime() : Date.now() + 7 * 24 * 60 * 60 * 1000\n  }\n\n  private tick() {\n    const diff = Math.max(0, this.deadline - Date.now())\n    this.remaining = {\n      days: pad(Math.floor(diff / 86_400_000)),\n      hours: pad(Math.floor((diff % 86_400_000) / 3_600_000)),\n      minutes: pad(Math.floor((diff % 3_600_000) / 60_000)),\n      seconds: pad(Math.floor((diff % 60_000) / 1000)),\n    }\n  }\n\n  private flashCopy(which: 'referral' | 'cli') {\n    if (which === 'referral') this.copiedReferral = true\n    else this.copiedCli = true\n    if (this.copyTimer) window.clearTimeout(this.copyTimer)\n    this.copyTimer = window.setTimeout(() => {\n      this.copiedReferral = false\n      this.copiedCli = false\n    }, 2000)\n  }\n\n  private copyText(text: string, which: 'referral' | 'cli') {\n    try {\n      navigator.clipboard?.writeText(text)?.catch(() => {})\n    } catch {\n      // Clipboard unavailable (insecure context): still flash the label.\n    }\n    this.flashCopy(which)\n  }\n\n  private handleWaitlistSubmit(e: Event) {\n    e.preventDefault()\n    if (!this.email) return\n    // Simulated VIP queue calculation\n    this.queuePosition = Math.floor(Math.random() * 80) + 120\n    this.submitted = true\n  }\n\n  private progressTrack(value: number, trackClass: string) {\n    const clamped = Math.min(100, Math.max(0, value))\n    return html`<div\n      data-uipkge=\"\"\n      data-slot=\"progress\"\n      role=\"progressbar\"\n      aria-valuemin=\"0\"\n      aria-valuemax=\"100\"\n      aria-valuenow=${clamped}\n      data-state=${clamped >= 100 ? 'complete' : 'loading'}\n      data-value=${clamped}\n      data-max=\"100\"\n      class=${trackClass}\n    >\n      <div\n        data-uipkge=\"\"\n        data-slot=\"progress-indicator\"\n        data-state=${clamped >= 100 ? 'complete' : 'loading'}\n        data-value=${clamped}\n        data-max=\"100\"\n        class=\"bg-primary h-full w-full flex-1 transition-transform duration-500 ease-out motion-reduce:transition-none\"\n        style=${`transform: translateX(-${100 - clamped}%)`}\n      ></div>\n    </div>`\n  }\n\n  render() {\n    const units = [\n      { label: 'Days', value: this.remaining.days },\n      { label: 'Hours', value: this.remaining.hours },\n      { label: 'Minutes', value: this.remaining.minutes },\n      { label: 'Seconds', value: this.remaining.seconds },\n    ]\n    const overallReadiness = Math.round(\n      initialMilestones.reduce((acc, m) => acc + m.completionPercent, 0) / initialMilestones.length,\n    )\n    const active = teasers[this.activeTeaserIndex]\n    const year = new Date().getFullYear()\n    return html`\n      <section\n        data-slot=\"coming-soon\"\n        class=\"bg-background relative flex min-h-screen flex-col justify-between overflow-hidden px-4 py-16 sm:px-6 lg:px-8\"\n      >\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              ${icon(Rocket, 'rocket', '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                <uip-badge variant=\"outline\" class=\"border-primary/30 text-primary px-1.5 py-0.5 font-mono text-xs\">\n                  ${this.productVersion}\n                </uip-badge>\n              </div>\n              <p class=\"text-muted-foreground text-xs\">Dual-framework registry & visual workbench suite</p>\n            </div>\n          </div>\n\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\n              data-uipkge=\"\"\n              data-slot=\"separator\"\n              data-orientation=\"vertical\"\n              role=\"none\"\n              class=\"bg-border shrink-0 w-px h-3.5\"\n            ></div>\n            <a\n              href=${this.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 ${icon(ArrowUpRight, 'arrow-up-right', 'size-3')}\n            </a>\n          </div>\n        </div>\n\n        <div class=\"mx-auto my-auto w-full max-w-6xl space-y-16 py-10\">\n          <div class=\"mx-auto max-w-3xl space-y-4 text-center\">\n            <uip-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n              ${icon(Rocket, 'rocket', 'text-primary size-3.5')} V2.0 General Availability Launch Matrix\n            </uip-badge>\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          <div class=\"mx-auto grid max-w-2xl grid-cols-2 gap-4 sm:grid-cols-4\">\n            ${units.map(\n              (unit) => html`<div data-uipkge=\"\" data-slot=\"card\" class=${countdownCardClass}>\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 class=\"bg-primary/20 group-hover:bg-primary absolute right-0 bottom-0 left-0 h-0.5 transition-colors\"></div>\n              </div>`,\n            )}\n          </div>\n\n          <div class=\"mx-auto w-full max-w-xl\">\n            <div data-uipkge=\"\" data-slot=\"card\" class=${plainCardClass}>\n              <div\n                data-uipkge=\"\"\n                data-slot=\"card-header\"\n                class=\"grid auto-rows-min grid-cols-[minmax(0,1fr)] grid-rows-[auto_auto] items-start gap-1.5 p-6 pb-4 has-data-[slot=card-action]:grid-cols-[minmax(0,1fr)_auto]\"\n              >\n                <div class=\"flex items-center justify-between\">\n                  <h3\n                    data-uipkge=\"\"\n                    data-slot=\"card-title\"\n                    class=\"leading-none tracking-tight flex items-center gap-2 text-base font-semibold\"\n                  >\n                    ${icon(ShieldCheck, 'shield-check', 'text-primary size-4')} Early Access Allocation\n                  </h3>\n                  <uip-badge variant=\"outline\" class=\"border-success/20 bg-success/10 text-success font-mono text-xs\">\n                    Batch #2 Opening Soon\n                  </uip-badge>\n                </div>\n                <p data-uipkge=\"\" data-slot=\"card-description\" class=\"text-muted-foreground 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 data-uipkge=\"\" data-slot=\"card-content\" class=\"space-y-6 p-6 pt-0\">\n                ${!this.submitted\n                  ? html`<form @submit=${this.handleWaitlistSubmit} class=\"space-y-4\">\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                          ${[\n                            { id: 'frontend', label: 'Frontend / UI' },\n                            { id: 'architect', label: 'Tech Lead / Arch' },\n                            { id: 'founder', label: 'CTO / Founder' },\n                          ].map(\n                            (r) => html`<button\n                              type=\"button\"\n                              class=${cn(\n                                'rounded-lg border px-2.5 py-1.5 text-center text-xs font-medium transition-colors',\n                                this.audience === r.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                              @click=${() => {\n                                this.audience = r.id as 'frontend' | 'architect' | 'founder'\n                              }}\n                            >\n                              ${r.label}\n                            </button>`,\n                          )}\n                        </div>\n                      </div>\n\n                      <div class=\"flex flex-col gap-2 sm:flex-row\">\n                        <div class=\"relative flex-1\">\n                          <uip-input\n                            type=\"email\"\n                            placeholder=\"you@company.com\"\n                            .value=${this.email}\n                            required\n                            class=\"h-10 font-mono text-xs\"\n                            @input=${(e: Event) => {\n                              this.email = (e.target as UipInput).value\n                            }}\n                          ></uip-input>\n                        </div>\n                        <uip-button type=\"submit\" class=\"h-10 gap-1.5 px-5 text-xs font-semibold\">\n                          <span>Reserve Spot</span>\n                          ${icon(ArrowRight, 'arrow-right', 'size-3.5')}\n                        </uip-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                  : html`<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                        ${icon(Check, 'check', 'size-5')}\n                      </div>\n                      <div class=\"space-y-1\">\n                        <p class=\"text-foreground text-sm font-semibold\">You are #${this.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\">${this.email}</strong>.\n                        </p>\n                      </div>\n\n                      <div\n                        class=\"border-border flex flex-col items-center justify-between gap-3 border-t pt-2 sm:flex-row\"\n                      >\n                        <span class=\"text-muted-foreground font-mono text-xs\">\n                          Move up 5 spots per teammate invite:\n                        </span>\n                        <uip-button\n                          variant=\"outline\"\n                          size=\"sm\"\n                          class=\"h-8 gap-1.5 font-mono text-xs\"\n                          @click=${() =>\n                            this.copyText(`https://uipkge.dev/invite?ref=queue_${this.queuePosition}`, 'referral')}\n                        >\n                          ${this.copiedReferral\n                            ? icon(Check, 'check', 'text-success size-3')\n                            : icon(Copy, 'copy', 'size-3')}\n                          <span>${this.copiedReferral ? 'Copied Link' : 'Copy Invite Link'}</span>\n                        </uip-button>\n                      </div>\n                    </div>`}\n              </div>\n            </div>\n          </div>\n\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                  ${icon(Zap, 'zap', 'text-primary size-4')} 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              <div class=\"bg-muted/40 border-border flex items-center gap-1.5 rounded-lg border p-1\">\n                ${teasers.map(\n                  (t, idx) => html`<button\n                    type=\"button\"\n                    class=${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                    @click=${() => {\n                      this.activeTeaserIndex = idx\n                    }}\n                  >\n                    ${t.badge}\n                  </button>`,\n                )}\n              </div>\n            </div>\n\n            <div data-uipkge=\"\" data-slot=\"card\" class=${plainCardClass}>\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\">${icon(active.icon, active.iconName, 'size-5')}</div>\n                    <uip-badge variant=\"secondary\" class=\"font-mono text-xs\">${active.badge}</uip-badge>\n                  </div>\n\n                  <h3 class=\"text-foreground text-xl font-bold tracking-tight\">${active.title}</h3>\n                  <p class=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">${active.description}</p>\n\n                  <div class=\"flex items-center gap-6 pt-2\">\n                    <div>\n                      <p class=\"text-muted-foreground font-mono text-xs\">${active.statLabel}</p>\n                      <p class=\"text-foreground mt-0.5 font-mono text-xl font-bold\">${active.statValue}</p>\n                    </div>\n                    <div\n                      data-uipkge=\"\"\n                      data-slot=\"separator\"\n                      data-orientation=\"vertical\"\n                      role=\"none\"\n                      class=\"bg-border shrink-0 w-px h-8\"\n                    ></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                <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                        ${icon(Terminal, 'terminal', 'size-3.5')} Direct CLI Command\n                      </span>\n                      <uip-button\n                        variant=\"ghost\"\n                        size=\"sm\"\n                        class=\"h-7 gap-1.5 px-2 font-mono text-xs\"\n                        @click=${() => this.copyText(active.codeSnippet, 'cli')}\n                      >\n                        ${this.copiedCli ? icon(Check, 'check', 'text-success size-3') : icon(Copy, 'copy', 'size-3')}\n                        <span>${this.copiedCli ? 'Copied' : 'Copy'}</span>\n                      </uip-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>${active.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                    ${icon(CheckCircle2, 'circle-check-big', '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          <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                  ${icon(Activity, 'activity', 'text-primary size-4')} 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}%\n                </span>\n                ${this.progressTrack(overallReadiness, 'bg-primary/20 relative h-2 w-28 overflow-hidden rounded-full')}\n              </div>\n            </div>\n\n            <div class=\"grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3\">\n              ${initialMilestones.map(\n                (m) => html`<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                    <uip-badge\n                      variant=\"outline\"\n                      class=${cn(\n                        'px-2 py-0.5 font-mono text-xs',\n                        m.status === 'completed' && 'border-success/20 bg-success/10 text-success',\n                        m.status === 'in_progress' && 'border-warning/20 bg-warning/10 text-warning',\n                        m.status === 'scheduled' && 'bg-muted text-muted-foreground border-border',\n                      )}\n                    >\n                      ${m.status === 'completed' ? 'Completed' : m.status === 'in_progress' ? 'In Progress' : 'Scheduled'}\n                    </uip-badge>\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                    ${this.progressTrack(m.completionPercent, 'bg-primary/20 relative h-1.5 w-full overflow-hidden rounded-full')}\n                  </div>\n                </div>`,\n              )}\n            </div>\n          </div>\n        </div>\n\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; ${year} 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\n              data-uipkge=\"\"\n              data-slot=\"separator\"\n              data-orientation=\"vertical\"\n              role=\"none\"\n              class=\"bg-border shrink-0 w-px h-3\"\n            ></div>\n            <a href=\"https://uipkge.dev\" target=\"_blank\" rel=\"noreferrer\" class=\"hover:text-foreground transition-colors\">\n              Registry Docs\n            </a>\n            <div\n              data-uipkge=\"\"\n              data-slot=\"separator\"\n              data-orientation=\"vertical\"\n              role=\"none\"\n              class=\"bg-border shrink-0 w-px h-3\"\n            ></div>\n            <a href=${this.statusUrl} target=\"_blank\" rel=\"noreferrer\" class=\"hover:text-foreground transition-colors\">\n              Status Page\n            </a>\n          </div>\n        </footer>\n      </section>\n    `\n  }\n}\n\ncustomElements.get('uip-coming-soon') || customElements.define('uip-coming-soon', UipComingSoon)\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'uip-coming-soon': UipComingSoon\n  }\n}\n",
      "type": "registry:file",
      "target": "src/uip/blocks/coming-soon/coming-soon.ts"
    }
  ],
  "dependencies": [
    "lit",
    "lucide"
  ],
  "registryDependencies": [
    "https://uipkge.dev/r/lit/badge.json",
    "https://uipkge.dev/r/lit/button.json",
    "https://uipkge.dev/r/lit/input.json",
    "https://uipkge.dev/r/lit/lit-core.json"
  ]
}
