{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "contact-01",
  "title": "Sales Contact Form",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/contact-01/contact-01.component.ts",
      "content": "// Interactive enterprise solutions architect dispatch workbench with track selection,\n// live hub timezones, SLA badges, and ticket generator. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, computed, signal } from '@angular/core'\nimport {\n  Building2,\n  Check,\n  Copy,\n  Headphones,\n  LucideAngularModule,\n  MessageSquare,\n  Send,\n  ShieldCheck,\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 { UiLabelComponent } from '@/ui/label/label.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { UiTextareaComponent } from '@/ui/textarea/textarea.component'\n\nexport interface InquiryTrack {\n  id: string\n  title: string\n  subtitle: string\n  sla: string\n  icon: 'enterprise' | 'support' | 'security'\n}\n\nexport interface ContactSubmitPayload {\n  type: string\n  name: string\n  email: string\n  company: string\n  teamSize: string\n  message: string\n  ticketId: string\n}\n\nconst inquiryTypes: InquiryTrack[] = [\n  {\n    id: 'enterprise',\n    title: 'Enterprise Architecture',\n    subtitle: 'Custom registries, zero-lockin migrations & multi-team governance',\n    sla: '< 2h SLA',\n    icon: 'enterprise',\n  },\n  {\n    id: 'support',\n    title: 'Dedicated Engineering SLA',\n    subtitle: '24/7 incident response, custom upstream bugfixes & private Slack channel',\n    sla: '< 15m SLA',\n    icon: 'support',\n  },\n  {\n    id: 'security',\n    title: 'Security & Compliance Review',\n    subtitle: 'SOC2 Type II audits, self-hosted registry mirrors & air-gapped deployments',\n    sla: '< 4h SLA',\n    icon: 'security',\n  },\n]\n\nconst globalHubs = [\n  { city: 'San Francisco', tz: 'PST (UTC-8)', status: 'Active (09:00 - 18:00)', email: 'sf@uipkge.dev' },\n  { city: 'London', tz: 'GMT (UTC+0)', status: 'Active (08:30 - 17:30)', email: 'london@uipkge.dev' },\n  { city: 'Singapore', tz: 'SGT (UTC+8)', status: 'Active (09:00 - 18:00)', email: 'singapore@uipkge.dev' },\n]\n\nconst teamSizes = ['1-10', '10-50', '50+']\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-contact-01, [ui-contact-01]',\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    UiLabelComponent,\n    UiSeparatorComponent,\n    UiTextareaComponent,\n  ],\n  template: `\n    <section data-slot=\"contact-01\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-6xl space-y-12\">\n        <!-- Section Header -->\n        <div class=\"max-w-3xl space-y-3\">\n          <span ui-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n            <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-3.5\" />\n            Enterprise Engineering & Architecture Solutions\n          </span>\n          <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">\n            Talk to a principal design engineer.\n          </h2>\n          <p class=\"text-muted-foreground text-sm leading-relaxed sm:text-base\">\n            No generic sales reps. Connect directly with the core team that architects our dual-framework registry,\n            token engines, and headless workbenches.\n          </p>\n        </div>\n\n        <!-- Main Layout -->\n        <div class=\"grid grid-cols-1 items-start gap-8 lg:grid-cols-12\">\n          <!-- Left Column: Inquiry Routing & Global Hubs (5 Cols) -->\n          <div class=\"space-y-6 lg:col-span-5\">\n            <div class=\"space-y-3\">\n              <p class=\"text-muted-foreground font-mono text-xs tracking-wider uppercase\">Select Engagement Track</p>\n              <div class=\"space-y-2.5\">\n                @for (track of inquiryTypes; track track.id) {\n                  <div\n                    role=\"button\"\n                    tabindex=\"0\"\n                    [class]=\"trackCardClass(track.id)\"\n                    (click)=\"selectedType.set(track.id)\"\n                    (keydown.enter)=\"selectedType.set(track.id)\"\n                    (keydown.space)=\"$event.preventDefault(); selectedType.set(track.id)\"\n                  >\n                    <div class=\"flex items-start justify-between gap-3\">\n                      <div class=\"flex items-center gap-2.5\">\n                        <div [class]=\"trackIconClass(track.id)\">\n                          @switch (track.icon) {\n                            @case ('enterprise') {\n                              <lucide-icon [img]=\"Building2\" class=\"size-4\" />\n                            }\n                            @case ('support') {\n                              <lucide-icon [img]=\"Headphones\" class=\"size-4\" />\n                            }\n                            @default {\n                              <lucide-icon [img]=\"ShieldCheck\" class=\"size-4\" />\n                            }\n                          }\n                        </div>\n                        <span class=\"text-foreground text-xs font-semibold\">{{ track.title }}</span>\n                      </div>\n                      <span ui-badge variant=\"outline\" class=\"bg-background font-mono text-xs\">\n                        {{ track.sla }}\n                      </span>\n                    </div>\n                    <p class=\"text-muted-foreground mt-2 pl-9 text-xs\">\n                      {{ track.subtitle }}\n                    </p>\n                  </div>\n                }\n              </div>\n            </div>\n\n            <div ui-separator></div>\n\n            <!-- Global Timezone & Architecture Hubs -->\n            <div class=\"space-y-3\">\n              <div class=\"flex items-center justify-between\">\n                <p class=\"text-muted-foreground font-mono text-xs tracking-wider uppercase\">Direct Engineering Hubs</p>\n                <div class=\"text-success flex items-center gap-1.5 font-mono text-xs\">\n                  <span class=\"bg-success size-2 animate-pulse rounded-full\"></span>\n                  Live Dispatch Active\n                </div>\n              </div>\n\n              <div class=\"space-y-2\">\n                @for (hub of hubs; track hub.city) {\n                  <div\n                    class=\"border-border bg-card/60 flex items-center justify-between rounded-lg border p-3 text-xs shadow-xs\"\n                  >\n                    <div>\n                      <p class=\"text-foreground font-medium\">{{ hub.city }}</p>\n                      <p class=\"text-muted-foreground font-mono text-xs\">{{ hub.tz }} &bull; {{ hub.status }}</p>\n                    </div>\n                    <a [href]=\"'mailto:' + hub.email\" class=\"text-primary font-mono text-xs hover:underline\">\n                      {{ hub.email }}\n                    </a>\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n\n          <!-- Right Column: Interactive Dispatch Form (7 Cols) -->\n          <div class=\"lg:col-span-7\">\n            <div ui-card class=\"border-border bg-card overflow-hidden shadow-sm\">\n              <div ui-card-header class=\"border-border/60 bg-muted/20 border-b 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]=\"MessageSquare\" class=\"text-primary size-4\" />\n                    Dispatch Engineering Request\n                  </h3>\n                  <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                    Direct Dispatch: {{ selectedType() }}\n                  </span>\n                </div>\n                <p ui-card-description class=\"text-xs\">\n                  Provide architectural specifications or questions. Our engineering team responds within guaranteed\n                  SLA.\n                </p>\n              </div>\n\n              <div ui-card-content class=\"p-6\">\n                @if (!sent()) {\n                  <form class=\"space-y-4\" (submit)=\"onFormSubmit($event)\">\n                    <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n                      <div class=\"space-y-1.5\">\n                        <label ui-label for=\"contact-name\" class=\"text-xs font-medium\">Your Name</label>\n                        <ui-input\n                          id=\"contact-name\"\n                          [value]=\"name()\"\n                          (valueChange)=\"name.set($event)\"\n                          placeholder=\"Jane Doe\"\n                          class=\"h-9 text-xs\"\n                        />\n                      </div>\n                      <div class=\"space-y-1.5\">\n                        <label ui-label for=\"contact-email\" class=\"text-xs font-medium\">Work Email</label>\n                        <ui-input\n                          id=\"contact-email\"\n                          [value]=\"email()\"\n                          (valueChange)=\"email.set($event)\"\n                          type=\"email\"\n                          placeholder=\"jane@company.com\"\n                          class=\"h-9 font-mono text-xs\"\n                        />\n                      </div>\n                    </div>\n\n                    <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n                      <div class=\"space-y-1.5\">\n                        <label ui-label for=\"contact-company\" class=\"text-xs font-medium\">Company / Organization</label>\n                        <ui-input\n                          id=\"contact-company\"\n                          [value]=\"company()\"\n                          (valueChange)=\"company.set($event)\"\n                          placeholder=\"Acme Corp\"\n                          class=\"h-9 text-xs\"\n                        />\n                      </div>\n                      <div class=\"space-y-1.5\">\n                        <span class=\"text-xs font-medium\">Engineering Team Size</span>\n                        <div class=\"grid grid-cols-3 gap-1.5\">\n                          @for (ts of teamSizes; track ts) {\n                            <button type=\"button\" [class]=\"teamSizeClass(ts)\" (click)=\"teamSize.set(ts)\">\n                              {{ ts }}\n                            </button>\n                          }\n                        </div>\n                      </div>\n                    </div>\n\n                    <div class=\"space-y-1.5\">\n                      <label ui-label for=\"contact-message\" class=\"text-xs font-medium\"\n                        >Project Scope & Technical Details</label\n                      >\n                      <ui-textarea\n                        id=\"contact-message\"\n                        [value]=\"message()\"\n                        (valueChange)=\"message.set($event)\"\n                        [rows]=\"4\"\n                        placeholder=\"Describe your tech stack (Vue 3, Nuxt 3, React 19, Next.js), design token requirements, and deployment targets...\"\n                        class=\"resize-none text-xs\"\n                      />\n                    </div>\n\n                    <div class=\"flex flex-col items-center justify-between gap-3 pt-2 sm:flex-row\">\n                      <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n                        <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-4\" />\n                        <span>NDA & IP protection pre-guaranteed.</span>\n                      </div>\n\n                      <button\n                        ui-button\n                        type=\"submit\"\n                        [disabled]=\"!canSubmit()\"\n                        class=\"h-9 w-full gap-1.5 px-5 text-xs font-semibold sm:w-auto\"\n                      >\n                        <span>Dispatch Inquiry</span>\n                        <lucide-icon [img]=\"Send\" class=\"size-3.5\" />\n                      </button>\n                    </div>\n                  </form>\n                } @else {\n                  <!-- Success Feedback View -->\n                  <div class=\"space-y-5 px-4 py-8 text-center\">\n                    <div\n                      class=\"bg-success/10 text-success mx-auto flex size-12 items-center justify-center rounded-full\"\n                    >\n                      <lucide-icon [img]=\"Check\" class=\"size-6\" />\n                    </div>\n                    <div class=\"space-y-1\">\n                      <p class=\"text-foreground text-base font-bold\">Inquiry Dispatched Successfully</p>\n                      <p class=\"text-muted-foreground mx-auto max-w-sm text-xs\">\n                        A principal solutions architect has been assigned. You will receive a technical response at\n                        <strong class=\"text-foreground font-mono\">{{ email() }}</strong> within guaranteed SLA.\n                      </p>\n                    </div>\n\n                    <div\n                      class=\"border-border bg-muted/40 mx-auto flex max-w-xs items-center justify-between rounded-lg border p-3\"\n                    >\n                      <div class=\"text-left\">\n                        <p class=\"text-muted-foreground font-mono text-xs uppercase\">Reference Ticket ID</p>\n                        <p class=\"text-foreground font-mono text-xs font-bold\">{{ ticketId() }}</p>\n                      </div>\n                      <button\n                        ui-button\n                        variant=\"outline\"\n                        size=\"sm\"\n                        class=\"h-7 gap-1 font-mono text-xs\"\n                        (click)=\"copyTicket()\"\n                      >\n                        @if (copiedTicket()) {\n                          <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                        } @else {\n                          <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                        }\n                        <span>{{ copiedTicket() ? 'Copied' : 'Copy' }}</span>\n                      </button>\n                    </div>\n\n                    <button\n                      ui-button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      class=\"text-muted-foreground text-xs\"\n                      (click)=\"sent.set(false)\"\n                    >\n                      Send Another Inquiry\n                    </button>\n                  </div>\n                }\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n})\nexport class UiContact01Component {\n  protected readonly Building2 = Building2\n  protected readonly Check = Check\n  protected readonly Copy = Copy\n  protected readonly Headphones = Headphones\n  protected readonly MessageSquare = MessageSquare\n  protected readonly Send = Send\n  protected readonly ShieldCheck = ShieldCheck\n\n  protected readonly inquiryTypes = inquiryTypes\n  protected readonly hubs = globalHubs\n  protected readonly teamSizes = teamSizes\n\n  @Input('class') className?: string\n  @Output() readonly submit = new EventEmitter<ContactSubmitPayload>()\n\n  readonly selectedType = signal('enterprise')\n  readonly name = signal('')\n  readonly email = signal('')\n  readonly company = signal('')\n  readonly teamSize = signal('10-50')\n  readonly message = signal('')\n  readonly sent = signal(false)\n  readonly ticketId = signal('')\n  readonly copiedTicket = signal(false)\n  private copyTimer: ReturnType<typeof setTimeout> | undefined\n\n  readonly canSubmit = computed(() => !!this.name().trim() && !!this.email().trim() && !!this.message().trim())\n\n  get rootClass(): string {\n    return cn('bg-background relative overflow-hidden px-4 py-16 sm:px-6 lg:px-8', this.className)\n  }\n\n  trackCardClass(id: string): string {\n    return cn(\n      'group focus-visible:ring-ring cursor-pointer rounded-xl border p-4 transition-colors focus-visible:ring-2 focus-visible:outline-none',\n      this.selectedType() === id\n        ? 'border-primary bg-primary/5 ring-primary/20 shadow-xs ring-1'\n        : 'border-border bg-card hover:bg-muted/40',\n    )\n  }\n\n  trackIconClass(id: string): string {\n    return cn(\n      'rounded-lg p-2 transition-colors',\n      this.selectedType() === id\n        ? 'bg-primary text-primary-foreground'\n        : 'bg-muted text-foreground group-hover:bg-primary/10 group-hover:text-primary',\n    )\n  }\n\n  teamSizeClass(ts: string): string {\n    return cn(\n      'rounded-md border px-2 py-1.5 text-center font-mono text-xs transition-colors',\n      this.teamSize() === ts\n        ? 'border-primary bg-primary/10 text-primary font-semibold'\n        : 'border-border bg-background text-muted-foreground hover:text-foreground',\n    )\n  }\n\n  onFormSubmit(event: Event): void {\n    event.preventDefault()\n    this.dispatch()\n  }\n\n  dispatch(): ContactSubmitPayload | null {\n    if (!this.canSubmit()) return null\n    const generatedId = `UIP-${Math.floor(1000 + Math.random() * 9000)}`\n    this.ticketId.set(generatedId)\n    this.sent.set(true)\n    const payload: ContactSubmitPayload = {\n      type: this.selectedType(),\n      name: this.name(),\n      email: this.email(),\n      company: this.company(),\n      teamSize: this.teamSize(),\n      message: this.message(),\n      ticketId: generatedId,\n    }\n    this.submit.emit(payload)\n    return payload\n  }\n\n  copyTicket(): void {\n    const id = this.ticketId()\n    if (!id) return\n    try {\n      void navigator.clipboard?.writeText(id)\n    } catch {\n      // Clipboard unavailable (e.g. jsdom) — still flip the label.\n    }\n    this.copiedTicket.set(true)\n    clearTimeout(this.copyTimer)\n    this.copyTimer = setTimeout(() => this.copiedTicket.set(false), 2000)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/contact-01/contact-01.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/contact-01/index.ts",
      "content": "export { UiContact01Component, type InquiryTrack, type ContactSubmitPayload } from './contact-01.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/contact-01/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/label.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/textarea.json"
  ],
  "description": "Interactive enterprise solutions architect dispatch workbench with track selection, live hub timezones, SLA badges, and ticket generator.",
  "categories": [
    "marketing"
  ]
}