{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "commute-reimbursement-claims",
  "title": "Commute Reimbursement Claims",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/commute-reimbursement-claims/commute-reimbursement-claims.component.ts",
      "content": "// Monthly commuter transit pass, mileage, and EV charging expense claim reimbursement\n// portal with IRS pre-tax allowance metrics, claim submission form with receipt dropzone,\n// and claims history ledger. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  Building2,\n  Calendar,\n  Car,\n  Check,\n  CheckCircle2,\n  Clock,\n  DollarSign,\n  Download,\n  Eye,\n  FileCheck,\n  FileText,\n  LucideAngularModule,\n  Paperclip,\n  Plus,\n  Receipt,\n  RotateCcw,\n  Search,\n  Send,\n  ShieldCheck,\n  Train,\n  TrendingUp,\n  Upload,\n  Wallet,\n  X,\n  Zap,\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 {\n  UiDialogComponent,\n  UiDialogContentComponent,\n  UiDialogDescriptionComponent,\n  UiDialogFooterComponent,\n  UiDialogHeaderComponent,\n  UiDialogTitleComponent,\n} from '@/ui/dialog/dialog.component'\nimport {\n  UiDropdownMenuComponent,\n  UiDropdownMenuContentComponent,\n  UiDropdownMenuItemComponent,\n  UiDropdownMenuSeparatorComponent,\n  UiDropdownMenuTriggerComponent,\n} from '@/ui/dropdown-menu/dropdown-menu.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectItemComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport type CommuteCategory = 'transit' | 'parking' | 'mileage' | 'ev_charging'\nexport type ClaimStatus = 'reimbursed' | 'pending'\n\nexport interface ExpenseClaim {\n  id: string\n  date: string\n  category: CommuteCategory\n  categoryLabel: string\n  description: string\n  provider: string\n  amount: number\n  status: ClaimStatus\n  statusLabel: string\n  receiptFileName: string\n  receiptFileSize: string\n  receiptDate: string\n  notes: string\n}\n\nconst categoryBadge: Record<CommuteCategory, string> = {\n  transit: 'bg-info/10 text-info border-info/20',\n  parking: 'bg-chart-1/10 text-chart-1 border-chart-1/20',\n  mileage: 'bg-warning/10 text-warning border-warning/20',\n  ev_charging: 'bg-chart-2/10 text-chart-2 border-chart-2/20',\n}\n\nconst categoryIrsInfo: Record<CommuteCategory, string> = {\n  transit: 'BART, Caltrain, Metro, Subway & Commuter Bus passes (IRC § 132(f))',\n  parking: 'Park-and-ride commuter lots and near-office parking facilities',\n  mileage: '2026 IRS standard rate: $0.67 per business/commuter detour mile',\n  ev_charging: 'Level 2 & DC fast charging at public networks & workplace chargers',\n}\n\nconst statusStyles: Record<ClaimStatus, string> = {\n  reimbursed: 'bg-success/10 text-success border-success/20',\n  pending: 'bg-warning/10 text-warning border-warning/20',\n}\n\nconst statusDots: Record<ClaimStatus, string> = {\n  reimbursed: 'bg-success',\n  pending: 'bg-warning',\n}\n\nconst defaultClaims: ExpenseClaim[] = [\n  {\n    id: 'CLM-8041',\n    date: 'Aug 18, 2026',\n    category: 'transit',\n    categoryLabel: 'Public Transit',\n    description: 'Monthly BART Clipper Card Pass',\n    provider: 'Bay Area Rapid Transit (BART)',\n    amount: 120.0,\n    status: 'reimbursed',\n    statusLabel: 'Reimbursed on Payroll',\n    receiptFileName: 'bart-clipper-pass-aug2026.pdf',\n    receiptFileSize: '340 KB',\n    receiptDate: 'Aug 18, 2026 · 08:14 AM',\n    notes: 'Monthly pass reload for Embarcadero ↔ Millbrae commuter route.',\n  },\n  {\n    id: 'CLM-7982',\n    date: 'Aug 12, 2026',\n    category: 'transit',\n    categoryLabel: 'Public Transit',\n    description: 'San Francisco Caltrain Monthly Pass',\n    provider: 'Caltrain Peninsula Corridor',\n    amount: 60.5,\n    status: 'reimbursed',\n    statusLabel: 'Reimbursed on Payroll',\n    receiptFileName: 'caltrain-zone1-3-pass.pdf',\n    receiptFileSize: '412 KB',\n    receiptDate: 'Aug 12, 2026 · 07:45 AM',\n    notes: 'Zone 1 to Zone 3 Caltrain commuter pass for headquarters travel.',\n  },\n  {\n    id: 'CLM-8104',\n    date: 'Aug 08, 2026',\n    category: 'parking',\n    categoryLabel: 'Parking',\n    description: 'Downtown Parking Garage',\n    provider: 'SOMA Park Management Corp.',\n    amount: 65.0,\n    status: 'pending',\n    statusLabel: 'Pending Approval',\n    receiptFileName: 'soma-garage-monthly-receipt.pdf',\n    receiptFileSize: '185 KB',\n    receiptDate: 'Aug 08, 2026 · 09:30 AM',\n    notes: 'Commuter parking space #204 during quarterly planning week.',\n  },\n  {\n    id: 'CLM-7729',\n    date: 'Aug 03, 2026',\n    category: 'ev_charging',\n    categoryLabel: 'EV Charging',\n    description: 'EV Supercharger Network',\n    provider: 'EVgo / ChargePoint Public Hub',\n    amount: 42.0,\n    status: 'reimbursed',\n    statusLabel: 'Reimbursed on Payroll',\n    receiptFileName: 'evgo-charge-sessions-aug.pdf',\n    receiptFileSize: '520 KB',\n    receiptDate: 'Aug 03, 2026 · 06:20 PM',\n    notes: '4x workplace Level-2 charge sessions during sprint week.',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-commute-reimbursement-claims, [ui-commute-reimbursement-claims]',\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    UiDialogComponent,\n    UiDialogContentComponent,\n    UiDialogDescriptionComponent,\n    UiDialogFooterComponent,\n    UiDialogHeaderComponent,\n    UiDialogTitleComponent,\n    UiDropdownMenuComponent,\n    UiDropdownMenuContentComponent,\n    UiDropdownMenuItemComponent,\n    UiDropdownMenuSeparatorComponent,\n    UiDropdownMenuTriggerComponent,\n    UiInputComponent,\n    UiProgressComponent,\n    UiSelectComponent,\n    UiSelectContentComponent,\n    UiSelectItemComponent,\n    UiSelectTriggerComponent,\n    UiSelectValueComponent,\n    UiSeparatorComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"commute-reimbursement-claims\" [class]=\"rootClass\">\n      <!-- Header -->\n      <div class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            <h2 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">{{ title }}</h2>\n            <span ui-badge wrap variant=\"outline\" class=\"border-info/30 bg-info/10 text-info text-xs font-medium\">\n              <lucide-icon [img]=\"Calendar\" class=\"mr-1 size-3\" aria-hidden=\"true\" />\n              {{ claimPeriod }}\n            </span>\n          </div>\n          <p class=\"text-muted-foreground text-sm\">{{ policyText }}</p>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <button ui-button aria-label=\"Download attachment\" variant=\"outline\" size=\"sm\" class=\"shadow-xs\">\n            <lucide-icon [img]=\"Download\" class=\"size-4\" aria-hidden=\"true\" />\n            Export Statement\n          </button>\n          <button ui-button size=\"sm\" class=\"shadow-xs\" (click)=\"scrollToSubmitForm()\">\n            <lucide-icon [img]=\"Plus\" class=\"size-4\" aria-hidden=\"true\" />\n            Submit New Claim\n          </button>\n        </div>\n      </div>\n\n      <!-- 4 Monthly Benefit Metric Cards -->\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"space-y-2 p-5\">\n            <div class=\"flex items-center justify-between\">\n              <p class=\"text-muted-foreground text-sm font-medium\">Monthly Allowance</p>\n              <div class=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n                <lucide-icon [img]=\"Wallet\" class=\"size-4\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <p class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$315.00 / mo</p>\n            <div class=\"text-muted-foreground flex items-center justify-between text-xs\">\n              <span>IRS Pre-tax limit</span>\n              <span class=\"text-foreground font-medium tabular-nums\">$69.50 left</span>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"space-y-2 p-5\">\n            <div class=\"flex items-center justify-between\">\n              <p class=\"text-muted-foreground text-sm font-medium\">Claimed This Month</p>\n              <div class=\"bg-info/10 text-info flex size-8 items-center justify-center rounded-lg\">\n                <lucide-icon [img]=\"TrendingUp\" class=\"size-4\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <p class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$245.50</p>\n            <div class=\"space-y-1.5 pt-0.5\">\n              <ui-progress [value]=\"78\" class=\"h-1.5\" />\n              <p class=\"text-muted-foreground text-xs tabular-nums\">$245.50 / $315.00 · 78% utilized</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"space-y-2 p-5\">\n            <div class=\"flex items-center justify-between\">\n              <p class=\"text-muted-foreground text-sm font-medium\">Reimbursed YTD</p>\n              <div class=\"bg-success/10 text-success flex size-8 items-center justify-center rounded-lg\">\n                <lucide-icon [img]=\"CheckCircle2\" class=\"size-4\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <p class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">$1,890.00</p>\n            <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n              <span class=\"text-success inline-flex items-center font-medium\">\n                <lucide-icon [img]=\"ShieldCheck\" class=\"mr-1 size-3.5\" aria-hidden=\"true\" />\n                100% Settled\n              </span>\n              <span>· 6 claims in 2026</span>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"space-y-2 p-5\">\n            <div class=\"flex items-center justify-between\">\n              <p class=\"text-muted-foreground text-sm font-medium\">Pending Review</p>\n              <div class=\"bg-warning/10 text-warning flex size-8 items-center justify-center rounded-lg\">\n                <lucide-icon [img]=\"Clock\" class=\"size-4\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <p class=\"text-foreground text-warning text-2xl font-bold tracking-tight tabular-nums\">1 Claim · $65.00</p>\n            <p class=\"text-muted-foreground text-xs\">Est. payout on Sep 1st payroll</p>\n          </div>\n        </div>\n      </div>\n\n      <!-- Main 2-Column Portal Section -->\n      <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n        <!-- Left Column: Submit Claim Interactive Card & Policy Card -->\n        <div class=\"space-y-6 lg:col-span-5\">\n          <div ui-card id=\"commute-submit-form\" class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-3\">\n              <div class=\"flex items-center justify-between\">\n                <div>\n                  <h3 ui-card-title class=\"text-base font-semibold\">Submit Commute Claim</h3>\n                  <p ui-card-description class=\"text-xs\">\n                    File transit pass, parking, mileage, or EV charging for monthly reimbursement.\n                  </p>\n                </div>\n                <span ui-badge wrap variant=\"secondary\" class=\"text-xs font-medium\">{{ claimPeriod }}</span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4\">\n              @if (formSubmittedNotice()) {\n                <div\n                  class=\"border-success/30 bg-success/10 text-success dark:text-foreground flex items-start gap-2.5 rounded-lg border p-3\"\n                >\n                  <lucide-icon [img]=\"CheckCircle2\" class=\"text-success mt-0.5 size-4 shrink-0\" />\n                  <div class=\"text-xs\">\n                    <p class=\"font-semibold\">Claim {{ recentlySubmittedClaimId() }} submitted successfully!</p>\n                    <p class=\"text-success/90 mt-0.5\">\n                      Itemized receipt received. Your claim has been added to pending payroll review.\n                    </p>\n                  </div>\n                </div>\n              }\n\n              <div class=\"space-y-1.5\">\n                <label for=\"commute-category-select\" class=\"text-foreground text-xs font-medium\">\n                  Expense Category <span class=\"text-destructive\">*</span>\n                </label>\n                <ui-select [value]=\"formCategory()\" (valueChange)=\"handleCategoryChange($event)\">\n                  <button ui-select-trigger id=\"commute-category-select\" class=\"w-full text-xs\">\n                    <ui-select-value placeholder=\"Select commute category\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"transit\">\n                      <span class=\"flex items-center gap-2\">\n                        <lucide-icon [img]=\"Train\" class=\"text-info size-3.5\" />\n                        <span>Public Transit Pass: BART/Metro</span>\n                      </span>\n                    </ui-select-item>\n                    <ui-select-item value=\"parking\">\n                      <span class=\"flex items-center gap-2\">\n                        <lucide-icon [img]=\"Building2\" class=\"text-chart-1 size-3.5\" />\n                        <span>Parking (Station & Garage)</span>\n                      </span>\n                    </ui-select-item>\n                    <ui-select-item value=\"mileage\">\n                      <span class=\"flex items-center gap-2\">\n                        <lucide-icon [img]=\"Car\" class=\"text-warning size-3.5\" />\n                        <span>Mileage (IRS $0.67/mi)</span>\n                      </span>\n                    </ui-select-item>\n                    <ui-select-item value=\"ev_charging\">\n                      <span class=\"flex items-center gap-2\">\n                        <lucide-icon [img]=\"Zap\" class=\"text-success size-3.5\" />\n                        <span>EV Public Charging</span>\n                      </span>\n                    </ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n                <p class=\"text-muted-foreground text-xs\">{{ categoryIrsInfo(formCategory()) }}</p>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n                <div class=\"space-y-1.5\">\n                  <label for=\"commute-date-input\" class=\"text-foreground text-xs font-medium\">\n                    Date of Commute <span class=\"text-destructive\">*</span>\n                  </label>\n                  <ui-input\n                    id=\"commute-date-input\"\n                    [value]=\"formDate()\"\n                    (valueChange)=\"formDate.set($event)\"\n                    type=\"date\"\n                    class=\"h-9 text-xs\"\n                  />\n                </div>\n                <div class=\"space-y-1.5\">\n                  <label for=\"commute-provider-input\" class=\"text-foreground text-xs font-medium\">\n                    Provider / Authority <span class=\"text-destructive\">*</span>\n                  </label>\n                  <ui-input\n                    id=\"commute-provider-input\"\n                    [value]=\"formProvider()\"\n                    (valueChange)=\"formProvider.set($event)\"\n                    placeholder=\"e.g. BART, Caltrain, EVgo\"\n                    class=\"h-9 text-xs\"\n                  />\n                </div>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label for=\"commute-desc-input\" class=\"text-foreground text-xs font-medium\">\n                  Claim Description & Route <span class=\"text-destructive\">*</span>\n                </label>\n                <ui-input\n                  id=\"commute-desc-input\"\n                  [value]=\"formDescription()\"\n                  (valueChange)=\"formDescription.set($event)\"\n                  placeholder=\"e.g. Monthly Clipper Pass · Embarcadero to Millbrae\"\n                  class=\"h-9 text-xs\"\n                />\n              </div>\n\n              @if (formCategory() === 'mileage') {\n                <div class=\"border-border bg-muted/30 space-y-2 rounded-lg border p-3\">\n                  <div class=\"flex items-center justify-between text-xs\">\n                    <span class=\"text-muted-foreground font-medium\">IRS Standard Mileage Rate</span>\n                    <span ui-badge wrap variant=\"outline\" class=\"text-xs font-normal\">$0.67 / mile</span>\n                  </div>\n                  <div class=\"flex items-center gap-3\">\n                    <div class=\"flex-1\">\n                      <label for=\"commute-miles-input\" class=\"text-muted-foreground text-xs\">Total Miles Driven</label>\n                      <ui-input\n                        id=\"commute-miles-input\"\n                        [value]=\"formMiles()\"\n                        (valueChange)=\"handleMilesInput($event)\"\n                        type=\"number\"\n                        class=\"mt-1 h-8 text-xs tabular-nums\"\n                      />\n                    </div>\n                    <div class=\"flex-1 text-right\">\n                      <span class=\"text-muted-foreground text-xs\">Calculated Total</span>\n                      <p class=\"text-foreground text-base font-bold tabular-nums\">\\${{ formAmount() }}</p>\n                    </div>\n                  </div>\n                </div>\n              }\n\n              <div class=\"space-y-1.5\">\n                <label for=\"commute-amount-input\" class=\"text-foreground text-xs font-medium\">\n                  Claim Amount (USD) <span class=\"text-destructive\">*</span>\n                </label>\n                <div class=\"relative\">\n                  <lucide-icon\n                    [img]=\"DollarSign\"\n                    class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-3.5 -translate-y-1/2\"\n                  />\n                  <ui-input\n                    id=\"commute-amount-input\"\n                    [value]=\"formAmount()\"\n                    (valueChange)=\"formAmount.set($event)\"\n                    type=\"text\"\n                    placeholder=\"0.00\"\n                    class=\"h-9 pl-8 text-xs font-semibold tabular-nums\"\n                  />\n                </div>\n                <div class=\"text-muted-foreground flex items-center justify-between text-xs\">\n                  <span>Maximum pre-tax monthly cap: $315.00</span>\n                  <span class=\"font-medium\">Direct Payroll Payout</span>\n                </div>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label class=\"text-foreground text-xs font-medium\">\n                  Itemized Receipt Attachment <span class=\"text-destructive\">*</span>\n                </label>\n                @if (formAttachedReceipt(); as receipt) {\n                  <div\n                    class=\"border-border bg-muted/40 flex items-center justify-between gap-3 rounded-lg border p-3 text-xs\"\n                  >\n                    <div class=\"flex min-w-0 items-center gap-2.5\">\n                      <div\n                        class=\"bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-md\"\n                      >\n                        <lucide-icon [img]=\"FileText\" class=\"size-4\" />\n                      </div>\n                      <div class=\"min-w-0\">\n                        <p class=\"text-foreground truncate font-medium\">{{ receipt.name }}</p>\n                        <p class=\"text-muted-foreground truncate\">{{ receipt.size }} · Itemized proof attached</p>\n                      </div>\n                    </div>\n                    <div class=\"flex items-center gap-1.5\">\n                      <span\n                        ui-badge\n                        wrap\n                        variant=\"outline\"\n                        class=\"border-success/30 bg-success/10 text-success text-xs\"\n                      >\n                        <lucide-icon [img]=\"Check\" class=\"mr-1 size-3\" />\n                        Valid\n                      </span>\n                      <button\n                        type=\"button\"\n                        ui-button\n                        variant=\"ghost\"\n                        size=\"icon-sm\"\n                        class=\"text-muted-foreground hover:text-foreground size-7\"\n                        (click)=\"handleRemoveReceipt()\"\n                      >\n                        <lucide-icon [img]=\"X\" class=\"size-3.5\" />\n                        <span class=\"sr-only\">Remove receipt</span>\n                      </button>\n                    </div>\n                  </div>\n                } @else {\n                  <button\n                    type=\"button\"\n                    class=\"border-border hover:bg-muted/40 hover:border-primary/50 focus-visible:ring-ring flex w-full flex-col items-center justify-center gap-1.5 rounded-lg border border-dashed p-4 text-center transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                    (click)=\"handleAttachSampleReceipt()\"\n                  >\n                    <div class=\"bg-muted text-muted-foreground flex size-8 items-center justify-center rounded-full\">\n                      <lucide-icon [img]=\"Upload\" class=\"size-4\" />\n                    </div>\n                    <p class=\"text-foreground text-xs font-medium\">Click to upload or drag receipt file</p>\n                    <p class=\"text-muted-foreground text-xs\">PDF, PNG, or JPG up to 10MB (Itemized proof required)</p>\n                  </button>\n                }\n              </div>\n            </div>\n\n            <div ui-card-footer class=\"border-border flex items-center justify-between border-t pt-4\">\n              <button type=\"button\" ui-button variant=\"ghost\" size=\"sm\" class=\"text-xs\" (click)=\"handleResetForm()\">\n                <lucide-icon [img]=\"RotateCcw\" class=\"mr-1.5 size-3.5\" />\n                Reset Form\n              </button>\n              <button\n                type=\"button\"\n                ui-button\n                size=\"sm\"\n                class=\"gap-1.5 text-xs shadow-xs\"\n                [disabled]=\"!formAmount() || (parseAmount() ?? 0) <= 0\"\n                (click)=\"handleSubmitClaim()\"\n              >\n                <lucide-icon [img]=\"Send\" class=\"size-3.5\" />\n                Submit Claim\n              </button>\n            </div>\n          </div>\n\n          <div ui-card class=\"border-border shadow-xs\">\n            <div ui-card-header class=\"pb-2\">\n              <div class=\"flex items-center gap-2\">\n                <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-4\" />\n                <h3 ui-card-title class=\"text-sm font-semibold\">Commuter Benefit Program Policy</h3>\n              </div>\n            </div>\n            <div ui-card-content class=\"space-y-2.5 text-xs\">\n              <p class=\"text-muted-foreground leading-relaxed\">\n                Expenses are reimbursed under Section 132(f) Qualified Transportation Fringe Benefits. Reimbursements\n                are disbursed directly into employee payroll on the 1st of every month.\n              </p>\n              <div class=\"border-border/60 text-muted-foreground space-y-1.5 border-t pt-2\">\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                  <span>Monthly maximum pre-tax election: $315.00</span>\n                </div>\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                  <span>Receipts must reflect date, transit authority, and paid amount</span>\n                </div>\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                  <span>Deadline for current month submissions: 25th of month</span>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Right Column: Expense Claims History Table -->\n        <div class=\"space-y-4 lg:col-span-7\">\n          <div ui-card class=\"border-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>\n                  <h3 ui-card-title class=\"text-base font-semibold\">Expense Claims History</h3>\n                  <p ui-card-description class=\"text-xs\">\n                    Itemized ledger of submitted commuter, transit, and EV expenses.\n                  </p>\n                </div>\n                <span ui-badge wrap variant=\"outline\" class=\"text-xs tabular-nums\">\n                  {{ claims().length }} Total Claims\n                </span>\n              </div>\n            </div>\n\n            <div ui-card-content class=\"space-y-4\">\n              <div\n                class=\"border-border bg-muted/20 flex flex-col gap-2.5 rounded-lg border p-2.5 sm:flex-row sm:items-center sm:justify-between\"\n              >\n                <div class=\"relative flex-1 sm:max-w-xs\">\n                  <lucide-icon\n                    [img]=\"Search\"\n                    class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\"\n                  />\n                  <ui-input\n                    [value]=\"searchQuery()\"\n                    (valueChange)=\"searchQuery.set($event)\"\n                    type=\"search\"\n                    placeholder=\"Search claims, ID, route...\"\n                    class=\"h-8 pl-8 text-xs\"\n                  />\n                </div>\n\n                <div class=\"flex flex-wrap items-center gap-2\">\n                  <ui-select [value]=\"categoryFilter()\" (valueChange)=\"categoryFilter.set($event)\">\n                    <button ui-select-trigger class=\"h-8 w-36 text-xs\">\n                      <ui-select-value placeholder=\"All Categories\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"all\">All Categories</ui-select-item>\n                      <ui-select-item value=\"transit\">Public Transit</ui-select-item>\n                      <ui-select-item value=\"parking\">Parking</ui-select-item>\n                      <ui-select-item value=\"mileage\">Mileage</ui-select-item>\n                      <ui-select-item value=\"ev_charging\">EV Charging</ui-select-item>\n                    </ui-select-content>\n                  </ui-select>\n\n                  <ui-select [value]=\"statusFilter()\" (valueChange)=\"statusFilter.set($event)\">\n                    <button ui-select-trigger class=\"h-8 w-36 text-xs\">\n                      <ui-select-value placeholder=\"All Statuses\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"all\">All Statuses</ui-select-item>\n                      <ui-select-item value=\"reimbursed\">Reimbursed</ui-select-item>\n                      <ui-select-item value=\"pending\">Pending</ui-select-item>\n                    </ui-select-content>\n                  </ui-select>\n\n                  @if (isFiltered()) {\n                    <button ui-button variant=\"ghost\" size=\"sm\" class=\"h-8 px-2 text-xs\" (click)=\"resetFilters()\">\n                      <lucide-icon [img]=\"RotateCcw\" class=\"mr-1 size-3\" />\n                      Reset\n                    </button>\n                  }\n                </div>\n              </div>\n\n              <div class=\"border-border overflow-hidden rounded-lg border\">\n                <div class=\"overflow-x-auto\">\n                  <table ui-table>\n                    <thead ui-table-header class=\"bg-muted/40\">\n                      <tr ui-table-row>\n                        <th ui-table-head class=\"min-w-[95px] text-xs\">Claim ID</th>\n                        <th ui-table-head class=\"min-w-[90px] text-xs\">Date</th>\n                        <th ui-table-head class=\"min-w-[110px] text-xs\">Category</th>\n                        <th ui-table-head class=\"min-w-[190px] text-xs\">Description & Provider</th>\n                        <th ui-table-head class=\"min-w-[90px] text-right text-xs\">Amount</th>\n                        <th ui-table-head class=\"min-w-[130px] text-xs\">Status</th>\n                        <th ui-table-head class=\"min-w-[80px] text-center text-xs\">Receipt</th>\n                        <th ui-table-head class=\"w-10 text-right text-xs\">\n                          <span class=\"sr-only\">Actions</span>\n                        </th>\n                      </tr>\n                    </thead>\n                    <tbody ui-table-body>\n                      @for (claim of filteredClaims(); track claim.id) {\n                        <tr ui-table-row class=\"hover:bg-muted/50 transition-colors\">\n                          <td ui-table-cell class=\"font-mono text-xs font-medium\">{{ claim.id }}</td>\n                          <td ui-table-cell class=\"text-muted-foreground text-xs whitespace-nowrap tabular-nums\">\n                            {{ claim.date }}\n                          </td>\n                          <td ui-table-cell>\n                            <span\n                              ui-badge\n                              wrap\n                              variant=\"outline\"\n                              [class]=\"'text-xs font-normal ' + categoryBadgeClass(claim.category)\"\n                            >\n                              @switch (claim.category) {\n                                @case ('transit') {\n                                  <lucide-icon [img]=\"Train\" class=\"mr-1 size-3\" />\n                                }\n                                @case ('parking') {\n                                  <lucide-icon [img]=\"Building2\" class=\"mr-1 size-3\" />\n                                }\n                                @case ('mileage') {\n                                  <lucide-icon [img]=\"Car\" class=\"mr-1 size-3\" />\n                                }\n                                @default {\n                                  <lucide-icon [img]=\"Zap\" class=\"mr-1 size-3\" />\n                                }\n                              }\n                              {{ claim.categoryLabel }}\n                            </span>\n                          </td>\n                          <td ui-table-cell>\n                            <div class=\"min-w-0\">\n                              <p class=\"text-foreground truncate text-xs font-medium\">{{ claim.description }}</p>\n                              <p class=\"text-muted-foreground truncate text-xs\">{{ claim.provider }}</p>\n                            </div>\n                          </td>\n                          <td\n                            ui-table-cell\n                            class=\"text-foreground text-right text-xs font-semibold whitespace-nowrap tabular-nums\"\n                          >\n                            \\${{ claim.amount.toFixed(2) }}\n                          </td>\n                          <td ui-table-cell>\n                            <span\n                              ui-badge\n                              wrap\n                              variant=\"outline\"\n                              [class]=\"'text-xs font-medium ' + statusClass(claim.status)\"\n                            >\n                              <span\n                                [class]=\"statusDot(claim.status)\"\n                                aria-hidden=\"true\"\n                              ></span>\n                              {{ claim.statusLabel }}\n                            </span>\n                          </td>\n                          <td ui-table-cell class=\"text-center\">\n                            <button\n                              ui-button\n                              aria-label=\"Attach file\"\n                              variant=\"ghost\"\n                              size=\"sm\"\n                              class=\"h-7 px-2 text-xs\"\n                              (click)=\"openReceipt(claim)\"\n                            >\n                              <lucide-icon [img]=\"Paperclip\" class=\"text-muted-foreground mr-1 size-3\" />\n                              <span>View</span>\n                            </button>\n                          </td>\n                          <td ui-table-cell class=\"text-right\">\n                            <ui-dropdown-menu>\n                              <button\n                                ui-button\n                                ui-dropdown-menu-trigger\n                                variant=\"ghost\"\n                                size=\"icon-sm\"\n                                class=\"text-muted-foreground hover:text-foreground size-7\"\n                              >\n                                <lucide-icon [img]=\"Eye\" class=\"size-3.5\" />\n                                <span class=\"sr-only\">Actions for {{ claim.id }}</span>\n                              </button>\n                              <ui-dropdown-menu-content align=\"end\" class=\"w-44\">\n                                <ui-dropdown-menu-item class=\"cursor-pointer text-xs\" (select)=\"openReceipt(claim)\">\n                                  <lucide-icon [img]=\"Receipt\" class=\"mr-2 size-3.5\" />\n                                  <span>Inspect Receipt</span>\n                                </ui-dropdown-menu-item>\n                                <ui-dropdown-menu-item class=\"cursor-pointer text-xs\">\n                                  <lucide-icon [img]=\"FileCheck\" class=\"mr-2 size-3.5\" />\n                                  <span>Policy Audit Log</span>\n                                </ui-dropdown-menu-item>\n                                <ui-dropdown-menu-separator />\n                                <ui-dropdown-menu-item class=\"cursor-pointer text-xs\">\n                                  <lucide-icon [img]=\"Download\" class=\"mr-2 size-3.5\" />\n                                  <span>Download Voucher</span>\n                                </ui-dropdown-menu-item>\n                              </ui-dropdown-menu-content>\n                            </ui-dropdown-menu>\n                          </td>\n                        </tr>\n                      }\n                      @if (filteredClaims().length === 0) {\n                        <tr ui-table-row>\n                          <td ui-table-cell [attr.colspan]=\"8\" class=\"h-32 text-center\">\n                            <div class=\"flex flex-col items-center justify-center gap-1.5\">\n                              <lucide-icon [img]=\"Search\" class=\"text-muted-foreground/50 size-5\" />\n                              <p class=\"text-foreground text-xs font-medium\">No commute claims found</p>\n                              <p class=\"text-muted-foreground text-xs\">Try resetting your category or status filter</p>\n                              <button\n                                ui-button\n                                variant=\"outline\"\n                                size=\"sm\"\n                                class=\"mt-1 h-7 text-xs\"\n                                (click)=\"resetFilters()\"\n                              >\n                                Reset filters\n                              </button>\n                            </div>\n                          </td>\n                        </tr>\n                      }\n                    </tbody>\n                  </table>\n                </div>\n\n                <div\n                  class=\"border-border bg-muted/20 text-muted-foreground flex flex-col items-center justify-between gap-2 border-t px-3 py-2 text-xs sm:flex-row\"\n                >\n                  <p class=\"tabular-nums\">\n                    Showing <span class=\"text-foreground font-medium\">{{ filteredClaims().length }}</span> of\n                    <span class=\"text-foreground font-medium\">{{ claims().length }}</span> claims\n                  </p>\n                  <div class=\"flex items-center gap-3\">\n                    <span class=\"tabular-nums\">\n                      Filtered Total:\n                      <span class=\"text-foreground font-semibold\">\\${{ filteredTotal().toFixed(2) }}</span>\n                    </span>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Receipt Details Modal Dialog -->\n      <ui-dialog [open]=\"isReceiptModalOpen()\" (openChange)=\"isReceiptModalOpen.set($event)\">\n        <ui-dialog-content class=\"sm:max-w-md\">\n          <div ui-dialog-header>\n            <div class=\"flex items-center justify-between pr-4\">\n              <div class=\"space-y-0.5\">\n                <h2 ui-dialog-title class=\"text-base font-bold\">Commute Receipt Voucher</h2>\n                <p ui-dialog-description class=\"text-xs\">IRS-compliant proof of transit and commuter benefit claim.</p>\n              </div>\n              <span ui-badge wrap variant=\"outline\" class=\"font-mono text-xs\">{{ selectedClaim().id }}</span>\n            </div>\n          </div>\n\n          <div class=\"space-y-4 py-2 text-xs\">\n            <div class=\"border-border bg-muted/30 space-y-3 rounded-lg border p-3.5\">\n              <div class=\"flex items-center justify-between border-b pb-2\">\n                <div class=\"flex items-center gap-2\">\n                  @switch (selectedClaim().category) {\n                    @case ('transit') {\n                      <lucide-icon [img]=\"Train\" class=\"text-primary size-4\" />\n                    }\n                    @case ('parking') {\n                      <lucide-icon [img]=\"Building2\" class=\"text-primary size-4\" />\n                    }\n                    @case ('mileage') {\n                      <lucide-icon [img]=\"Car\" class=\"text-primary size-4\" />\n                    }\n                    @default {\n                      <lucide-icon [img]=\"Zap\" class=\"text-primary size-4\" />\n                    }\n                  }\n                  <span class=\"text-foreground font-semibold\">{{ selectedClaim().provider }}</span>\n                </div>\n                <span ui-badge wrap [class]=\"'text-xs font-normal ' + statusClass(selectedClaim().status)\">\n                  {{ selectedClaim().statusLabel }}\n                </span>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-2 text-xs sm:grid-cols-2\">\n                <div>\n                  <span class=\"text-muted-foreground block\">Transaction Date</span>\n                  <span class=\"text-foreground font-medium\">{{ selectedClaim().receiptDate }}</span>\n                </div>\n                <div>\n                  <span class=\"text-muted-foreground block\">Benefit Category</span>\n                  <span class=\"text-foreground font-medium\">{{ selectedClaim().categoryLabel }}</span>\n                </div>\n                <div class=\"sm:col-span-2\">\n                  <span class=\"text-muted-foreground block\">Line Item Description</span>\n                  <span class=\"text-foreground font-medium\">{{ selectedClaim().description }}</span>\n                </div>\n                <div class=\"sm:col-span-2\">\n                  <span class=\"text-muted-foreground block\">Employee Commute Note</span>\n                  <span class=\"text-muted-foreground italic\">\"{{ selectedClaim().notes }}\"</span>\n                </div>\n              </div>\n\n              <ui-separator />\n\n              <div class=\"space-y-1.5 text-xs\">\n                <div class=\"text-muted-foreground flex justify-between\">\n                  <span>Base Fare / Charge</span>\n                  <span class=\"font-mono tabular-nums\">\\${{ selectedClaim().amount.toFixed(2) }}</span>\n                </div>\n                <div class=\"text-muted-foreground flex justify-between\">\n                  <span>Pre-Tax IRS Exemption (IRC § 132f)</span>\n                  <span class=\"text-success font-mono tabular-nums\">-$0.00 (Tax Free)</span>\n                </div>\n                <div class=\"border-border flex justify-between border-t pt-1.5 text-sm font-bold\">\n                  <span class=\"text-foreground\">Total Reimbursable Amount</span>\n                  <span class=\"text-foreground font-mono tabular-nums\">\\${{ selectedClaim().amount.toFixed(2) }}</span>\n                </div>\n              </div>\n\n              <div class=\"border-border bg-background flex items-center justify-between rounded-md border p-2 text-xs\">\n                <div class=\"flex items-center gap-2\">\n                  <lucide-icon [img]=\"FileText\" class=\"text-primary size-3.5\" />\n                  <span class=\"font-mono text-xs\">{{ selectedClaim().receiptFileName }}</span>\n                  <span class=\"text-muted-foreground\">({{ selectedClaim().receiptFileSize }})</span>\n                </div>\n                <span ui-badge wrap variant=\"outline\" class=\"border-success/30 bg-success/10 text-success text-xs\">\n                  <lucide-icon [img]=\"ShieldCheck\" class=\"mr-1 size-3\" />\n                  Verified\n                </span>\n              </div>\n            </div>\n          </div>\n\n          <div ui-dialog-footer class=\"flex sm:justify-between\">\n            <button ui-button variant=\"outline\" size=\"sm\" class=\"text-xs\" (click)=\"isReceiptModalOpen.set(false)\">\n              Close\n            </button>\n            <button\n              ui-button\n              aria-label=\"Download attachment\"\n              size=\"sm\"\n              class=\"gap-1.5 text-xs\"\n              (click)=\"isReceiptModalOpen.set(false)\"\n            >\n              <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n              Download Receipt PDF\n            </button>\n          </div>\n        </ui-dialog-content>\n      </ui-dialog>\n    </div>\n  `,\n})\nexport class UiCommuteReimbursementClaimsComponent {\n  protected readonly Building2 = Building2\n  protected readonly Calendar = Calendar\n  protected readonly Car = Car\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly DollarSign = DollarSign\n  protected readonly Download = Download\n  protected readonly Eye = Eye\n  protected readonly FileCheck = FileCheck\n  protected readonly FileText = FileText\n  protected readonly Paperclip = Paperclip\n  protected readonly Plus = Plus\n  protected readonly Receipt = Receipt\n  protected readonly RotateCcw = RotateCcw\n  protected readonly Search = Search\n  protected readonly Send = Send\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Train = Train\n  protected readonly TrendingUp = TrendingUp\n  protected readonly Upload = Upload\n  protected readonly Wallet = Wallet\n  protected readonly X = X\n  protected readonly Zap = Zap\n\n  @Input() title = 'Commute & Transit Expense Claims'\n  @Input() policyText = 'Monthly Commuter Benefit Program · Up to $315.00/mo IRS pre-tax limit'\n  @Input() claimPeriod = 'August 2026'\n  @Input() set initialClaims(v: ExpenseClaim[] | undefined) {\n    if (v) {\n      this.claims.set(v.map((c) => ({ ...c })))\n      if (v.length > 0) this.selectedClaim.set({ ...v[0] })\n    }\n  }\n  @Input('class') className?: string\n\n  readonly claims = signal<ExpenseClaim[]>(defaultClaims.map((c) => ({ ...c })))\n\n  readonly formCategory = signal<CommuteCategory>('transit')\n  readonly formDate = signal('2026-08-20')\n  readonly formProvider = signal('BART Clipper Card')\n  readonly formDescription = signal('Monthly BART Clipper Card Pass')\n  readonly formAmount = signal('120.00')\n  readonly formMiles = signal('45')\n  readonly formAttachedReceipt = signal<{ name: string; size: string } | null>({\n    name: 'clipper-reload-receipt.pdf',\n    size: '240 KB',\n  })\n  readonly formSubmittedNotice = signal(false)\n  readonly recentlySubmittedClaimId = signal('')\n\n  readonly searchQuery = signal('')\n  readonly categoryFilter = signal('all')\n  readonly statusFilter = signal('all')\n\n  readonly isReceiptModalOpen = signal(false)\n  readonly selectedClaim = signal<ExpenseClaim>({ ...defaultClaims[0] })\n\n  readonly isFiltered = computed(() => {\n    return this.searchQuery().trim() !== '' || this.categoryFilter() !== 'all' || this.statusFilter() !== 'all'\n  })\n\n  readonly filteredClaims = computed(() => {\n    const q = this.searchQuery().trim().toLowerCase()\n    return this.claims().filter((claim) => {\n      const matchCat = this.categoryFilter() === 'all' || claim.category === this.categoryFilter()\n      const matchStatus = this.statusFilter() === 'all' || claim.status === this.statusFilter()\n      const matchQuery =\n        !q ||\n        claim.id.toLowerCase().includes(q) ||\n        claim.description.toLowerCase().includes(q) ||\n        claim.provider.toLowerCase().includes(q) ||\n        claim.categoryLabel.toLowerCase().includes(q)\n      return matchCat && matchStatus && matchQuery\n    })\n  })\n\n  readonly filteredTotal = computed(() => this.filteredClaims().reduce((acc, c) => acc + c.amount, 0))\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  categoryBadgeClass(cat: CommuteCategory): string {\n    return categoryBadge[cat]\n  }\n\n  categoryIrsInfo(cat: CommuteCategory): string {\n    return categoryIrsInfo[cat]\n  }\n\n  statusClass(status: ClaimStatus): string {\n    return statusStyles[status]\n  }\n\n  statusDot(status: ClaimStatus): string {\n    return cn('mr-1.5 size-1.5 rounded-full', statusDots[status])\n  }\n\n  parseAmount(): number {\n    return parseFloat(this.formAmount()) || 0\n  }\n\n  openReceipt(claim: ExpenseClaim): void {\n    this.selectedClaim.set(claim)\n    this.isReceiptModalOpen.set(true)\n  }\n\n  handleCategoryChange(val: string): void {\n    const next = val as CommuteCategory\n    this.formCategory.set(next)\n    if (next === 'transit') {\n      this.formProvider.set('BART Clipper Card')\n      this.formDescription.set('Monthly BART Clipper Card Pass')\n      this.formAmount.set('120.00')\n    } else if (next === 'parking') {\n      this.formProvider.set('Downtown Station Garage')\n      this.formDescription.set('Monthly Station Parking Permit')\n      this.formAmount.set('65.00')\n    } else if (next === 'mileage') {\n      this.formProvider.set('Personal Vehicle (IRS Standard Rate)')\n      this.formDescription.set('Commute detour travel to client site')\n      this.updateMileageAmount()\n    } else if (next === 'ev_charging') {\n      this.formProvider.set('EVgo Fast Charging')\n      this.formDescription.set('Workplace EV public charging sessions')\n      this.formAmount.set('42.00')\n    }\n  }\n\n  handleMilesInput(val: string): void {\n    this.formMiles.set(val)\n    this.updateMileageAmount()\n  }\n\n  updateMileageAmount(): void {\n    const miles = parseFloat(this.formMiles()) || 0\n    this.formAmount.set((miles * 0.67).toFixed(2))\n  }\n\n  handleAttachSampleReceipt(): void {\n    this.formAttachedReceipt.set({\n      name: `receipt-${this.formCategory()}-${Date.now().toString().slice(-4)}.pdf`,\n      size: '318 KB',\n    })\n  }\n\n  handleRemoveReceipt(): void {\n    this.formAttachedReceipt.set(null)\n  }\n\n  handleSubmitClaim(): void {\n    const parsedAmt = parseFloat(this.formAmount()) || 0\n    if (parsedAmt <= 0) return\n    const meta: Record<CommuteCategory, string> = {\n      transit: 'Public Transit',\n      parking: 'Parking',\n      mileage: 'Mileage',\n      ev_charging: 'EV Charging',\n    }\n    const fallbackLabel: Record<CommuteCategory, string> = {\n      transit: 'Public Transit Pass: BART/Metro',\n      parking: 'Parking (Station & Garage)',\n      mileage: 'Mileage (IRS $0.67/mi)',\n      ev_charging: 'EV Public Charging',\n    }\n    const cat = this.formCategory()\n    const newId = `CLM-${Math.floor(8200 + Math.random() * 700)}`\n    const newClaim: ExpenseClaim = {\n      id: newId,\n      date: 'Aug 21, 2026',\n      category: cat,\n      categoryLabel: meta[cat],\n      description: this.formDescription() || fallbackLabel[cat],\n      provider: this.formProvider() || 'Transit Provider',\n      amount: parsedAmt,\n      status: 'pending',\n      statusLabel: 'Pending Approval',\n      receiptFileName: this.formAttachedReceipt()?.name || 'commute-claim-receipt.pdf',\n      receiptFileSize: this.formAttachedReceipt()?.size || '290 KB',\n      receiptDate: 'Aug 21, 2026 · Just now',\n      notes: `Submitted via Commuter Benefit Portal for ${this.claimPeriod}.`,\n    }\n    this.claims.update((prev) => [newClaim, ...prev])\n    this.recentlySubmittedClaimId.set(newId)\n    this.formSubmittedNotice.set(true)\n    setTimeout(() => this.formSubmittedNotice.set(false), 6000)\n  }\n\n  handleResetForm(): void {\n    this.formCategory.set('transit')\n    this.formDate.set('2026-08-20')\n    this.formProvider.set('BART Clipper Card')\n    this.formDescription.set('Monthly BART Clipper Card Pass')\n    this.formAmount.set('120.00')\n    this.formMiles.set('45')\n    this.formAttachedReceipt.set({ name: 'clipper-reload-receipt.pdf', size: '240 KB' })\n    this.formSubmittedNotice.set(false)\n  }\n\n  resetFilters(): void {\n    this.searchQuery.set('')\n    this.categoryFilter.set('all')\n    this.statusFilter.set('all')\n  }\n\n  scrollToSubmitForm(): void {\n    const el = document.getElementById('commute-submit-form')\n    if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' })\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/commute-reimbursement-claims/commute-reimbursement-claims.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/commute-reimbursement-claims/index.ts",
      "content": "export {\n  UiCommuteReimbursementClaimsComponent,\n  type CommuteCategory,\n  type ClaimStatus,\n  type ExpenseClaim,\n} from './commute-reimbursement-claims.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/commute-reimbursement-claims/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/dialog.json",
    "https://uipkge.dev/r/angular/dropdown-menu.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "Monthly commuter transit pass, mileage, and EV charging expense claim reimbursement portal with IRS pre-tax allowance metrics, claim submission form with receipt dropzone, and claims history ledger.",
  "categories": [
    "hr",
    "app",
    "finance"
  ]
}