{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "benefits-enrollment-portal",
  "title": "Benefits Enrollment Portal",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-angular/blocks/benefits-enrollment-portal/benefits-enrollment-portal.component.ts",
      "content": "// Employee benefits open enrollment portal with interactive medical, dental, and vision\n// plan comparisons, customizable 401(k) contribution slider with real-time employer match\n// calculation, and a sticky paycheck impact summary. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, OnInit, computed, signal } from '@angular/core'\nimport {\n  AlertCircle,\n  Check,\n  CheckCircle2,\n  Clock,\n  Download,\n  Eye,\n  FileCheck,\n  FileSignature,\n  HeartPulse,\n  LucideAngularModule,\n  Percent,\n  PiggyBank,\n  RefreshCw,\n  ShieldCheck,\n  User,\n  Users,\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 { UiRadioGroupComponent, UiRadioGroupItemComponent } from '@/ui/radio-group/radio-group.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { UiSliderComponent } from '@/ui/slider/slider.component'\n\nexport interface MedicalPlan {\n  id: string\n  name: string\n  carrier: string\n  badge?: string\n  badgeVariant?: 'default' | 'secondary' | 'outline'\n  employeeCostPerPaycheck: number\n  employerCostPerMonth: number\n  deductible: string\n  outOfPocketMax: string\n  copayOrCoinsurance: string\n  hsaSeed: number\n  description: string\n  highlights: string[]\n}\n\nconst MEDICAL_PLANS: MedicalPlan[] = [\n  {\n    id: 'medical-ppo-hsa',\n    name: 'BlueCross PPO High Deductible + HSA',\n    carrier: 'BlueCross BlueShield',\n    badge: 'Popular · HSA Eligible',\n    badgeVariant: 'secondary',\n    employeeCostPerPaycheck: 85,\n    employerCostPerMonth: 450,\n    deductible: '$1,600 ind / $3,200 fam',\n    outOfPocketMax: '$4,000 ind / $8,000 fam',\n    copayOrCoinsurance: '10% after deductible',\n    hsaSeed: 500,\n    description: 'Triple tax-advantaged health savings account with an employer-funded annual HSA contribution.',\n    highlights: [\n      '$500 annual employer HSA contribution funded on Jan 1',\n      '100% preventive care covered in-network with $0 deductible',\n      'Flexible nationwide PPO specialist access without referrals',\n    ],\n  },\n  {\n    id: 'medical-gold-ppo',\n    name: 'BlueCross Gold Premier PPO',\n    carrier: 'BlueCross BlueShield',\n    badge: 'Low $250 Deductible',\n    badgeVariant: 'outline',\n    employeeCostPerPaycheck: 180,\n    employerCostPerMonth: 520,\n    deductible: '$250 ind / $500 fam',\n    outOfPocketMax: '$2,500 ind / $5,000 fam',\n    copayOrCoinsurance: '$20 Primary / $40 Specialist',\n    hsaSeed: 0,\n    description: 'Predictable low-copay coverage designed for frequent medical care, prescriptions, and peace of mind.',\n    highlights: [\n      'Ultra-low $250 individual deductible for comprehensive care',\n      '$20 primary care & $40 specialist fixed office visit copays',\n      'Tier 1 generic prescriptions covered at $10 copay',\n    ],\n  },\n  {\n    id: 'medical-kaiser-hmo',\n    name: 'Kaiser Permanente HMO',\n    carrier: 'Kaiser Permanente',\n    badge: '$0 Deductible',\n    badgeVariant: 'outline',\n    employeeCostPerPaycheck: 40,\n    employerCostPerMonth: 420,\n    deductible: '$0 ind / $0 fam',\n    outOfPocketMax: '$1,500 ind / $3,000 fam',\n    copayOrCoinsurance: '$15 Primary / $25 Specialist',\n    hsaSeed: 0,\n    description: 'Integrated in-network HMO coverage with zero deductible and lowest payroll deduction.',\n    highlights: [\n      '$0 deductible with everything under one roof at Kaiser centers',\n      '$15 copay for routine medical and virtual telehealth visits',\n      'Lowest bi-weekly payroll deduction across all medical tiers',\n    ],\n  },\n]\n\nexport interface DentalPlan {\n  id: string\n  name: string\n  carrier: string\n  badge?: string\n  badgeVariant?: 'default' | 'secondary' | 'outline'\n  employeeCostPerPaycheck: number\n  employerCostPerMonth: number\n  annualMax: string\n  preventive: string\n  basic: string\n  majorOrOrtho: string\n  description: string\n}\n\nconst DENTAL_PLANS: DentalPlan[] = [\n  {\n    id: 'dental-comprehensive',\n    name: 'Delta Dental Premier Comprehensive',\n    carrier: 'Delta Dental',\n    badge: 'Comprehensive · Ortho Included',\n    badgeVariant: 'secondary',\n    employeeCostPerPaycheck: 14,\n    employerCostPerMonth: 35,\n    annualMax: '$2,000 / member / yr',\n    preventive: '100% (2 cleanings & exams / yr)',\n    basic: '80% coverage (fillings & endodontics)',\n    majorOrOrtho: '50% coverage ($1,500 lifetime ortho)',\n    description: 'Complete coverage for preventative cleanings, major restorative procedures, and orthodontic care.',\n  },\n  {\n    id: 'dental-basic',\n    name: 'Delta Dental Basic',\n    carrier: 'Delta Dental',\n    badge: 'Basic Preventive',\n    badgeVariant: 'outline',\n    employeeCostPerPaycheck: 5,\n    employerCostPerMonth: 20,\n    annualMax: '$1,000 / member / yr',\n    preventive: '100% (2 cleanings / yr)',\n    basic: '50% coverage',\n    majorOrOrtho: 'Not covered',\n    description: 'Essential preventive dental care for routine bi-annual cleanings, exams, and basic cavity fillings.',\n  },\n  {\n    id: 'dental-waive',\n    name: 'Waive Dental Coverage',\n    carrier: 'Decline',\n    employeeCostPerPaycheck: 0,\n    employerCostPerMonth: 0,\n    annualMax: '$0',\n    preventive: 'None',\n    basic: 'None',\n    majorOrOrtho: 'None',\n    description: 'Decline dental insurance coverage for the 2026-2027 plan year.',\n  },\n]\n\nexport interface VisionPlan {\n  id: string\n  name: string\n  carrier: string\n  badge?: string\n  badgeVariant?: 'default' | 'secondary' | 'outline'\n  employeeCostPerPaycheck: number\n  employerCostPerMonth: number\n  examCopay: string\n  frameAllowance: string\n  lenses: string\n  description: string\n}\n\nconst VISION_PLANS: VisionPlan[] = [\n  {\n    id: 'vision-choice-plus',\n    name: 'VSP Vision Choice Plus',\n    carrier: 'VSP Vision Care',\n    badge: '$200 Frame Allowance',\n    badgeVariant: 'secondary',\n    employeeCostPerPaycheck: 8,\n    employerCostPerMonth: 12,\n    examCopay: '$10 copay (every 12 mo)',\n    frameAllowance: '$200 allowance + 20% off overage',\n    lenses: 'Progressives & anti-glare covered in full',\n    description: 'Premium vision coverage with generous designer frame allowances and full progressive lens coverage.',\n  },\n  {\n    id: 'vision-standard',\n    name: 'VSP Standard Vision',\n    carrier: 'VSP Vision Care',\n    badge: 'Standard',\n    badgeVariant: 'outline',\n    employeeCostPerPaycheck: 3,\n    employerCostPerMonth: 8,\n    examCopay: '$15 copay (every 12 mo)',\n    frameAllowance: '$120 frame allowance',\n    lenses: 'Standard single-vision lenses covered',\n    description: 'Core vision benefit for annual eye exams and standard prescription glasses.',\n  },\n  {\n    id: 'vision-waive',\n    name: 'Waive Vision Coverage',\n    carrier: 'Decline',\n    employeeCostPerPaycheck: 0,\n    employerCostPerMonth: 0,\n    examCopay: '$0',\n    frameAllowance: '$0',\n    lenses: 'None',\n    description: 'Decline vision insurance coverage for the 2026-2027 plan year.',\n  },\n]\n\nconst SLIDER_MARKS: Record<number, string> = {\n  1: '1%',\n  4: '4%',\n  6: '6% (Max Match)',\n  10: '10%',\n  15: '15%',\n  20: '20%',\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-benefits-enrollment-portal, [ui-benefits-enrollment-portal]',\n  standalone: true,\n  // React renders the root <div> 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    UiCardFooterComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiRadioGroupComponent,\n    UiRadioGroupItemComponent,\n    UiSeparatorComponent,\n    UiSliderComponent,\n  ],\n  template: `\n    <div data-slot=\"benefits-enrollment-portal\" [class]=\"rootClass\">\n      <!-- Header Banner -->\n      <div class=\"border-border bg-card relative overflow-hidden rounded-xl border p-6 shadow-xs\">\n        <div class=\"flex flex-col gap-5 lg:flex-row lg:items-center lg:justify-between\">\n          <div class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-center gap-2.5\">\n              <span\n                ui-badge\n                wrap\n                variant=\"outline\"\n                class=\"border-warning/30 bg-warning/10 text-warning max-w-full gap-1.5 px-3 py-1 text-left text-xs font-semibold\"\n              >\n                <lucide-icon [img]=\"Clock\" class=\"size-3.5\" />\n                Open Enrollment Period Ends {{ deadlineDate }} · {{ daysRemaining }} Days Left\n              </span>\n              @if (isSubmitted()) {\n                <span\n                  ui-badge\n                  variant=\"secondary\"\n                  class=\"border-success/30 bg-success/10 text-success gap-1 text-xs font-semibold\"\n                >\n                  <lucide-icon [img]=\"CheckCircle2\" class=\"size-3.5\" />\n                  Elections Submitted &amp; Signed\n                </span>\n              }\n            </div>\n\n            <div>\n              <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">\n                Annual Benefits Open Enrollment\n              </h1>\n              <p class=\"text-muted-foreground mt-1 text-sm sm:text-base\">\n                Select your health coverage, retirement matching, and ancillary wellness plans for the 2026-2027 plan\n                year.\n              </p>\n            </div>\n\n            <!-- Employee metadata strip -->\n            <div\n              class=\"border-border/60 bg-muted/40 text-muted-foreground mt-3 inline-flex flex-wrap items-center gap-x-4 gap-y-1.5 rounded-lg border px-3.5 py-2 text-xs\"\n            >\n              <div class=\"text-foreground flex items-center gap-1.5 font-medium\">\n                <lucide-icon [img]=\"User\" class=\"text-primary size-3.5\" />\n                <span>{{ employeeName }}</span>\n              </div>\n              <div class=\"flex items-center gap-1.5\">\n                <lucide-icon [img]=\"Users\" class=\"size-3.5\" />\n                <span\n                  >Tier: <strong class=\"text-foreground font-medium\">{{ coverageTier }}</strong></span\n                >\n              </div>\n              <div>\n                <span\n                  >ID: <strong class=\"text-foreground font-mono font-medium\">{{ employeeId }}</strong></span\n                >\n              </div>\n              <div>\n                <span\n                  >Base:\n                  <strong class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ annualSalary.toLocaleString('en-US') }}/yr</strong\n                  ></span\n                >\n              </div>\n            </div>\n          </div>\n\n          <div class=\"flex flex-col gap-2.5 sm:flex-row lg:flex-col lg:items-end\">\n            @if (!isSubmitted()) {\n              <button ui-button size=\"lg\" class=\"gap-2 font-semibold shadow-xs\" (click)=\"showSignModal.set(true)\">\n                <lucide-icon [img]=\"FileSignature\" class=\"size-4\" />\n                Save Selections &amp; Sign\n              </button>\n            } @else {\n              <button\n                ui-button\n                variant=\"outline\"\n                size=\"lg\"\n                class=\"border-success/40 bg-success/5 text-success hover:bg-success/10 gap-2 font-semibold\"\n                (click)=\"handleResetEnrollment()\"\n              >\n                <lucide-icon [img]=\"RefreshCw\" class=\"size-4\" />\n                Modify My Elections\n              </button>\n            }\n\n            <p class=\"text-muted-foreground text-xs lg:text-right\">\n              Changes take effect <span class=\"text-foreground font-medium\">October 1, 2026</span>\n            </p>\n          </div>\n        </div>\n      </div>\n\n      <!-- Submitted Banner (If Confirmed) -->\n      @if (isSubmitted()) {\n        <div\n          class=\"border-success/30 bg-success/10 text-foreground flex flex-col items-start justify-between gap-4 rounded-xl border p-4 sm:flex-row sm:items-center\"\n        >\n          <div class=\"flex flex-wrap items-start gap-3\">\n            <div\n              class=\"border-success/30 bg-success/20 text-success mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n            >\n              <lucide-icon [img]=\"Check\" class=\"size-4\" />\n            </div>\n            <div>\n              <p class=\"text-foreground text-sm font-semibold\">\n                Enrollment Signed &amp; Confirmed for Plan Year 2026-2027\n              </p>\n              <p class=\"text-muted-foreground mt-0.5 text-xs\">\n                Confirmation Reference: <span class=\"text-foreground font-mono font-medium\">#BEN-2026-89241</span> ·\n                Signed by {{ employeeName }} on August 21, 2026.\n              </p>\n            </div>\n          </div>\n          <button ui-button aria-label=\"Download attachment\" variant=\"outline\" size=\"sm\" class=\"gap-1.5 text-xs\">\n            <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n            Download Summary PDF\n          </button>\n        </div>\n      }\n\n      <!-- Main 2-Column Grid: Plan Options (Col 8) + Sticky Paycheck Impact (Col 4) -->\n      <div class=\"grid grid-cols-1 gap-8 lg:grid-cols-12 lg:items-start\">\n        <!-- Plan Selection Flow -->\n        <div class=\"space-y-8 lg:col-span-8\">\n          <!-- Category 1: Medical Health Plan -->\n          <div ui-card class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex flex-wrap items-center justify-between gap-3 sm:flex-nowrap\">\n                <div class=\"flex items-center gap-2.5\">\n                  <div\n                    class=\"border-primary/20 bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n                  >\n                    <lucide-icon [img]=\"HeartPulse\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 ui-card-title class=\"text-base sm:text-lg\">1. Medical Health Plan</h3>\n                    <p ui-card-description>\n                      Comprehensive inpatient, outpatient, prescription, and preventive medical coverage.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"secondary\" class=\"text-xs\"> 3 Plans Available </span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4\">\n              <ui-radio-group [value]=\"selectedMedical()\" (valueChange)=\"selectedMedical.set($event)\" class=\"gap-3.5\">\n                @for (plan of medicalPlans; track plan.id) {\n                  <div\n                    role=\"button\"\n                    tabindex=\"0\"\n                    [attr.aria-pressed]=\"selectedMedical() === plan.id\"\n                    [class]=\"planCardClass(selectedMedical() === plan.id)\"\n                    (click)=\"selectedMedical.set(plan.id)\"\n                    (keydown.enter)=\"selectedMedical.set(plan.id)\"\n                    (keydown.space)=\"$event.preventDefault(); selectedMedical.set(plan.id)\"\n                  >\n                    <div class=\"flex flex-wrap items-start justify-between gap-3\">\n                      <div class=\"flex flex-wrap items-start gap-3\">\n                        <ui-radio-group-item [id]=\"plan.id\" [value]=\"plan.id\" class=\"mt-0.5\" />\n                        <div class=\"space-y-1\">\n                          <div class=\"flex flex-wrap items-center gap-2\">\n                            <label\n                              [for]=\"plan.id\"\n                              class=\"text-foreground cursor-pointer text-sm font-semibold sm:text-base\"\n                            >\n                              {{ plan.name }}\n                            </label>\n                            @if (plan.badge) {\n                              <span ui-badge [variant]=\"plan.badgeVariant ?? 'outline'\" class=\"text-xs font-medium\">\n                                {{ plan.badge }}\n                              </span>\n                            }\n                          </div>\n                          <p class=\"text-muted-foreground text-xs\">{{ plan.carrier }} · {{ plan.description }}</p>\n                        </div>\n                      </div>\n\n                      <div class=\"shrink-0 text-right\">\n                        <div class=\"flex items-baseline justify-end gap-1\">\n                          <span class=\"text-foreground text-lg font-bold tabular-nums sm:text-xl\">\n                            \\${{ plan.employeeCostPerPaycheck }}\n                          </span>\n                          <span class=\"text-muted-foreground text-xs font-normal\">/ paycheck</span>\n                        </div>\n                        <p class=\"text-muted-foreground text-xs\">\n                          Employer pays\n                          <span class=\"text-foreground font-medium tabular-nums\"\n                            >\\${{ plan.employerCostPerMonth }}/mo</span\n                          >\n                        </p>\n                      </div>\n                    </div>\n\n                    <!-- Plan Benefit Matrix Details -->\n                    <div\n                      class=\"border-border/60 bg-card/60 mt-1 grid grid-cols-2 gap-2.5 rounded-lg border p-3 text-xs sm:grid-cols-4\"\n                    >\n                      <div>\n                        <span class=\"text-muted-foreground block\">Annual Deductible</span>\n                        <span class=\"text-foreground font-semibold tabular-nums\">{{ plan.deductible }}</span>\n                      </div>\n                      <div>\n                        <span class=\"text-muted-foreground block\">Out-of-Pocket Max</span>\n                        <span class=\"text-foreground font-semibold tabular-nums\">{{ plan.outOfPocketMax }}</span>\n                      </div>\n                      <div>\n                        <span class=\"text-muted-foreground block\">Primary / Specialist</span>\n                        <span class=\"text-foreground font-semibold\">{{ plan.copayOrCoinsurance }}</span>\n                      </div>\n                      <div>\n                        <span class=\"text-muted-foreground block\">HSA Company Seed</span>\n                        <span\n                          [class]=\"\n                            plan.hsaSeed > 0\n                              ? 'text-success font-semibold tabular-nums'\n                              : 'text-muted-foreground font-medium'\n                          \"\n                        >\n                          {{ plan.hsaSeed > 0 ? '$' + plan.hsaSeed + ' / yr' : 'Not eligible' }}\n                        </span>\n                      </div>\n                    </div>\n\n                    <!-- Plan Bullet Highlights -->\n                    <ul class=\"text-muted-foreground mt-0.5 space-y-1 text-xs\">\n                      @for (highlight of plan.highlights; track highlight) {\n                        <li class=\"flex items-center gap-2\">\n                          <lucide-icon [img]=\"Check\" class=\"text-primary size-3.5 shrink-0\" />\n                          <span>{{ highlight }}</span>\n                        </li>\n                      }\n                    </ul>\n                  </div>\n                }\n              </ui-radio-group>\n            </div>\n          </div>\n\n          <!-- Category 2: Dental Plan -->\n          <div ui-card class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex flex-wrap items-center justify-between gap-3 sm:flex-nowrap\">\n                <div class=\"flex items-center gap-2.5\">\n                  <div\n                    class=\"border-primary/20 bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n                  >\n                    <lucide-icon [img]=\"ShieldCheck\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 ui-card-title class=\"text-base sm:text-lg\">2. Dental Plan</h3>\n                    <p ui-card-description>\n                      Preventive exams, cleanings, restorative treatments, and orthodontic benefits.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"secondary\" class=\"text-xs\"> 2 Plans + Waive </span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4\">\n              <ui-radio-group [value]=\"selectedDental()\" (valueChange)=\"selectedDental.set($event)\" class=\"gap-3.5\">\n                @for (plan of dentalPlans; track plan.id) {\n                  <div\n                    role=\"button\"\n                    tabindex=\"0\"\n                    [attr.aria-pressed]=\"selectedDental() === plan.id\"\n                    [class]=\"planCardClass(selectedDental() === plan.id)\"\n                    (click)=\"selectedDental.set(plan.id)\"\n                    (keydown.enter)=\"selectedDental.set(plan.id)\"\n                    (keydown.space)=\"$event.preventDefault(); selectedDental.set(plan.id)\"\n                  >\n                    <div class=\"flex flex-wrap items-start justify-between gap-3\">\n                      <div class=\"flex flex-wrap items-start gap-3\">\n                        <ui-radio-group-item [id]=\"plan.id\" [value]=\"plan.id\" class=\"mt-0.5\" />\n                        <div class=\"space-y-1\">\n                          <div class=\"flex flex-wrap items-center gap-2\">\n                            <label\n                              [for]=\"plan.id\"\n                              class=\"text-foreground cursor-pointer text-sm font-semibold sm:text-base\"\n                            >\n                              {{ plan.name }}\n                            </label>\n                            @if (plan.badge) {\n                              <span ui-badge [variant]=\"plan.badgeVariant ?? 'outline'\" class=\"text-xs font-medium\">\n                                {{ plan.badge }}\n                              </span>\n                            }\n                          </div>\n                          <p class=\"text-muted-foreground text-xs\">{{ plan.carrier }} · {{ plan.description }}</p>\n                        </div>\n                      </div>\n\n                      <div class=\"shrink-0 text-right\">\n                        <div class=\"flex items-baseline justify-end gap-1\">\n                          <span class=\"text-foreground text-lg font-bold tabular-nums sm:text-xl\">\n                            \\${{ plan.employeeCostPerPaycheck }}\n                          </span>\n                          <span class=\"text-muted-foreground text-xs font-normal\">/ paycheck</span>\n                        </div>\n                        @if (plan.employerCostPerMonth > 0) {\n                          <p class=\"text-muted-foreground text-xs\">\n                            Employer pays\n                            <span class=\"text-foreground font-medium tabular-nums\"\n                              >\\${{ plan.employerCostPerMonth }}/mo</span\n                            >\n                          </p>\n                        } @else {\n                          <p class=\"text-muted-foreground text-xs\">No payroll deduction</p>\n                        }\n                      </div>\n                    </div>\n\n                    @if (plan.employeeCostPerPaycheck > 0) {\n                      <div\n                        class=\"border-border/60 bg-card/60 mt-1 grid grid-cols-2 gap-2.5 rounded-lg border p-3 text-xs sm:grid-cols-4\"\n                      >\n                        <div>\n                          <span class=\"text-muted-foreground block\">Annual Maximum</span>\n                          <span class=\"text-foreground font-semibold tabular-nums\">{{ plan.annualMax }}</span>\n                        </div>\n                        <div>\n                          <span class=\"text-muted-foreground block\">Preventive Cleanings</span>\n                          <span class=\"text-foreground font-semibold\">{{ plan.preventive }}</span>\n                        </div>\n                        <div>\n                          <span class=\"text-muted-foreground block\">Basic Services</span>\n                          <span class=\"text-foreground font-semibold\">{{ plan.basic }}</span>\n                        </div>\n                        <div>\n                          <span class=\"text-muted-foreground block\">Major &amp; Orthodontics</span>\n                          <span class=\"text-foreground font-semibold\">{{ plan.majorOrOrtho }}</span>\n                        </div>\n                      </div>\n                    }\n                  </div>\n                }\n              </ui-radio-group>\n            </div>\n          </div>\n\n          <!-- Category 3: Vision Plan -->\n          <div ui-card class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex flex-wrap items-center justify-between gap-3 sm:flex-nowrap\">\n                <div class=\"flex items-center gap-2.5\">\n                  <div\n                    class=\"border-primary/20 bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n                  >\n                    <lucide-icon [img]=\"Eye\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 ui-card-title class=\"text-base sm:text-lg\">3. Vision Plan</h3>\n                    <p ui-card-description>\n                      Routine eye exams, designer frame allowances, contact lenses, and progressive lens discounts.\n                    </p>\n                  </div>\n                </div>\n                <span ui-badge variant=\"secondary\" class=\"text-xs\"> 2 Plans + Waive </span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4\">\n              <ui-radio-group [value]=\"selectedVision()\" (valueChange)=\"selectedVision.set($event)\" class=\"gap-3.5\">\n                @for (plan of visionPlans; track plan.id) {\n                  <div\n                    role=\"button\"\n                    tabindex=\"0\"\n                    [attr.aria-pressed]=\"selectedVision() === plan.id\"\n                    [class]=\"planCardClass(selectedVision() === plan.id)\"\n                    (click)=\"selectedVision.set(plan.id)\"\n                    (keydown.enter)=\"selectedVision.set(plan.id)\"\n                    (keydown.space)=\"$event.preventDefault(); selectedVision.set(plan.id)\"\n                  >\n                    <div class=\"flex flex-wrap items-start justify-between gap-3\">\n                      <div class=\"flex flex-wrap items-start gap-3\">\n                        <ui-radio-group-item [id]=\"plan.id\" [value]=\"plan.id\" class=\"mt-0.5\" />\n                        <div class=\"space-y-1\">\n                          <div class=\"flex flex-wrap items-center gap-2\">\n                            <label\n                              [for]=\"plan.id\"\n                              class=\"text-foreground cursor-pointer text-sm font-semibold sm:text-base\"\n                            >\n                              {{ plan.name }}\n                            </label>\n                            @if (plan.badge) {\n                              <span ui-badge [variant]=\"plan.badgeVariant ?? 'outline'\" class=\"text-xs font-medium\">\n                                {{ plan.badge }}\n                              </span>\n                            }\n                          </div>\n                          <p class=\"text-muted-foreground text-xs\">{{ plan.carrier }} · {{ plan.description }}</p>\n                        </div>\n                      </div>\n\n                      <div class=\"shrink-0 text-right\">\n                        <div class=\"flex items-baseline justify-end gap-1\">\n                          <span class=\"text-foreground text-lg font-bold tabular-nums sm:text-xl\">\n                            \\${{ plan.employeeCostPerPaycheck }}\n                          </span>\n                          <span class=\"text-muted-foreground text-xs font-normal\">/ paycheck</span>\n                        </div>\n                        @if (plan.employerCostPerMonth > 0) {\n                          <p class=\"text-muted-foreground text-xs\">\n                            Employer pays\n                            <span class=\"text-foreground font-medium tabular-nums\"\n                              >\\${{ plan.employerCostPerMonth }}/mo</span\n                            >\n                          </p>\n                        } @else {\n                          <p class=\"text-muted-foreground text-xs\">No payroll deduction</p>\n                        }\n                      </div>\n                    </div>\n\n                    @if (plan.employeeCostPerPaycheck > 0) {\n                      <div\n                        class=\"border-border/60 bg-card/60 mt-1 grid grid-cols-1 gap-2.5 rounded-lg border p-3 text-xs sm:grid-cols-3\"\n                      >\n                        <div>\n                          <span class=\"text-muted-foreground block\">Annual Exam Copay</span>\n                          <span class=\"text-foreground font-semibold\">{{ plan.examCopay }}</span>\n                        </div>\n                        <div>\n                          <span class=\"text-muted-foreground block\">Frame Allowance</span>\n                          <span class=\"text-foreground font-semibold tabular-nums\">{{ plan.frameAllowance }}</span>\n                        </div>\n                        <div>\n                          <span class=\"text-muted-foreground block\">Prescription Lenses</span>\n                          <span class=\"text-foreground font-semibold\">{{ plan.lenses }}</span>\n                        </div>\n                      </div>\n                    }\n                  </div>\n                }\n              </ui-radio-group>\n            </div>\n          </div>\n\n          <!-- Category 4: 401(k) Retirement & Employer Match -->\n          <div ui-card class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex items-center justify-between\">\n                <div class=\"flex items-center gap-2.5\">\n                  <div\n                    class=\"border-primary/20 bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n                  >\n                    <lucide-icon [img]=\"PiggyBank\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 ui-card-title class=\"text-base sm:text-lg\">4. 401(k) Retirement &amp; Employer Match</h3>\n                    <p ui-card-description>Pre-tax salary deferrals with tiered 100% + 50% company matching formula.</p>\n                  </div>\n                </div>\n                <span ui-badge [variant]=\"maxMatchUnlocked() ? 'default' : 'outline'\" class=\"text-xs\">\n                  {{ maxMatchUnlocked() ? 'Max Match Active' : 'Match Available' }}\n                </span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-6\">\n              <!-- Employer Match Callout Box -->\n              <div\n                class=\"border-primary/30 bg-primary/5 dark:bg-primary/10 flex flex-col gap-3 rounded-xl border p-4 sm:flex-row sm:items-center sm:justify-between\"\n              >\n                <div class=\"flex flex-wrap items-start gap-3\">\n                  <lucide-icon [img]=\"Percent\" class=\"text-primary mt-0.5 size-5 shrink-0\" />\n                  <div class=\"space-y-1\">\n                    <span class=\"text-foreground text-sm font-semibold\">Company Match Formula</span>\n                    <p class=\"text-muted-foreground text-xs leading-relaxed\">\n                      100% match up to 4% + 50% match on next 2% ·\n                      <strong class=\"text-foreground font-medium\">Maximum $6,000 employer match unlocked!</strong>\n                    </p>\n                  </div>\n                </div>\n\n                <div class=\"shrink-0\">\n                  <span\n                    ui-badge\n                    [variant]=\"maxMatchUnlocked() ? 'secondary' : 'outline'\"\n                    [class]=\"matchBadgeClass()\"\n                    class=\"gap-1.5 px-3 py-1 text-xs font-semibold\"\n                  >\n                    @if (maxMatchUnlocked()) {\n                      <lucide-icon [img]=\"CheckCircle2\" class=\"size-3.5\" />\n                      100% Max Match Achieved ($6,000/yr)\n                    } @else {\n                      <lucide-icon [img]=\"AlertCircle\" class=\"size-3.5\" />\n                      Leaving \\${{ missedMatchAnnual().toLocaleString('en-US') }}/yr on table\n                    }\n                  </span>\n                </div>\n              </div>\n\n              <!-- Interactive Slider Section -->\n              <div class=\"space-y-4\">\n                <div class=\"flex items-center justify-between\">\n                  <div class=\"space-y-0.5\">\n                    <span class=\"text-foreground text-sm font-semibold\">Your Pre-Tax Contribution Rate</span>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Calculated from gross salary (\\${{\n                        paycheckGross().toLocaleString('en-US', {\n                          minimumFractionDigits: 2,\n                          maximumFractionDigits: 2,\n                        })\n                      }}\n                      / semi-monthly paycheck)\n                    </p>\n                  </div>\n\n                  <div class=\"text-right\">\n                    <div class=\"flex items-baseline justify-end gap-1\">\n                      <span class=\"text-primary text-2xl font-bold tabular-nums sm:text-3xl\"> {{ k401Rate() }}% </span>\n                      <span class=\"text-muted-foreground text-xs\">Contribution</span>\n                    </div>\n                    <span class=\"text-foreground text-xs font-medium tabular-nums\">\n                      \\${{ k401EmployeePerPaycheck().toFixed(2) }} / paycheck (\\${{\n                        k401EmployeeAnnual().toLocaleString('en-US')\n                      }}/yr)\n                    </span>\n                  </div>\n                </div>\n\n                <div class=\"py-5\">\n                  <ui-slider\n                    [value]=\"[k401Rate()]\"\n                    (valueChange)=\"onK401Change($event)\"\n                    [min]=\"1\"\n                    [max]=\"20\"\n                    [step]=\"1\"\n                    [marks]=\"sliderMarks\"\n                    [tooltip]=\"k401Tooltip\"\n                  />\n                </div>\n              </div>\n\n              <!-- 401(k) Financial Impact Breakdown -->\n              <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n                <div class=\"border-border bg-card/60 rounded-lg border p-3 text-center sm:text-left\">\n                  <span class=\"text-muted-foreground block text-xs\">Your Paycheck Deferral</span>\n                  <span class=\"text-foreground text-lg font-bold tabular-nums\">\n                    \\${{ k401EmployeePerPaycheck().toFixed(2) }}\n                  </span>\n                  <span class=\"text-muted-foreground block text-xs tabular-nums\">\n                    \\${{ k401EmployeeAnnual().toLocaleString('en-US') }} / year\n                  </span>\n                </div>\n\n                <div class=\"border-success/30 bg-success/5 rounded-lg border p-3 text-center sm:text-left\">\n                  <span class=\"text-success block text-xs font-medium\">Employer Match Added</span>\n                  <span class=\"text-success text-lg font-bold tabular-nums\">\n                    +\\${{ k401EmployerPerPaycheck().toFixed(2) }}\n                  </span>\n                  <span class=\"text-muted-foreground block text-xs tabular-nums\">\n                    \\${{ k401EmployerAnnual().toLocaleString('en-US') }} / year (Free Match)\n                  </span>\n                </div>\n\n                <div class=\"border-border bg-card/60 rounded-lg border p-3 text-center sm:text-left\">\n                  <span class=\"text-muted-foreground block text-xs\">Total 401(k) Annual Savings</span>\n                  <span class=\"text-foreground text-lg font-bold tabular-nums\">\n                    \\${{ (k401EmployeeAnnual() + k401EmployerAnnual()).toLocaleString('en-US') }}\n                  </span>\n                  <span class=\"text-muted-foreground block text-xs\"> 2026 IRS Cap: $23,500 </span>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Sticky Paycheck Impact Summary Box (Col 4) -->\n        <div class=\"lg:sticky lg:top-8 lg:col-span-4\">\n          <div ui-card class=\"border-border bg-card shadow-xs\">\n            <div ui-card-header class=\"pb-4\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                  Paycheck Impact Summary\n                </span>\n                <span ui-badge variant=\"outline\" class=\"text-xs\"> Semi-Monthly </span>\n              </div>\n\n              <!-- Primary Highlight Metric 1: Total Employee Cost per Paycheck -->\n              <div class=\"mt-4 space-y-1\">\n                <span class=\"text-muted-foreground text-xs font-medium\">Total Employee Benefit Cost</span>\n                <div class=\"flex items-baseline gap-1.5\">\n                  <span class=\"text-foreground text-4xl font-bold tracking-tight tabular-nums sm:text-5xl\">\n                    \\${{ healthCostPerPaycheck().toFixed(2) }}\n                  </span>\n                  <span class=\"text-muted-foreground text-sm font-normal\"> / pay period</span>\n                </div>\n                <p class=\"text-muted-foreground text-xs\">Pre-tax health, dental, and vision deductions</p>\n              </div>\n\n              <!-- Primary Highlight Metric 2: Total Annual Employer Benefit Value -->\n              <div class=\"border-primary/20 bg-primary/5 dark:bg-primary/10 mt-4 rounded-xl border p-3.5\">\n                <span class=\"text-muted-foreground block text-xs font-medium\">Total Annual Employer Value</span>\n                <div class=\"flex items-baseline gap-1\">\n                  <span class=\"text-primary text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">\n                    \\${{\n                      totalEmployerAnnualValue().toLocaleString('en-US', {\n                        minimumFractionDigits: 2,\n                        maximumFractionDigits: 2,\n                      })\n                    }}\n                  </span>\n                  <span class=\"text-muted-foreground text-xs font-normal\"> / year</span>\n                </div>\n                <p class=\"text-muted-foreground mt-1 text-xs\">\n                  Includes company medical, dental, vision subsidies, HSA seed, match &amp; insurance.\n                </p>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4 pt-0\">\n              <ui-separator />\n\n              <!-- Itemized Paycheck Deductions -->\n              <div class=\"space-y-2 text-xs\">\n                <span class=\"text-muted-foreground block font-semibold tracking-wider uppercase\">\n                  Employee Payroll Deductions\n                </span>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-foreground\"\n                    >Medical ({{ currentMedical().name.split(' ')[0] }} {{ currentMedical().name.split(' ')[1] }})</span\n                  >\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ currentMedical().employeeCostPerPaycheck.toFixed(2) }}</span\n                  >\n                </div>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-foreground\"\n                    >Dental ({{ currentDental().name.split(' ')[0] }} {{ currentDental().name.split(' ')[1] }})</span\n                  >\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ currentDental().employeeCostPerPaycheck.toFixed(2) }}</span\n                  >\n                </div>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-foreground\"\n                    >Vision ({{ currentVision().name.split(' ')[0] }} {{ currentVision().name.split(' ')[1] }})</span\n                  >\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ currentVision().employeeCostPerPaycheck.toFixed(2) }}</span\n                  >\n                </div>\n\n                <div class=\"border-border/60 flex items-center justify-between border-t pt-1.5 font-semibold\">\n                  <span class=\"text-foreground\">Pre-Tax Health Total</span>\n                  <span class=\"text-foreground tabular-nums\">\\${{ healthCostPerPaycheck().toFixed(2) }}</span>\n                </div>\n\n                <div class=\"text-muted-foreground flex items-center justify-between\">\n                  <span>401(k) Contribution ({{ k401Rate() }}%)</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ k401EmployeePerPaycheck().toFixed(2) }}</span\n                  >\n                </div>\n\n                <div class=\"bg-muted/50 flex items-center justify-between rounded-md p-2 font-semibold\">\n                  <span class=\"text-foreground\">Total Pre-Tax per Paycheck</span>\n                  <span class=\"text-foreground tabular-nums\">\\${{ totalEmployeePerPaycheck().toFixed(2) }}</span>\n                </div>\n\n                <div class=\"border-border/60 text-muted-foreground flex items-center justify-between border-t pt-1\">\n                  <span>Est. Pre-Tax Tax Savings (~25%)</span>\n                  <span class=\"text-success font-medium tabular-nums\"\n                    >-\\${{ estimatedTaxSavingsPerPaycheck().toFixed(2) }}</span\n                  >\n                </div>\n\n                <div class=\"text-muted-foreground flex items-center justify-between\">\n                  <span>Est. Net Take-Home Impact</span>\n                  <span class=\"text-foreground font-medium tabular-nums\">-\\${{ netTakeHomeImpact().toFixed(2) }}</span>\n                </div>\n              </div>\n\n              <ui-separator />\n\n              <!-- Itemized Employer Annual Contributions -->\n              <div class=\"space-y-1.5 text-xs\">\n                <span class=\"text-muted-foreground block font-semibold tracking-wider uppercase\">\n                  Employer Benefits Breakdown\n                </span>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground\">Medical Subsidy</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ (currentMedical().employerCostPerMonth * 12).toLocaleString('en-US') }}/yr</span\n                  >\n                </div>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground\">Dental Subsidy</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ (currentDental().employerCostPerMonth * 12).toLocaleString('en-US') }}/yr</span\n                  >\n                </div>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground\">Vision Subsidy</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ (currentVision().employerCostPerMonth * 12).toLocaleString('en-US') }}/yr</span\n                  >\n                </div>\n\n                @if (currentMedical().hsaSeed > 0) {\n                  <div class=\"flex items-center justify-between\">\n                    <span class=\"text-muted-foreground\">HSA Annual Contribution</span>\n                    <span class=\"text-foreground font-medium tabular-nums\"\n                      >\\${{ currentMedical().hsaSeed.toLocaleString('en-US') }}/yr</span\n                    >\n                  </div>\n                }\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground\">401(k) Employer Match</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ k401EmployerAnnual().toLocaleString('en-US') }}/yr</span\n                  >\n                </div>\n\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground\">Life, AD&amp;D &amp; Disability</span>\n                  <span class=\"text-foreground font-medium tabular-nums\"\n                    >\\${{ employerLifeDisabilityAnnual.toLocaleString('en-US') }}/yr</span\n                  >\n                </div>\n              </div>\n            </div>\n\n            <div ui-card-footer class=\"flex flex-col gap-2.5 pt-0\">\n              @if (!isSubmitted()) {\n                <button\n                  ui-button\n                  size=\"lg\"\n                  class=\"w-full gap-2 font-semibold shadow-xs\"\n                  (click)=\"showSignModal.set(true)\"\n                >\n                  <lucide-icon [img]=\"FileSignature\" class=\"size-4\" />\n                  Save Selections &amp; Sign\n                </button>\n              } @else {\n                <button\n                  ui-button\n                  variant=\"outline\"\n                  size=\"default\"\n                  class=\"border-success/30 bg-success/10 text-success w-full gap-2 font-semibold\"\n                  (click)=\"handleResetEnrollment()\"\n                >\n                  <lucide-icon [img]=\"Check\" class=\"size-4\" />\n                  Elections Signed (Edit)\n                </button>\n              }\n\n              <p class=\"text-muted-foreground text-center text-xs\">\n                Annual elections lock on {{ deadlineDate }}, 11:59 PM EST\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Electronic Signature Confirmation Modal Dialog -->\n      @if (showSignModal()) {\n        <div class=\"bg-background/80 fixed inset-0 z-50 flex items-center justify-center p-4 backdrop-blur-xs\">\n          <div\n            class=\"border-border bg-card animate-in fade-in zoom-in-95 relative w-full max-w-lg rounded-xl border p-6 shadow-xl duration-150\"\n          >\n            <div class=\"space-y-2\">\n              <div class=\"text-primary flex items-center gap-2\">\n                <lucide-icon [img]=\"FileSignature\" class=\"size-5\" />\n                <h3 class=\"text-foreground text-lg font-bold\">Review &amp; Sign Elective Enrollment</h3>\n              </div>\n              <p class=\"text-muted-foreground text-xs\">\n                Please verify your selections below before electronically signing for the 2026-2027 plan year.\n              </p>\n            </div>\n\n            <div class=\"border-border bg-muted/40 my-4 space-y-2 rounded-lg border p-3.5 text-xs\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Employee:</span>\n                <span class=\"text-foreground font-medium\">{{ employeeName }} ({{ coverageTier }})</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Medical Plan:</span>\n                <span class=\"text-foreground font-medium\">{{ currentMedical().name }}</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Dental Plan:</span>\n                <span class=\"text-foreground font-medium\">{{ currentDental().name }}</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Vision Plan:</span>\n                <span class=\"text-foreground font-medium\">{{ currentVision().name }}</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">401(k) Contribution:</span>\n                <span class=\"text-foreground font-medium tabular-nums\"\n                  >{{ k401Rate() }}% (\\${{ k401EmployeePerPaycheck().toFixed(2) }} / paycheck)</span\n                >\n              </div>\n              <div class=\"border-border/60 flex items-center justify-between border-t pt-2 font-bold\">\n                <span class=\"text-foreground\">Total Deduction per Paycheck:</span>\n                <span class=\"text-foreground tabular-nums\">\\${{ totalEmployeePerPaycheck().toFixed(2) }}</span>\n              </div>\n            </div>\n\n            <div class=\"space-y-3\">\n              <label class=\"flex cursor-pointer items-start gap-2.5 select-none\">\n                <input\n                  type=\"checkbox\"\n                  [checked]=\"signatureAcknowledged()\"\n                  (change)=\"signatureAcknowledged.set($any($event.target).checked)\"\n                  class=\"border-input text-primary focus-visible:ring-ring mt-0.5 size-4 rounded border focus-visible:ring-2\"\n                />\n                <span class=\"text-muted-foreground text-xs leading-relaxed\">\n                  I acknowledge that I have selected the benefit plans above and authorize pre-tax semi-monthly payroll\n                  deductions commencing October 1, 2026.\n                </span>\n              </label>\n            </div>\n\n            <div class=\"mt-6 flex items-center justify-end gap-2.5\">\n              <button ui-button variant=\"outline\" size=\"sm\" (click)=\"showSignModal.set(false)\">Cancel</button>\n              <button\n                ui-button\n                size=\"sm\"\n                [disabled]=\"!signatureAcknowledged()\"\n                class=\"gap-1.5 font-semibold\"\n                (click)=\"handleSignAndSubmit()\"\n              >\n                <lucide-icon [img]=\"FileCheck\" class=\"size-4\" />\n                Confirm &amp; Submit Signature\n              </button>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class UiBenefitsEnrollmentPortalComponent implements OnInit {\n  protected readonly AlertCircle = AlertCircle\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Download = Download\n  protected readonly Eye = Eye\n  protected readonly FileCheck = FileCheck\n  protected readonly FileSignature = FileSignature\n  protected readonly HeartPulse = HeartPulse\n  protected readonly Percent = Percent\n  protected readonly PiggyBank = PiggyBank\n  protected readonly RefreshCw = RefreshCw\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly User = User\n  protected readonly Users = Users\n\n  protected readonly medicalPlans = MEDICAL_PLANS\n  protected readonly dentalPlans = DENTAL_PLANS\n  protected readonly visionPlans = VISION_PLANS\n  protected readonly sliderMarks = SLIDER_MARKS\n  protected readonly employerLifeDisabilityAnnual = 2386\n\n  @Input() employeeName = 'Elena Rostova'\n  @Input() employeeId = 'EMP-48201'\n  @Input() coverageTier = 'Employee + Spouse'\n  @Input() department = 'Engineering · Senior Staff'\n  @Input() deadlineDate = 'Sep 15'\n  @Input() daysRemaining = 14\n  @Input() annualSalary = 120000\n  @Input() payPeriodsPerYear = 24\n  @Input() initialMedicalPlan = 'medical-ppo-hsa'\n  @Input() initialDentalPlan = 'dental-comprehensive'\n  @Input() initialVisionPlan = 'vision-choice-plus'\n  @Input() initial401kRate = 6\n  @Input('class') className?: string\n\n  readonly selectedMedical = signal('medical-ppo-hsa')\n  readonly selectedDental = signal('dental-comprehensive')\n  readonly selectedVision = signal('vision-choice-plus')\n  readonly k401Rate = signal(6)\n  readonly isSubmitted = signal(false)\n  readonly signatureAcknowledged = signal(false)\n  readonly showSignModal = signal(false)\n\n  ngOnInit(): void {\n    this.selectedMedical.set(this.initialMedicalPlan)\n    this.selectedDental.set(this.initialDentalPlan)\n    this.selectedVision.set(this.initialVisionPlan)\n    this.k401Rate.set(this.initial401kRate)\n  }\n\n  readonly currentMedical = computed(\n    () => MEDICAL_PLANS.find((p) => p.id === this.selectedMedical()) ?? MEDICAL_PLANS[0]!,\n  )\n  readonly currentDental = computed(() => DENTAL_PLANS.find((p) => p.id === this.selectedDental()) ?? DENTAL_PLANS[0]!)\n  readonly currentVision = computed(() => VISION_PLANS.find((p) => p.id === this.selectedVision()) ?? VISION_PLANS[0]!)\n\n  readonly paycheckGross = computed(() => this.annualSalary / this.payPeriodsPerYear)\n\n  readonly k401EmployeePerPaycheck = computed(() => (this.paycheckGross() * this.k401Rate()) / 100)\n  readonly k401EmployeeAnnual = computed(() => this.k401EmployeePerPaycheck() * this.payPeriodsPerYear)\n\n  // 100% match up to 4% + 50% match on next 2% -> max 5.0% at a 6% employee contribution.\n  readonly employerMatchRate = computed(() => {\n    const rate = this.k401Rate()\n    if (rate <= 0) return 0\n    if (rate <= 4) return rate\n    if (rate === 5) return 4.5\n    return 5.0\n  })\n\n  readonly k401EmployerPerPaycheck = computed(() => (this.paycheckGross() * this.employerMatchRate()) / 100)\n  readonly k401EmployerAnnual = computed(() => this.k401EmployerPerPaycheck() * this.payPeriodsPerYear)\n  readonly maxMatchUnlocked = computed(() => this.k401Rate() >= 6)\n  readonly missedMatchAnnual = computed(() => {\n    const maxPossible = (this.annualSalary * 5.0) / 100\n    return Math.max(0, maxPossible - this.k401EmployerAnnual())\n  })\n\n  readonly healthCostPerPaycheck = computed(\n    () =>\n      this.currentMedical().employeeCostPerPaycheck +\n      this.currentDental().employeeCostPerPaycheck +\n      this.currentVision().employeeCostPerPaycheck,\n  )\n\n  readonly totalEmployeePerPaycheck = computed(() => this.healthCostPerPaycheck() + this.k401EmployeePerPaycheck())\n  readonly estimatedTaxSavingsPerPaycheck = computed(\n    () => Math.round(this.totalEmployeePerPaycheck() * 0.25 * 100) / 100,\n  )\n  readonly netTakeHomeImpact = computed(() => this.totalEmployeePerPaycheck() - this.estimatedTaxSavingsPerPaycheck())\n\n  readonly totalEmployerAnnualValue = computed(\n    () =>\n      this.currentMedical().employerCostPerMonth * 12 +\n      this.currentDental().employerCostPerMonth * 12 +\n      this.currentVision().employerCostPerMonth * 12 +\n      this.currentMedical().hsaSeed +\n      this.k401EmployerAnnual() +\n      this.employerLifeDisabilityAnnual,\n  )\n\n  get rootClass(): string {\n    return cn('mx-auto w-full max-w-6xl space-y-8 p-4 sm:p-6 lg:p-8', this.className)\n  }\n\n  planCardClass(selected: boolean): string {\n    return cn(\n      'focus-visible:ring-ring relative flex cursor-pointer flex-col gap-3 rounded-xl border p-4.5 transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none',\n      selected\n        ? 'border-primary bg-primary/[0.03] dark:bg-primary/10 ring-primary/30 shadow-xs ring-1'\n        : 'border-border hover:border-border/80 hover:bg-muted/30',\n    )\n  }\n\n  matchBadgeClass(): string {\n    return cn(\n      this.maxMatchUnlocked()\n        ? 'border-success/30 bg-success/10 text-success'\n        : 'border-warning/30 bg-warning/10 text-warning',\n    )\n  }\n\n  readonly k401Tooltip = (val: number): string =>\n    `${val}% (${((this.annualSalary * val) / 100).toLocaleString('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })}/yr)`\n\n  onK401Change(value: number[]): void {\n    if (value.length > 0) this.k401Rate.set(value[0]!)\n  }\n\n  handleSignAndSubmit(): void {\n    if (!this.signatureAcknowledged()) return\n    this.isSubmitted.set(true)\n    this.showSignModal.set(false)\n  }\n\n  handleResetEnrollment(): void {\n    this.isSubmitted.set(false)\n    this.signatureAcknowledged.set(false)\n  }\n}\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/benefits-enrollment-portal/benefits-enrollment-portal.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/benefits-enrollment-portal/index.ts",
      "content": "export {\n  UiBenefitsEnrollmentPortalComponent,\n  type MedicalPlan,\n  type DentalPlan,\n  type VisionPlan,\n} from './benefits-enrollment-portal.component'\n",
      "type": "registry:page",
      "target": "~/src/app/components/blocks/benefits-enrollment-portal/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/radio-group.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/slider.json"
  ],
  "description": "Employee benefits open enrollment portal with interactive medical, dental, and vision plan comparisons, customizable 401(k) contribution slider with real-time employer match calculation, and a sticky paycheck impact summary.",
  "categories": [
    "hr",
    "app",
    "form"
  ]
}