{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "waitlist",
  "title": "Waitlist",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/waitlist/waitlist.component.ts",
      "content": "// Pre-launch signup page: split layout with product pitch, logo mark and three benefit\n// bullets on the left, and an email capture card on the right that flips to a\n// queue-position confirmation with referral hint after submit. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport { Check, Layers, Link2, LucideAngularModule, ShieldCheck, Zap } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\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'\n\ninterface WaitlistBenefit {\n  icon: typeof Zap\n  title: string\n  copy: string\n}\n\nconst benefits: WaitlistBenefit[] = [\n  { icon: Zap, title: 'Ships in minutes', copy: 'Drop-in blocks and primitives, not boilerplate to rewrite.' },\n  {\n    icon: ShieldCheck,\n    title: 'Own the code',\n    copy: 'Every file is copied into your repo. Edit it freely, no lock-in.',\n  },\n  { icon: Layers, title: 'Dual framework', copy: 'Vue and React mirrors stay in lockstep across every component.' },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-waitlist, [ui-waitlist]',\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    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiInputComponent,\n  ],\n  template: `\n    <section data-slot=\"waitlist\" [class]=\"rootClass\">\n      <div class=\"bg-muted/40 relative flex items-center px-6 py-16 lg:border-r lg:px-16\">\n        <div class=\"max-w-lg\">\n          <div class=\"flex items-center gap-3\">\n            <div class=\"bg-primary text-primary-foreground grid size-10 place-items-center rounded-lg shadow-sm\">\n              <lucide-icon [img]=\"Layers\" class=\"size-5\" />\n            </div>\n            <span class=\"text-sm font-semibold tracking-tight\">Northwind</span>\n          </div>\n\n          <h1 class=\"mt-8 text-3xl font-semibold tracking-tight sm:text-4xl\">Be first in line when we launch</h1>\n          <p class=\"text-muted-foreground mt-4 text-base sm:text-lg\">\n            We&rsquo;re onboarding a small cohort of teams each week. Join the waitlist and we&rsquo;ll save your spot.\n          </p>\n\n          <ul class=\"mt-10 space-y-6\">\n            @for (benefit of benefits; track benefit.title) {\n              <li class=\"flex gap-4\">\n                <div class=\"bg-primary/10 text-primary grid size-9 shrink-0 place-items-center rounded-lg\">\n                  <lucide-icon [img]=\"benefit.icon\" class=\"size-4.5\" />\n                </div>\n                <div>\n                  <p class=\"text-sm font-medium\">{{ benefit.title }}</p>\n                  <p class=\"text-muted-foreground mt-1 text-sm\">{{ benefit.copy }}</p>\n                </div>\n              </li>\n            }\n          </ul>\n        </div>\n      </div>\n\n      <div class=\"flex items-center justify-center px-6 py-16\">\n        <div ui-card class=\"w-full max-w-md\">\n          @if (!submitted()) {\n            <div ui-card-header>\n              <h3 ui-card-title>Join the waitlist</h3>\n              <p ui-card-description>\n                Early access rolls out weekly. No spam &mdash; one email when it&rsquo;s your turn.\n              </p>\n            </div>\n            <div ui-card-content>\n              <form class=\"space-y-3\" (submit)=\"handleSubmit($event)\">\n                <ui-input\n                  type=\"email\"\n                  placeholder=\"you@company.com\"\n                  aria-label=\"Email address\"\n                  required\n                  [value]=\"email()\"\n                  (valueChange)=\"email.set($event)\"\n                />\n                <button ui-button type=\"submit\" class=\"w-full\">Request access</button>\n              </form>\n              <p class=\"text-muted-foreground mt-4 text-xs\">2,300+ teams already in line</p>\n            </div>\n          } @else {\n            <div ui-card-content class=\"pt-6 text-center\">\n              <div class=\"bg-primary/10 text-primary mx-auto grid size-12 place-items-center rounded-full\">\n                <lucide-icon [img]=\"Check\" class=\"size-6\" />\n              </div>\n              <h2 class=\"mt-5 text-2xl font-semibold tracking-tight\">You&rsquo;re #{{ position() }} in line</h2>\n              <p class=\"text-muted-foreground mt-2 text-sm\">\n                We&rsquo;ll email {{ email() }} as soon as your spot opens up.\n              </p>\n              <div class=\"bg-muted/50 mt-6 flex items-start gap-3 rounded-lg border p-4 text-left\">\n                <lucide-icon [img]=\"Link2\" class=\"text-muted-foreground mt-0.5 size-4 shrink-0\" />\n                <p class=\"text-muted-foreground text-xs\">\n                  Want to skip the queue? Share your invite link after launch &mdash; every friend who signs up moves\n                  you up 5 spots.\n                </p>\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    </section>\n  `,\n})\nexport class UiWaitlistComponent {\n  protected readonly Check = Check\n  protected readonly Layers = Layers\n  protected readonly Link2 = Link2\n\n  protected readonly benefits = benefits\n\n  @Input('class') className?: string\n  @Input() set initialEmail(v: string) {\n    this.email.set(v ?? '')\n  }\n\n  readonly email = signal('')\n  readonly submitted = signal(false)\n  readonly position = signal(214)\n\n  get rootClass(): string {\n    return cn('bg-background grid min-h-screen lg:grid-cols-2', this.className)\n  }\n\n  handleSubmit(event: Event): void {\n    event.preventDefault()\n    if (!this.email().includes('@')) return\n    this.submitted.set(true)\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/waitlist/waitlist.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/waitlist/index.ts",
      "content": "export { UiWaitlistComponent } from './waitlist.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/waitlist/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/input.json"
  ],
  "description": "Pre-launch signup page. Split layout with product pitch, logo mark, three benefit bullets on the left and an email capture card on the right that flips to a queue-position confirmation with referral hint after submit.",
  "categories": [
    "marketing"
  ]
}