{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "onboarding-equipment-provisioning",
  "title": "Onboarding Equipment Provisioning",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/onboarding-equipment-provisioning/onboarding-equipment-provisioning.component.ts",
      "content": "// Enterprise IT hardware, peripherals, and software license provisioning portal for\n// new hires: workstation selection, display/peripheral bundles, security keys, SaaS\n// seats, courier tracking, and a custom hardware order dialog. Port of the Vue/React\n// block 1:1.\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, computed, signal } from '@angular/core'\nimport {\n  Boxes,\n  Calendar,\n  Check,\n  CheckCircle2,\n  Circle,\n  Copy,\n  DollarSign,\n  Download,\n  Laptop,\n  Layers,\n  Lock,\n  LucideAngularModule,\n  Monitor,\n  Plus,\n  Send,\n  ShieldCheck,\n  Truck,\n  X,\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  UiCardFooterComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiCheckboxComponent } from '@/ui/checkbox/checkbox.component'\nimport { UiRadioGroupComponent, UiRadioGroupItemComponent } from '@/ui/radio-group/radio-group.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\n\nexport type WorkstationChoice = 'macbook' | 'thinkpad'\n\nconst WORKSTATION_PRICES: Record<WorkstationChoice, number> = {\n  macbook: 3499,\n  thinkpad: 2850,\n}\n\nexport const softwareLicenses = [\n  {\n    name: 'GitHub Enterprise',\n    tier: 'Copilot Enterprise + CodeQL',\n    seatId: 'GH-ENG-8402',\n    category: 'Engineering',\n    status: 'Provisioned',\n    sso: 'Okta SCIM',\n  },\n  {\n    name: 'Figma Professional',\n    tier: 'Design System Editor + Dev Mode',\n    seatId: 'FG-DS-1940',\n    category: 'Design & UI',\n    status: 'Provisioned',\n    sso: 'Okta SCIM',\n  },\n  {\n    name: '1Password Business',\n    tier: 'Enterprise Vault + Infra Keys',\n    seatId: '1P-CORP-9921',\n    category: 'Security',\n    status: 'Provisioned',\n    sso: 'MDM Enrolled',\n  },\n  {\n    name: 'Slack Pro',\n    tier: 'Enterprise Grid (acme-eng)',\n    seatId: 'SLK-88301',\n    category: 'Comms',\n    status: 'Provisioned',\n    sso: 'SAML 2.0',\n  },\n  {\n    name: 'Datadog APM',\n    tier: 'Staff Observability & Traces',\n    seatId: 'DD-APM-4109',\n    category: 'DevOps',\n    status: 'Provisioned',\n    sso: 'Okta SCIM',\n  },\n  {\n    name: 'JetBrains All Products',\n    tier: 'Ultimate Suite (IntelliJ/CLion/GoLand)',\n    seatId: 'JB-ALL-7740',\n    category: 'Engineering',\n    status: 'Provisioned',\n    sso: 'Corp Pool',\n  },\n]\n\nexport const trackingSteps = [\n  { title: 'Order Approved', date: 'Aug 24, 2026', time: '09:00 AM', completed: true, current: false },\n  { title: 'IT Staged & Imaged', date: 'Aug 25, 2026', time: '02:30 PM', completed: true, current: false },\n  { title: 'Shipped via FedEx', date: 'Aug 26, 2026', time: '06:15 PM', completed: true, current: true },\n  { title: 'Out for Delivery', date: 'Aug 28, 2026', time: 'Est. 08:00 AM', completed: false, current: false },\n  { title: 'Delivered to Home', date: 'Aug 28, 2026', time: 'Est. 10:30 AM', completed: false, current: false },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-onboarding-equipment-provisioning, [ui-onboarding-equipment-provisioning]',\n  standalone: true,\n  // The block renders its own root <div> (and the dialog portals visually): keep the host out of layout.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardFooterComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiCheckboxComponent,\n    UiRadioGroupComponent,\n    UiRadioGroupItemComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <div data-slot=\"onboarding-equipment-provisioning\" [class]=\"rootClass\">\n      <!-- Header Section -->\n      <div class=\"border-border bg-card flex flex-col gap-4 rounded-xl border p-5 shadow-xs sm:p-6\">\n        <div class=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n          <!-- Title & Hire Info -->\n          <div class=\"space-y-1.5\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <span ui-badge variant=\"outline\" class=\"gap-1.5 font-mono text-xs\">\n                <lucide-icon [img]=\"Boxes\" class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n                IT Asset Provisioning\n              </span>\n              <div\n                class=\"border-success/20 bg-success/10 text-success inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium\"\n              >\n                <span class=\"relative flex size-1.5\">\n                  <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                  <span class=\"bg-success relative inline-flex size-1.5 rounded-full\"></span>\n                </span>\n                Hardware Assigned · Shipped via FedEx\n              </div>\n            </div>\n\n            <h1 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n              New Hire Hardware &amp; IT Provisioning\n            </h1>\n\n            <!-- New Hire Metadata Line -->\n            <div class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs sm:text-sm\">\n              <span class=\"text-foreground font-semibold\">Elena Rostova</span>\n              <span class=\"text-muted-foreground hidden sm:inline\">&bull;</span>\n              <span class=\"text-muted-foreground\">Senior Staff Engineer</span>\n              <span class=\"text-muted-foreground hidden sm:inline\">&bull;</span>\n              <span class=\"text-muted-foreground flex items-center gap-1\">\n                <lucide-icon [img]=\"Calendar\" class=\"size-3.5\" aria-hidden=\"true\" />\n                Start Date: <strong class=\"text-foreground font-medium\">Sep 01, 2026</strong>\n              </span>\n              <span class=\"text-muted-foreground hidden sm:inline\">&bull;</span>\n              <button\n                type=\"button\"\n                class=\"hover:bg-muted focus-visible:ring-ring border-border bg-muted/40 text-foreground inline-flex min-h-6 items-center gap-1 rounded border px-1.5 py-0.5 font-mono text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                title=\"Click to copy employee ID\"\n                (click)=\"copyEmployeeId()\"\n              >\n                EMP-88291\n                @if (copiedEmpId()) {\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" aria-hidden=\"true\" />\n                } @else {\n                  <lucide-icon [img]=\"Copy\" class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                }\n              </button>\n            </div>\n          </div>\n\n          <!-- Action Buttons -->\n          <div class=\"flex flex-wrap items-center gap-2 pt-1 lg:pt-0\">\n            <button\n              ui-button\n              aria-label=\"Download attachment\"\n              variant=\"outline\"\n              size=\"sm\"\n              class=\"gap-1.5 text-xs shadow-xs\"\n              (click)=\"handleExportManifest()\"\n            >\n              <lucide-icon [img]=\"Download\" class=\"size-3.5\" aria-hidden=\"true\" />\n              <span>Export Manifest</span>\n            </button>\n\n            <button ui-button size=\"sm\" class=\"gap-1.5 text-xs shadow-xs\" (click)=\"handleOpenCustomOrder()\">\n              <lucide-icon [img]=\"Plus\" class=\"size-3.5\" aria-hidden=\"true\" />\n              <span>Order Custom Hardware</span>\n            </button>\n          </div>\n        </div>\n\n        <!-- Financial & Overview Summary Band -->\n        <ui-separator />\n        <div class=\"grid grid-cols-2 gap-4 pt-1 sm:grid-cols-4\">\n          <div class=\"border-border/60 bg-muted/20 rounded-lg border p-3\">\n            <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n              <lucide-icon [img]=\"DollarSign\" class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n              <span>Total IT Investment</span>\n            </div>\n            <p class=\"text-foreground mt-1 font-mono text-lg font-bold tabular-nums sm:text-xl\">\n              &#36;{{ formatTotal(totalInvestment()) }}\n            </p>\n            <p class=\"text-muted-foreground text-xs\">Total Assigned Value</p>\n          </div>\n\n          <div class=\"border-border/60 bg-muted/20 rounded-lg border p-3\">\n            <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n              <lucide-icon [img]=\"Laptop\" class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n              <span>Primary Workstation</span>\n            </div>\n            <p class=\"text-foreground mt-1 truncate text-xs font-semibold sm:text-sm\">\n              {{ selectedWorkstation() === 'macbook' ? 'MacBook Pro 16\" M3 Max' : 'ThinkPad P1 Gen 6 i9' }}\n            </p>\n            <p class=\"text-muted-foreground font-mono text-xs tabular-nums\">&#36;{{ workstationCost().toFixed(2) }}</p>\n          </div>\n\n          <div class=\"border-border/60 bg-muted/20 rounded-lg border p-3\">\n            <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n              <lucide-icon [img]=\"Layers\" class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n              <span>Cloud SaaS Seats</span>\n            </div>\n            <p class=\"text-foreground mt-1 text-xs font-semibold sm:text-sm\">6 Enterprise Licenses</p>\n            <p class=\"text-success text-xs font-medium\">All Provisioned</p>\n          </div>\n\n          <div class=\"border-border/60 bg-muted/20 rounded-lg border p-3\">\n            <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n              <lucide-icon [img]=\"Truck\" class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n              <span>FedEx Priority</span>\n            </div>\n            <p class=\"text-foreground mt-1 text-xs font-semibold sm:text-sm\">Est. Aug 28, 2026</p>\n            <p class=\"text-muted-foreground font-mono text-xs\">#TRK-8492019</p>\n          </div>\n        </div>\n      </div>\n\n      <!-- 4 IT Provisioning Pillar Cards Grid -->\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n        <!-- Pillar 1: Primary Workstation Selection -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2\">\n                <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                  <lucide-icon [img]=\"Laptop\" class=\"size-4\" aria-hidden=\"true\" />\n                </div>\n                <div>\n                  <h3 ui-card-title class=\"text-base font-semibold\">1. Primary Workstation</h3>\n                  <p ui-card-description>Select standard issue macOS or Linux developer laptop</p>\n                </div>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Pillar 01</span>\n            </div>\n          </div>\n\n          <div ui-card-content class=\"space-y-3\">\n            <ui-radio-group\n              [value]=\"selectedWorkstation()\"\n              (valueChange)=\"selectedWorkstation.set($any($event))\"\n              class=\"grid grid-cols-1 gap-3\"\n            >\n              <!-- Choice A: MacBook Pro 16\" -->\n              <label [class]=\"workstationLabelClass('macbook')\">\n                <div class=\"flex flex-wrap items-start justify-between gap-3\">\n                  <div class=\"flex min-w-0 items-start gap-3\">\n                    <ui-radio-group-item id=\"ws-macbook\" value=\"macbook\" class=\"mt-1\" />\n                    <div class=\"min-w-0 space-y-1\">\n                      <div class=\"flex flex-wrap items-center gap-2\">\n                        <span class=\"text-foreground text-sm font-bold\">\n                          MacBook Pro 16\" (M3 Max · 64GB RAM · 1TB SSD)\n                        </span>\n                        <span ui-badge variant=\"default\" class=\"text-xs\">Selected Spec</span>\n                      </div>\n                      <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                        Apple M3 Max (16-core CPU, 40-core GPU) &bull; 64GB Unified Memory &bull; 1TB Fast NVMe &bull;\n                        Liquid Retina XDR (Space Black)\n                      </p>\n                      <div class=\"flex flex-wrap items-center gap-2 pt-1\">\n                        <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                          <lucide-icon [img]=\"ShieldCheck\" class=\"text-success mr-1 size-3\" aria-hidden=\"true\" />\n                          AppleCare+ Enterprise (3-Year Full Accidental Damage)\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"text-right\">\n                    <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$3,499.00</span>\n                  </div>\n                </div>\n              </label>\n\n              <!-- Choice B: ThinkPad P1 Gen 6 -->\n              <label [class]=\"workstationLabelClass('thinkpad')\">\n                <div class=\"flex flex-wrap items-start justify-between gap-3\">\n                  <div class=\"flex min-w-0 items-start gap-3\">\n                    <ui-radio-group-item id=\"ws-thinkpad\" value=\"thinkpad\" class=\"mt-1\" />\n                    <div class=\"min-w-0 space-y-1\">\n                      <div class=\"flex flex-wrap items-center gap-2\">\n                        <span class=\"text-foreground text-sm font-bold\">\n                          ThinkPad P1 Gen 6 (Intel i9 · 64GB RAM · Ubuntu Linux)\n                        </span>\n                        <span ui-badge variant=\"outline\" class=\"text-xs\">Linux Spec</span>\n                      </div>\n                      <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                        Intel Core i9-13900H &bull; NVIDIA RTX 4080 (12GB) &bull; 64GB DDR5 &bull; 1TB NVMe &bull; 16\"\n                        WQXGA OLED &bull; Ubuntu 24.04 LTS\n                      </p>\n                      <div class=\"flex flex-wrap items-center gap-2 pt-1\">\n                        <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                          <lucide-icon [img]=\"ShieldCheck\" class=\"text-success mr-1 size-3\" aria-hidden=\"true\" />\n                          Lenovo Premier Support (3-Year Next-Day Onsite)\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"text-right\">\n                    <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$2,850.00</span>\n                  </div>\n                </div>\n              </label>\n            </ui-radio-group>\n          </div>\n\n          <div\n            ui-card-footer\n            class=\"border-border/60 bg-muted/20 flex items-center justify-between border-t py-2.5 text-xs\"\n          >\n            <span class=\"text-muted-foreground\">Workstation Subtotal:</span>\n            <span class=\"text-foreground font-mono font-bold tabular-nums\"\n              >&#36;{{ workstationCost().toFixed(2) }}</span\n            >\n          </div>\n        </div>\n\n        <!-- Pillar 2: Display & Peripherals -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2\">\n                <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                  <lucide-icon [img]=\"Monitor\" class=\"size-4\" aria-hidden=\"true\" />\n                </div>\n                <div>\n                  <h3 ui-card-title class=\"text-base font-semibold\">2. Display &amp; Peripherals</h3>\n                  <p ui-card-description>High-resolution retina display and ergonomic peripherals</p>\n                </div>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Pillar 02</span>\n            </div>\n          </div>\n\n          <div ui-card-content class=\"space-y-3\">\n            <div [class]=\"peripheralRowClass(includeDisplay())\">\n              <div class=\"flex items-start gap-3\">\n                <ui-checkbox\n                  id=\"periph-display\"\n                  [checked]=\"includeDisplay()\"\n                  (checkedChange)=\"includeDisplay.set(!!$event)\"\n                  class=\"mt-0.5\"\n                />\n                <div class=\"space-y-0.5\">\n                  <label for=\"periph-display\" class=\"text-foreground cursor-pointer text-sm font-semibold\">\n                    Studio Display 27\" 5K Retina\n                  </label>\n                  <p class=\"text-muted-foreground text-xs\">\n                    5120×2880 Retina &bull; 600 nits &bull; 12MP Center Stage Camera &bull; Studio Mics &bull;\n                    Tilt-adjustable Stand\n                  </p>\n                  <div class=\"pt-1\">\n                    <span ui-badge variant=\"secondary\" class=\"text-xs\">Thunderbolt 3 Host Pass-Through</span>\n                  </div>\n                </div>\n              </div>\n              <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$1,499.00</span>\n            </div>\n\n            <div [class]=\"peripheralRowClass(includeInputBundle())\">\n              <div class=\"flex items-start gap-3\">\n                <ui-checkbox\n                  id=\"periph-inputs\"\n                  [checked]=\"includeInputBundle()\"\n                  (checkedChange)=\"includeInputBundle.set(!!$event)\"\n                  class=\"mt-0.5\"\n                />\n                <div class=\"space-y-0.5\">\n                  <label for=\"periph-inputs\" class=\"text-foreground cursor-pointer text-sm font-semibold\">\n                    Magic Keyboard &amp; Trackpad Bundle\n                  </label>\n                  <p class=\"text-muted-foreground text-xs\">\n                    Touch ID Wireless Keyboard &bull; Force Touch Multi-Touch Glass Trackpad &bull; Space Black finish\n                  </p>\n                  <div class=\"pt-1\">\n                    <span ui-badge variant=\"secondary\" class=\"text-xs\">USB-C Braided Woven Cable</span>\n                  </div>\n                </div>\n              </div>\n              <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$249.00</span>\n            </div>\n\n            <div [class]=\"peripheralRowClass(includeDeskMat())\">\n              <div class=\"flex items-start gap-3\">\n                <ui-checkbox\n                  id=\"periph-mat\"\n                  [checked]=\"includeDeskMat()\"\n                  (checkedChange)=\"includeDeskMat.set(!!$event)\"\n                  class=\"mt-0.5\"\n                />\n                <div class=\"space-y-0.5\">\n                  <label for=\"periph-mat\" class=\"text-foreground cursor-pointer text-sm font-semibold\">\n                    Ergonomic Standing Desk Mat\n                  </label>\n                  <p class=\"text-muted-foreground text-xs\">\n                    24\" × 36\" Anti-fatigue high-density polyurethane core &bull; Contoured active standing terrain\n                  </p>\n                </div>\n              </div>\n              <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$49.00</span>\n            </div>\n          </div>\n\n          <div\n            ui-card-footer\n            class=\"border-border/60 bg-muted/20 flex items-center justify-between border-t py-2.5 text-xs\"\n          >\n            <span class=\"text-muted-foreground\">Peripherals Subtotal:</span>\n            <span class=\"text-foreground font-mono font-bold tabular-nums\"\n              >&#36;{{ peripheralsTotal().toFixed(2) }}</span\n            >\n          </div>\n        </div>\n\n        <!-- Pillar 3: Security & Authentication Hardware -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2\">\n                <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                  <lucide-icon [img]=\"ShieldCheck\" class=\"size-4\" aria-hidden=\"true\" />\n                </div>\n                <div>\n                  <h3 ui-card-title class=\"text-base font-semibold\">3. Security &amp; Authentication Hardware</h3>\n                  <p ui-card-description>Zero-trust physical tokens and cryptographic hardware keys</p>\n                </div>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Pillar 03</span>\n            </div>\n          </div>\n\n          <div ui-card-content class=\"space-y-3\">\n            <div [class]=\"peripheralRowClass(includeYubikey())\">\n              <div class=\"flex items-start gap-3\">\n                <ui-checkbox\n                  id=\"sec-yubikey\"\n                  [checked]=\"includeYubikey()\"\n                  (checkedChange)=\"includeYubikey.set(!!$event)\"\n                  class=\"mt-0.5\"\n                />\n                <div class=\"space-y-0.5\">\n                  <div class=\"flex flex-wrap items-center gap-2\">\n                    <label for=\"sec-yubikey\" class=\"text-foreground cursor-pointer text-sm font-semibold\">\n                      YubiKey 5C NFC (2-Pack · Primary &amp; Backup)\n                    </label>\n                    <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">FIDO2 / WebAuthn</span>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs\">\n                    Dual-key pair for primary keychain and secure home backup &bull; USB-C &bull; Contactless NFC &bull;\n                    IP68 water resistant\n                  </p>\n                  <p class=\"text-muted-foreground pt-0.5 font-mono text-xs\">\n                    Pre-enrolled Serials: <span class=\"text-foreground font-medium\">#YB-90281-A / #YB-90281-B</span>\n                  </p>\n                </div>\n              </div>\n              <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$75.00</span>\n            </div>\n\n            <div [class]=\"peripheralRowClass(includeHardwareToken())\">\n              <div class=\"flex items-start gap-3\">\n                <ui-checkbox\n                  id=\"sec-token\"\n                  [checked]=\"includeHardwareToken()\"\n                  (checkedChange)=\"includeHardwareToken.set(!!$event)\"\n                  class=\"mt-0.5\"\n                />\n                <div class=\"space-y-0.5\">\n                  <div class=\"flex flex-wrap items-center gap-2\">\n                    <label for=\"sec-token\" class=\"text-foreground cursor-pointer text-sm font-semibold\">\n                      Encrypted Hardware Token\n                    </label>\n                    <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">FIPS 140-3 Level 3</span>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs\">\n                    AES-256 hardware cryptographic security token with PIN pad &bull; Corporate Root CA Certificate\n                    pre-loaded\n                  </p>\n                  <p class=\"text-muted-foreground pt-0.5 font-mono text-xs\">\n                    Device Serial: <span class=\"text-foreground font-medium\">#ET-78392-X</span>\n                  </p>\n                </div>\n              </div>\n              <span class=\"text-foreground font-mono text-sm font-bold tabular-nums\">$49.00</span>\n            </div>\n\n            <div\n              class=\"border-border/60 bg-muted/20 flex items-center justify-between rounded-lg border px-3 py-2 text-xs\"\n            >\n              <div class=\"text-muted-foreground flex items-center gap-1.5\">\n                <lucide-icon [img]=\"Lock\" class=\"text-success size-3.5\" aria-hidden=\"true\" />\n                <span>SOC 2 Type II &amp; FedRAMP High compliant hardware assignment</span>\n              </div>\n              <span class=\"text-success font-medium\">Enforced</span>\n            </div>\n          </div>\n\n          <div\n            ui-card-footer\n            class=\"border-border/60 bg-muted/20 flex items-center justify-between border-t py-2.5 text-xs\"\n          >\n            <span class=\"text-muted-foreground\">Security Hardware Subtotal:</span>\n            <span class=\"text-foreground font-mono font-bold tabular-nums\">&#36;{{ securityTotal().toFixed(2) }}</span>\n          </div>\n        </div>\n\n        <!-- Pillar 4: Cloud Software & License Seats -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2\">\n                <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                  <lucide-icon [img]=\"Layers\" class=\"size-4\" aria-hidden=\"true\" />\n                </div>\n                <div>\n                  <h3 ui-card-title class=\"text-base font-semibold\">4. Cloud Software &amp; License Seats</h3>\n                  <p ui-card-description>6 assigned SaaS enterprise licenses auto-synced via Okta</p>\n                </div>\n              </div>\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Pillar 04</span>\n            </div>\n          </div>\n\n          <div ui-card-content>\n            <div class=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n              @for (license of licenses; track license.name) {\n                <div class=\"border-border bg-card flex flex-col justify-between rounded-lg border p-3 shadow-xs\">\n                  <div class=\"space-y-1\">\n                    <div class=\"flex items-start justify-between gap-1.5\">\n                      <span class=\"text-foreground text-xs font-bold\">{{ license.name }}</span>\n                      <div\n                        class=\"border-success/20 bg-success/10 text-success inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-xs font-medium\"\n                      >\n                        <lucide-icon [img]=\"Check\" class=\"size-3\" aria-hidden=\"true\" />\n                        <span>{{ license.status }}</span>\n                      </div>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs leading-tight\">{{ license.tier }}</p>\n                  </div>\n\n                  <div class=\"border-border/60 mt-2 flex items-center justify-between border-t pt-1.5 text-xs\">\n                    <span class=\"text-muted-foreground font-mono text-xs\">{{ license.seatId }}</span>\n                    <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">{{ license.sso }}</span>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n\n          <div\n            ui-card-footer\n            class=\"border-border/60 bg-muted/20 flex items-center justify-between border-t py-2.5 text-xs\"\n          >\n            <span class=\"text-muted-foreground\">Software Licensing Cost:</span>\n            <span class=\"text-foreground font-mono font-bold tabular-nums\">Enterprise Corp Pool ($0.00 Direct)</span>\n          </div>\n        </div>\n      </div>\n\n      <!-- Shipping & Delivery Tracking Card -->\n      <div ui-card class=\"border shadow-xs\">\n        <div ui-card-header class=\"pb-3\">\n          <div class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n            <div class=\"flex items-center gap-2\">\n              <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                <lucide-icon [img]=\"Truck\" class=\"size-4\" aria-hidden=\"true\" />\n              </div>\n              <div>\n                <h3 ui-card-title class=\"text-base font-semibold\">Shipping &amp; Delivery Tracking</h3>\n                <p ui-card-description>Direct-to-home courier transit with signature required on delivery</p>\n              </div>\n            </div>\n            <div class=\"flex items-center gap-2\">\n              <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Carrier: FedEx Priority</span>\n              <button\n                type=\"button\"\n                class=\"hover:bg-muted focus-visible:ring-ring border-border bg-muted/40 text-foreground inline-flex min-h-6 items-center gap-1.5 rounded border px-2 py-1 font-mono text-xs font-semibold transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                title=\"Click to copy tracking number\"\n                (click)=\"copyTrackingNumber()\"\n              >\n                #TRK-8492019\n                @if (copiedTracking()) {\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" aria-hidden=\"true\" />\n                } @else {\n                  <lucide-icon [img]=\"Copy\" class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                }\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card-content class=\"space-y-6\">\n          <!-- Address & Courier Info Banner -->\n          <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n            <div class=\"border-border bg-muted/20 space-y-1 rounded-lg border p-3.5\">\n              <span class=\"text-muted-foreground font-mono text-xs font-semibold tracking-wider uppercase\">\n                Shipment Recipient\n              </span>\n              <p class=\"text-foreground text-sm font-bold\">Elena Rostova</p>\n              <p class=\"text-muted-foreground text-xs\">Senior Staff Engineer &bull; Distributed Systems</p>\n              <p class=\"text-muted-foreground text-xs\">elena.rostova&#64;acme.corp</p>\n            </div>\n\n            <div class=\"border-border bg-muted/20 space-y-1 rounded-lg border p-3.5\">\n              <span class=\"text-muted-foreground font-mono text-xs font-semibold tracking-wider uppercase\">\n                Destination Address\n              </span>\n              <p class=\"text-foreground text-sm font-bold\">4820 Grand Avenue, Apt 14B</p>\n              <p class=\"text-muted-foreground text-xs\">Seattle, WA 98101-2294</p>\n              <p class=\"text-muted-foreground text-xs\">Direct In-Person Signature Required</p>\n            </div>\n\n            <div class=\"border-border bg-muted/20 space-y-1 rounded-lg border p-3.5 sm:col-span-2 lg:col-span-1\">\n              <span class=\"text-muted-foreground font-mono text-xs font-semibold tracking-wider uppercase\">\n                Estimated Delivery\n              </span>\n              <p class=\"text-foreground text-sm font-bold\">Thursday, Aug 28, 2026</p>\n              <p class=\"text-success text-xs font-medium\">Estimated by 10:30 AM (Morning Delivery)</p>\n              <p class=\"text-muted-foreground text-xs\">FedEx Express Priority Overnight</p>\n            </div>\n          </div>\n\n          <!-- 5-Step Progress Stepper -->\n          <div class=\"space-y-2 pt-2\">\n            <span class=\"text-muted-foreground font-mono text-xs font-semibold tracking-wider uppercase\">\n              Logistics Timeline Status\n            </span>\n            <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-5\">\n              @for (step of steps; track step.title; let idx = $index) {\n                <div [class]=\"stepCardClass(step)\">\n                  <div class=\"flex items-center justify-between gap-2\">\n                    <span class=\"text-muted-foreground font-mono text-xs\">0{{ idx + 1 }}</span>\n                    @if (step.completed && !step.current) {\n                      <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-4\" aria-hidden=\"true\" />\n                    } @else if (step.current) {\n                      <span class=\"relative flex size-2\">\n                        <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                        <span class=\"bg-success relative inline-flex size-2 rounded-full\"></span>\n                      </span>\n                    } @else {\n                      <lucide-icon [img]=\"Circle\" class=\"text-muted-foreground/50 size-3.5\" aria-hidden=\"true\" />\n                    }\n                  </div>\n\n                  <div class=\"mt-2 space-y-0.5\">\n                    <p [class]=\"stepTitleClass(step)\">{{ step.title }}</p>\n                    <p class=\"text-muted-foreground font-mono text-xs\">{{ step.date }}</p>\n                    <p class=\"text-muted-foreground text-xs\">{{ step.time }}</p>\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Custom Hardware Order Modal Dialog -->\n      @if (showCustomOrderModal()) {\n        <div\n          class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-xs\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-labelledby=\"custom-hardware-title\"\n        >\n          <div\n            class=\"border-border bg-card animate-in fade-in zoom-in-95 w-full max-w-lg space-y-4 rounded-xl border p-6 shadow-xl\"\n          >\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2\">\n                <div class=\"bg-primary/10 text-primary rounded-lg p-2\">\n                  <lucide-icon [img]=\"Laptop\" class=\"size-4\" aria-hidden=\"true\" />\n                </div>\n                <div>\n                  <h2 id=\"custom-hardware-title\" class=\"text-foreground text-base font-bold\">Order Custom Hardware</h2>\n                  <p class=\"text-muted-foreground text-xs\">\n                    Request specialized hardware or accessories for Elena Rostova\n                  </p>\n                </div>\n              </div>\n              <button\n                ui-button\n                variant=\"ghost\"\n                size=\"icon\"\n                class=\"size-8\"\n                aria-label=\"Close dialog\"\n                (click)=\"handleCloseCustomOrder()\"\n              >\n                <lucide-icon [img]=\"X\" class=\"size-4\" aria-hidden=\"true\" />\n              </button>\n            </div>\n\n            <ui-separator />\n\n            @if (!customRequestSubmitted()) {\n              <div class=\"space-y-4\">\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-semibold\">Equipment / Item Name</label>\n                  <input\n                    [value]=\"customItemName()\"\n                    (input)=\"customItemName.set($any($event.target).value)\"\n                    type=\"text\"\n                    placeholder=\"e.g. Ergonomic Split Mechanical Keyboard, 4K Webcam, eGPU\"\n                    class=\"border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 w-full rounded-md border px-3 py-2 text-xs shadow-xs outline-none focus-visible:ring-[3px]\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-semibold\">Business Justification</label>\n                  <textarea\n                    [value]=\"customItemJustification()\"\n                    (input)=\"customItemJustification.set($any($event.target).value)\"\n                    rows=\"3\"\n                    placeholder=\"Provide engineering justification or project requirements...\"\n                    class=\"border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 w-full resize-none rounded-md border px-3 py-2 text-xs shadow-xs outline-none focus-visible:ring-[3px]\"\n                  ></textarea>\n                </div>\n\n                <div class=\"border-border bg-muted/20 text-muted-foreground rounded-lg border p-3 text-xs\">\n                  <p>\n                    Custom requests are automatically routed to Engineering Management &amp; IT Procurement for budget\n                    sign-off.\n                  </p>\n                </div>\n\n                <div class=\"flex items-center justify-end gap-2 pt-2\">\n                  <button\n                    ui-button\n                    aria-label=\"Close dialog\"\n                    variant=\"outline\"\n                    size=\"sm\"\n                    class=\"text-xs\"\n                    (click)=\"handleCloseCustomOrder()\"\n                  >\n                    Cancel\n                  </button>\n                  <button\n                    ui-button\n                    size=\"sm\"\n                    class=\"gap-1.5 text-xs\"\n                    [disabled]=\"!customItemName().trim()\"\n                    (click)=\"submitCustomRequest()\"\n                  >\n                    <lucide-icon [img]=\"Send\" class=\"size-3.5\" aria-hidden=\"true\" />\n                    <span>Submit Request</span>\n                  </button>\n                </div>\n              </div>\n            } @else {\n              <div class=\"space-y-3 py-4 text-center\">\n                <div class=\"bg-success/10 text-success mx-auto flex size-12 items-center justify-center rounded-full\">\n                  <lucide-icon [img]=\"CheckCircle2\" class=\"size-6\" aria-hidden=\"true\" />\n                </div>\n                <h3 class=\"text-foreground text-sm font-bold\">Custom Hardware Request Submitted</h3>\n                <p class=\"text-muted-foreground text-xs\">\n                  Request for <strong class=\"text-foreground\">{{ customItemName() }}</strong> has been forwarded to IT\n                  Procurement.\n                </p>\n              </div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class UiOnboardingEquipmentProvisioningComponent {\n  protected readonly Boxes = Boxes\n  protected readonly Calendar = Calendar\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Circle = Circle\n  protected readonly Copy = Copy\n  protected readonly DollarSign = DollarSign\n  protected readonly Download = Download\n  protected readonly Laptop = Laptop\n  protected readonly Layers = Layers\n  protected readonly Lock = Lock\n  protected readonly Monitor = Monitor\n  protected readonly Plus = Plus\n  protected readonly Send = Send\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Truck = Truck\n  protected readonly X = X\n\n  protected readonly licenses = softwareLicenses\n  protected readonly steps = trackingSteps\n\n  @Input() set initialWorkstation(v: WorkstationChoice) {\n    this.selectedWorkstation.set(v ?? 'macbook')\n  }\n  @Input('class') className?: string\n  /** Fired when the custom-hardware dialog opens (React `onOrderCustom`, Vue `order-custom`). */\n  @Output() readonly orderCustom = new EventEmitter<void>()\n  /** Fired when Export Manifest is clicked (React `onExportManifest`, Vue `export-manifest`). */\n  @Output() readonly exportManifest = new EventEmitter<void>()\n\n  readonly selectedWorkstation = signal<WorkstationChoice>('macbook')\n  readonly includeDisplay = signal(true)\n  readonly includeInputBundle = signal(true)\n  readonly includeDeskMat = signal(true)\n  readonly includeYubikey = signal(true)\n  readonly includeHardwareToken = signal(true)\n\n  readonly copiedTracking = signal(false)\n  readonly copiedEmpId = signal(false)\n  readonly showCustomOrderModal = signal(false)\n  readonly customRequestSubmitted = signal(false)\n  readonly customItemName = signal('')\n  readonly customItemJustification = signal('')\n\n  readonly workstationCost = computed(() => WORKSTATION_PRICES[this.selectedWorkstation()])\n  readonly displayCost = computed(() => (this.includeDisplay() ? 1499 : 0))\n  readonly inputBundleCost = computed(() => (this.includeInputBundle() ? 249 : 0))\n  readonly deskMatCost = computed(() => (this.includeDeskMat() ? 49 : 0))\n  readonly yubikeyCost = computed(() => (this.includeYubikey() ? 75 : 0))\n  readonly hardwareTokenCost = computed(() => (this.includeHardwareToken() ? 49 : 0))\n\n  readonly peripheralsTotal = computed(() => this.displayCost() + this.inputBundleCost() + this.deskMatCost())\n  readonly securityTotal = computed(() => this.yubikeyCost() + this.hardwareTokenCost())\n  readonly totalInvestment = computed(() => this.workstationCost() + this.peripheralsTotal() + this.securityTotal())\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  workstationLabelClass(choice: WorkstationChoice): string {\n    return cn(\n      'relative flex cursor-pointer flex-col justify-between rounded-lg border p-4 transition-colors',\n      this.selectedWorkstation() === choice\n        ? 'border-primary bg-primary/5 ring-primary shadow-xs ring-1'\n        : 'border-border bg-card hover:bg-muted/40',\n    )\n  }\n\n  peripheralRowClass(included: boolean): string {\n    return cn(\n      'border-border flex flex-wrap items-start justify-between gap-3 rounded-lg border p-3.5 transition-colors',\n      included ? 'bg-card' : 'bg-muted/30 opacity-70',\n    )\n  }\n\n  stepCardClass(step: { completed: boolean; current: boolean }): string {\n    return cn(\n      'border-border flex flex-col justify-between rounded-lg border p-3 transition-colors',\n      step.current\n        ? 'border-success/40 bg-success/10 ring-success/30 ring-1'\n        : step.completed\n          ? 'bg-card'\n          : 'bg-muted/20 opacity-60',\n    )\n  }\n\n  stepTitleClass(step: { completed: boolean; current: boolean }): string {\n    return cn(\n      'text-xs font-bold',\n      step.current ? 'text-success font-bold' : step.completed ? 'text-foreground' : 'text-muted-foreground',\n    )\n  }\n\n  formatTotal(val: number): string {\n    return val.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n  }\n\n  copyTrackingNumber(): void {\n    const nav = typeof navigator !== 'undefined' ? navigator : undefined\n    if (nav?.clipboard) {\n      void nav.clipboard.writeText('TRK-8492019')\n      this.copiedTracking.set(true)\n      setTimeout(() => this.copiedTracking.set(false), 2000)\n    }\n  }\n\n  copyEmployeeId(): void {\n    const nav = typeof navigator !== 'undefined' ? navigator : undefined\n    if (nav?.clipboard) {\n      void nav.clipboard.writeText('EMP-88291')\n      this.copiedEmpId.set(true)\n      setTimeout(() => this.copiedEmpId.set(false), 2000)\n    }\n  }\n\n  handleExportManifest(): void {\n    this.exportManifest.emit()\n  }\n\n  handleOpenCustomOrder(): void {\n    this.showCustomOrderModal.set(true)\n    this.orderCustom.emit()\n  }\n\n  handleCloseCustomOrder(): void {\n    this.showCustomOrderModal.set(false)\n    this.customRequestSubmitted.set(false)\n    this.customItemName.set('')\n    this.customItemJustification.set('')\n  }\n\n  submitCustomRequest(): void {\n    if (this.customItemName().trim()) {\n      this.customRequestSubmitted.set(true)\n      setTimeout(() => this.handleCloseCustomOrder(), 2000)\n    }\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/onboarding-equipment-provisioning/onboarding-equipment-provisioning.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/onboarding-equipment-provisioning/index.ts",
      "content": "export {\n  UiOnboardingEquipmentProvisioningComponent,\n  type WorkstationChoice,\n  softwareLicenses,\n  trackingSteps,\n} from './onboarding-equipment-provisioning.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/onboarding-equipment-provisioning/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/checkbox.json",
    "https://uipkge.dev/r/angular/radio-group.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Enterprise IT hardware, peripherals, and software license provisioning portal for new hires with primary workstation selection, display and peripheral bundles, security keys, cloud SaaS seats, and courier tracking.",
  "categories": [
    "hr",
    "app"
  ]
}