{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "dispatch-assignment-board",
  "title": "Dispatch Assignment Board",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/dispatch-assignment-board/dispatch-assignment-board.component.ts",
      "content": "// Last-mile route dispatching, delivery driver stop sequencing, and vehicle payload load\n// balancing: live dispatch overview KPIs, zone filtering, AI route auto-sequencing, and driver\n// route cards with vehicle payload load balancing, live progress tracking, interactive stops\n// timeline, driver communications, and telemetry actions. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, DestroyRef, Input, computed, inject, signal } from '@angular/core'\nimport {\n  ArrowRightLeft,\n  BatteryCharging,\n  Check,\n  CheckCircle2,\n  Clock,\n  Download,\n  Fuel,\n  Gauge,\n  LucideAngularModule,\n  MapPin,\n  Navigation,\n  PackageCheck,\n  Phone,\n  PhoneCall,\n  Search,\n  ShieldCheck,\n  Truck,\n  X,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiAvatarComponent, UiAvatarFallbackComponent } from '@/ui/avatar/avatar.component'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardFooterComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectGroupComponent,\n  UiSelectItemComponent,\n  UiSelectLabelComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\n\nexport type StopStatus = 'delivered' | 'in_progress' | 'pending'\n\nexport interface RouteStop {\n  id: string\n  sequence: number\n  locationName: string\n  address: string\n  status: StopStatus\n  deliveredTime?: string\n  estimatedTime?: string\n  packagesCount: number\n  packageType: string\n  notes?: string\n  recipient?: string\n}\n\nexport interface DriverRoute {\n  id: string\n  routeCode: string\n  routeName: string\n  zone: string\n  driver: {\n    name: string\n    avatar?: string\n    initials: string\n    phone: string\n    status: 'on_route' | 'break' | 'loading'\n    radioChannel: string\n  }\n  vehicle: {\n    name: string\n    type: string\n    plateNumber: string\n    powerLevel: string\n    powerType: 'electric' | 'diesel'\n  }\n  completedStops: number\n  totalStops: number\n  currentPayloadLbs: number\n  maxPayloadLbs: number\n  shiftWindow: string\n  estimatedCompletion: string\n  telemetry: {\n    speed: string\n    heading: string\n    currentLocation: string\n    lastPing: string\n    signal: string\n  }\n  stops: RouteStop[]\n}\n\nexport interface ActiveModalState {\n  type: 'gps' | 'call' | 'reassign'\n  route: DriverRoute\n  targetRouteId?: string\n}\n\nexport const DRIVER_ROUTES_DATA: DriverRoute[] = [\n  {\n    id: 'route-01',\n    routeCode: 'Route #01',\n    routeName: 'Downtown Metro',\n    zone: 'Metro Los Angeles - North Zone',\n    driver: {\n      name: 'Elena Rostova',\n      initials: 'ER',\n      phone: '+1 (213) 555-0182',\n      status: 'on_route',\n      radioChannel: 'Ch 4 · North Dispatch',\n    },\n    vehicle: {\n      name: 'Ford Transit #204',\n      type: 'EV Cargo Van',\n      plateNumber: 'CA-8KDX92',\n      powerLevel: '74% Battery',\n      powerType: 'electric',\n    },\n    completedStops: 18,\n    totalStops: 24,\n    currentPayloadLbs: 1850,\n    maxPayloadLbs: 2200,\n    shiftWindow: '07:30 AM – 16:30 PM',\n    estimatedCompletion: '15:45 PM',\n    telemetry: {\n      speed: '32 mph',\n      heading: 'NW 315°',\n      currentLocation: 'Grand Ave & 5th St, Los Angeles, CA 90071',\n      lastPing: '12s ago',\n      signal: '5G Active',\n    },\n    stops: [\n      {\n        id: 'r1-s1',\n        sequence: 1,\n        locationName: 'Acme Industrial Hub',\n        address: '1240 S Santa Fe Ave',\n        status: 'delivered',\n        deliveredTime: '09:15 AM',\n        packagesCount: 12,\n        packageType: 'Cartons',\n        recipient: 'Signed by J. Miller',\n      },\n      {\n        id: 'r1-s2',\n        sequence: 2,\n        locationName: 'Apex Tech Campus',\n        address: '800 Wilshire Blvd, Ste 400',\n        status: 'delivered',\n        deliveredTime: '10:45 AM',\n        packagesCount: 8,\n        packageType: 'Parcels',\n        recipient: 'Dock 4B Security',\n      },\n      {\n        id: 'r1-s3',\n        sequence: 3,\n        locationName: 'Metro Distribution Center',\n        address: '1950 E 7th St',\n        status: 'in_progress',\n        estimatedTime: '14:15 PM',\n        packagesCount: 15,\n        packageType: 'Heavy Boxes',\n        notes: 'Priority Rush · Forklift offload requested',\n      },\n      {\n        id: 'r1-s4',\n        sequence: 4,\n        locationName: 'Pasadena Hospital Supply',\n        address: '650 S Raymond Ave',\n        status: 'pending',\n        packagesCount: 2,\n        packageType: 'Medical Coolers',\n        notes: 'Cold-Chain · Temperature Log Required',\n      },\n    ],\n  },\n  {\n    id: 'route-02',\n    routeCode: 'Route #02',\n    routeName: 'Westside & Santa Monica',\n    zone: 'Metro Los Angeles - North Zone',\n    driver: {\n      name: 'Marcus Vance',\n      initials: 'MV',\n      phone: '+1 (310) 555-0194',\n      status: 'on_route',\n      radioChannel: 'Ch 2 · West Dispatch',\n    },\n    vehicle: {\n      name: 'Mercedes Sprinter #118',\n      type: 'High-Roof Van',\n      plateNumber: 'CA-9TMR44',\n      powerLevel: '68% Fuel',\n      powerType: 'diesel',\n    },\n    completedStops: 22,\n    totalStops: 26,\n    currentPayloadLbs: 2450,\n    maxPayloadLbs: 3000,\n    shiftWindow: '08:00 AM – 17:00 PM',\n    estimatedCompletion: '16:15 PM',\n    telemetry: {\n      speed: '28 mph',\n      heading: 'W 270°',\n      currentLocation: 'Ocean Ave & Colorado Ave, Santa Monica, CA',\n      lastPing: '8s ago',\n      signal: '5G Active',\n    },\n    stops: [\n      {\n        id: 'r2-s1',\n        sequence: 1,\n        locationName: 'Pacific Design Center',\n        address: '8687 Melrose Ave',\n        status: 'delivered',\n        deliveredTime: '09:40 AM',\n        packagesCount: 6,\n        packageType: 'Crates',\n        recipient: 'Direct Receipt · Bay 2',\n      },\n      {\n        id: 'r2-s2',\n        sequence: 2,\n        locationName: 'Oceanview Medical Plaza',\n        address: '1301 20th St, Floor 3',\n        status: 'delivered',\n        deliveredTime: '11:20 AM',\n        packagesCount: 14,\n        packageType: 'Packages',\n        recipient: 'Receptionist Amy K.',\n      },\n      {\n        id: 'r2-s3',\n        sequence: 3,\n        locationName: 'Santa Monica Pier Logistics',\n        address: '200 Santa Monica Pier',\n        status: 'in_progress',\n        estimatedTime: '14:40 PM',\n        packagesCount: 4,\n        packageType: 'Cartons',\n        notes: 'Dock Bay 2 · Access Gate Code #4491',\n      },\n      {\n        id: 'r2-s4',\n        sequence: 4,\n        locationName: 'Silicon Beach Incubator',\n        address: '12020 Ocean Park Blvd',\n        status: 'pending',\n        packagesCount: 5,\n        packageType: 'Parcels',\n        notes: 'Signature Required · 5th Floor Suite 500',\n      },\n    ],\n  },\n  {\n    id: 'route-03',\n    routeCode: 'Route #03',\n    routeName: 'Pasadena & Glendale',\n    zone: 'San Fernando Valley Hub',\n    driver: {\n      name: 'Sofia Chen',\n      initials: 'SC',\n      phone: '+1 (626) 555-0147',\n      status: 'on_route',\n      radioChannel: 'Ch 5 · Valley Dispatch',\n    },\n    vehicle: {\n      name: 'Ram ProMaster #309',\n      type: 'Electric Courier',\n      plateNumber: 'CA-7KPL55',\n      powerLevel: '82% Battery',\n      powerType: 'electric',\n    },\n    completedStops: 14,\n    totalStops: 20,\n    currentPayloadLbs: 1620,\n    maxPayloadLbs: 2100,\n    shiftWindow: '08:15 AM – 16:45 PM',\n    estimatedCompletion: '16:30 PM',\n    telemetry: {\n      speed: '38 mph',\n      heading: 'E 090°',\n      currentLocation: 'Colorado Blvd & Lake Ave, Pasadena, CA',\n      lastPing: '18s ago',\n      signal: '5G Active',\n    },\n    stops: [\n      {\n        id: 'r3-s1',\n        sequence: 1,\n        locationName: 'Glendale Aerospace Labs',\n        address: '4300 San Fernando Rd',\n        status: 'delivered',\n        deliveredTime: '10:05 AM',\n        packagesCount: 3,\n        packageType: 'Heavy Units',\n        recipient: 'Forklift Bay Delivery',\n      },\n      {\n        id: 'r3-s2',\n        sequence: 2,\n        locationName: 'Foothill Commercial Park',\n        address: '2210 Foothill Blvd',\n        status: 'delivered',\n        deliveredTime: '11:50 AM',\n        packagesCount: 9,\n        packageType: 'Boxes',\n        recipient: 'Suite 200 Mailroom',\n      },\n      {\n        id: 'r3-s3',\n        sequence: 3,\n        locationName: 'Huntington Research Institute',\n        address: '1151 Oxford Rd',\n        status: 'in_progress',\n        estimatedTime: '14:25 PM',\n        packagesCount: 6,\n        packageType: 'Lab Samples',\n        notes: 'Fragile · Bio-Sample Insulated Crate',\n      },\n      {\n        id: 'r3-s4',\n        sequence: 4,\n        locationName: 'Old Town Commerce Plaza',\n        address: '300 E Colorado Blvd',\n        status: 'pending',\n        packagesCount: 4,\n        packageType: 'Packages',\n        notes: 'Front Desk Drop · Notify Concierge',\n      },\n    ],\n  },\n  {\n    id: 'route-04',\n    routeCode: 'Route #04',\n    routeName: 'South Bay Logistics',\n    zone: 'Metro Los Angeles - South Zone',\n    driver: {\n      name: 'Tariq Mansour',\n      initials: 'TM',\n      phone: '+1 (424) 555-0133',\n      status: 'on_route',\n      radioChannel: 'Ch 3 · South Dispatch',\n    },\n    vehicle: {\n      name: 'Freightliner Custom #412',\n      type: 'Box Truck',\n      plateNumber: 'CA-5WXZ91',\n      powerLevel: '88% Fuel',\n      powerType: 'diesel',\n    },\n    completedStops: 19,\n    totalStops: 22,\n    currentPayloadLbs: 3100,\n    maxPayloadLbs: 3800,\n    shiftWindow: '07:00 AM – 16:00 PM',\n    estimatedCompletion: '15:20 PM',\n    telemetry: {\n      speed: '45 mph',\n      heading: 'S 180°',\n      currentLocation: 'I-405 Southbound at Carson St, CA',\n      lastPing: '5s ago',\n      signal: '5G Active',\n    },\n    stops: [\n      {\n        id: 'r4-s1',\n        sequence: 1,\n        locationName: 'Port of LA Cargo Terminal',\n        address: '425 S Palos Verdes St',\n        status: 'delivered',\n        deliveredTime: '08:30 AM',\n        packagesCount: 18,\n        packageType: 'Pallets',\n        recipient: 'Customs Manifest #882',\n      },\n      {\n        id: 'r4-s2',\n        sequence: 2,\n        locationName: 'Torrance Industrial Park',\n        address: '190th St & Western Ave',\n        status: 'delivered',\n        deliveredTime: '10:15 AM',\n        packagesCount: 11,\n        packageType: 'Crates',\n        recipient: 'Security Gate 5',\n      },\n      {\n        id: 'r4-s3',\n        sequence: 3,\n        locationName: 'Long Beach Tech Hub',\n        address: '100 W Ocean Blvd',\n        status: 'in_progress',\n        estimatedTime: '14:50 PM',\n        packagesCount: 8,\n        packageType: 'Hardware Cases',\n        notes: 'Server Equipment · Handle with Care',\n      },\n      {\n        id: 'r4-s4',\n        sequence: 4,\n        locationName: 'Manhattan Beach Retail Depot',\n        address: '3200 Sepulveda Blvd',\n        status: 'pending',\n        packagesCount: 6,\n        packageType: 'Store Parcels',\n        notes: 'Store Receiving · Rear Loading Dock',\n      },\n    ],\n  },\n]\n\nconst ZONE_OPTIONS = [\n  'Metro Los Angeles - North Zone',\n  'Metro Los Angeles - South Zone',\n  'San Fernando Valley Hub',\n  'Orange County Central',\n]\n\nexport type DispatchFilter = 'all' | 'in_transit' | 'high_load' | 'near_complete'\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-dispatch-assignment-board, [ui-dispatch-assignment-board]',\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    UiAvatarComponent,\n    UiAvatarFallbackComponent,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardFooterComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiProgressComponent,\n    UiSelectComponent,\n    UiSelectContentComponent,\n    UiSelectGroupComponent,\n    UiSelectItemComponent,\n    UiSelectLabelComponent,\n    UiSelectTriggerComponent,\n    UiSelectValueComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <div data-slot=\"dispatch-assignment-board\" [class]=\"rootClass\">\n      <!-- Header Section -->\n      <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex flex-wrap items-center gap-2\">\n            <div\n              class=\"bg-success/10 text-success flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-semibold\"\n            >\n              <span class=\"relative flex h-2 w-2\">\n                <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                <span class=\"bg-success relative inline-flex h-2 w-2 rounded-full\"></span>\n              </span>\n              <span>Live Dispatch Operations</span>\n            </div>\n            <div class=\"text-muted-foreground flex items-center gap-1 text-xs\">\n              <lucide-icon [img]=\"Clock\" class=\"size-3.5\" />\n              <span class=\"font-mono tabular-nums\">Today · Aug 21, 2026</span>\n            </div>\n          </div>\n          <h1 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n            Delivery Dispatch & Route Optimization\n          </h1>\n          <p class=\"text-muted-foreground text-xs sm:text-sm\">\n            Last-mile route sequencing, real-time stop execution, and vehicle payload load balancing.\n          </p>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <div class=\"w-full sm:w-64\">\n            <ui-select [value]=\"selectedZone()\" (valueChange)=\"selectedZone.set($event)\">\n              <button ui-select-trigger class=\"h-9 w-full text-xs font-medium\" aria-label=\"Select Dispatch Zone\">\n                <ui-select-value placeholder=\"Select Zone\" />\n              </button>\n              <ui-select-content>\n                <ui-select-group>\n                  <ui-select-label class=\"text-xs\">Dispatch Zones</ui-select-label>\n                  <ui-select-item value=\"all\" class=\"text-xs\">All Dispatch Zones</ui-select-item>\n                  @for (zone of zoneOptions; track zone) {\n                    <ui-select-item [value]=\"zone\" class=\"text-xs\">{{ zone }}</ui-select-item>\n                  }\n                </ui-select-group>\n              </ui-select-content>\n            </ui-select>\n          </div>\n\n          <button\n            ui-button\n            aria-label=\"Download attachment\"\n            variant=\"outline\"\n            size=\"sm\"\n            class=\"h-9 gap-1.5 text-xs font-medium\"\n            (click)=\"handleExportManifests()\"\n          >\n            <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n            <span>Export Manifests</span>\n          </button>\n\n          <button\n            ui-button\n            size=\"sm\"\n            class=\"h-9 gap-1.5 text-xs font-medium shadow-xs\"\n            [disabled]=\"isOptimizing()\"\n            (click)=\"handleAutoOptimize()\"\n          >\n            <lucide-icon [img]=\"Navigation\" [class]=\"optimizeIconClass\" />\n            <span>{{ isOptimizing() ? 'Optimizing Routes...' : 'Auto-Optimize Routes' }}</span>\n          </button>\n        </div>\n      </div>\n\n      <!-- Notification Banner -->\n      @if (notificationBanner(); as banner) {\n        <div [class]=\"bannerClass(banner.type)\">\n          <div class=\"flex items-start gap-2.5\">\n            @if (banner.type === 'success') {\n              <lucide-icon [img]=\"CheckCircle2\" class=\"text-success mt-0.5 size-4 shrink-0\" />\n            } @else {\n              <lucide-icon [img]=\"PackageCheck\" class=\"text-primary mt-0.5 size-4 shrink-0\" />\n            }\n            <div>\n              <span class=\"font-semibold\">{{ banner.title }}:</span>\n              <span class=\"text-muted-foreground dark:text-foreground/80 ml-1\">{{ banner.message }}</span>\n            </div>\n          </div>\n          <button\n            aria-label=\"Dismiss notification\"\n            type=\"button\"\n            class=\"text-muted-foreground hover:text-foreground transition-colors\"\n            (click)=\"notificationBanner.set(null)\"\n          >\n            <lucide-icon [img]=\"X\" class=\"size-4\" />\n          </button>\n        </div>\n      }\n\n      <!-- Dispatch Overview KPI Cards (4 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-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium\">Total Routes Active</h3>\n            <div class=\"bg-primary/10 text-primary flex h-8 w-8 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"Truck\" class=\"size-4\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-1.5\">\n            <div class=\"flex items-baseline gap-2\">\n              <span class=\"text-foreground font-mono text-2xl font-bold tracking-tight tabular-nums\">8</span>\n              <span class=\"text-muted-foreground text-xs font-medium\">routes dispatched</span>\n            </div>\n            <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n              <span\n                ui-badge\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success h-5 px-1.5 text-xs font-medium\"\n              >\n                6 In Transit\n              </span>\n              <span>2 loading at hub</span>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium\">Total Stops Remaining</h3>\n            <div class=\"bg-info/10 text-info flex h-8 w-8 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"PackageCheck\" class=\"size-4\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div class=\"flex items-baseline gap-1\">\n                <span class=\"text-foreground font-mono text-2xl font-bold tracking-tight tabular-nums\">142</span>\n                <span class=\"text-muted-foreground font-mono text-xs tabular-nums\">/ 180 stops</span>\n              </div>\n              <span class=\"text-info font-mono text-xs font-semibold tabular-nums\">78.8%</span>\n            </div>\n            <div ui-progress [value]=\"78.8\" class=\"h-1.5\"></div>\n            <p class=\"text-muted-foreground text-xs\">\n              <span class=\"text-foreground font-mono font-semibold tabular-nums\">38</span> stops pending completion\n            </p>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium\">On-Time Delivery Rate</h3>\n            <div class=\"bg-success/10 text-success flex h-8 w-8 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"ShieldCheck\" class=\"size-4\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-1.5\">\n            <div class=\"flex items-baseline gap-2\">\n              <span class=\"text-success font-mono text-2xl font-bold tracking-tight tabular-nums\">97.4%</span>\n              <span\n                ui-badge\n                variant=\"outline\"\n                class=\"border-success/20 bg-success/10 text-success h-5 px-1.5 text-xs font-medium\"\n              >\n                +1.8% vs SLA\n              </span>\n            </div>\n            <p class=\"text-muted-foreground text-xs\">\n              Target: <span class=\"text-foreground font-mono font-medium tabular-nums\">≥95.0%</span> · 0 SLA breaches\n            </p>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium\">Total Cargo Weight Dispatched</h3>\n            <div class=\"bg-warning/10 text-warning flex h-8 w-8 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"Gauge\" class=\"size-4\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div class=\"flex items-baseline gap-1\">\n                <span class=\"text-foreground font-mono text-2xl font-bold tracking-tight tabular-nums\">14,280</span>\n                <span class=\"text-muted-foreground text-xs\">lbs</span>\n              </div>\n              <span\n                ui-badge\n                variant=\"outline\"\n                class=\"border-warning/20 bg-warning/10 text-warning h-5 px-1.5 text-xs font-medium\"\n              >\n                82% capacity\n              </span>\n            </div>\n            <div class=\"bg-muted relative h-1.5 w-full overflow-hidden rounded-full\">\n              <div class=\"bg-warning h-full rounded-full transition-[width] duration-500\" style=\"width: 82%\"></div>\n            </div>\n            <p class=\"text-muted-foreground text-xs\">\n              Payload limit: <span class=\"text-foreground font-mono font-medium tabular-nums\">17,400 lbs</span> · Well\n              balanced\n            </p>\n          </div>\n        </div>\n      </div>\n\n      <!-- Filter & Search Controls Bar -->\n      <div class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"flex flex-wrap items-center gap-1.5\">\n          <button\n            ui-button\n            size=\"sm\"\n            [variant]=\"filterType() === 'all' ? 'default' : 'outline'\"\n            class=\"h-8 text-xs font-medium\"\n            (click)=\"filterType.set('all')\"\n          >\n            All Routes ({{ routes().length }})\n          </button>\n          <button\n            ui-button\n            size=\"sm\"\n            [variant]=\"filterType() === 'in_transit' ? 'default' : 'outline'\"\n            class=\"h-8 text-xs font-medium\"\n            (click)=\"filterType.set('in_transit')\"\n          >\n            In Transit (4)\n          </button>\n          <button\n            ui-button\n            size=\"sm\"\n            [variant]=\"filterType() === 'high_load' ? 'default' : 'outline'\"\n            class=\"h-8 text-xs font-medium\"\n            (click)=\"filterType.set('high_load')\"\n          >\n            High Load (&gt;80%)\n          </button>\n          <button\n            ui-button\n            size=\"sm\"\n            [variant]=\"filterType() === 'near_complete' ? 'default' : 'outline'\"\n            class=\"h-8 text-xs font-medium\"\n            (click)=\"filterType.set('near_complete')\"\n          >\n            Near Completion (&gt;70%)\n          </button>\n        </div>\n\n        <div class=\"relative w-full sm:w-72\">\n          <lucide-icon\n            [img]=\"Search\"\n            class=\"text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 size-3.5\"\n          />\n          <input\n            [value]=\"searchQuery()\"\n            (input)=\"searchQuery.set($any($event.target).value)\"\n            type=\"text\"\n            placeholder=\"Filter driver, route, or stop...\"\n            class=\"border-border bg-background text-foreground placeholder:text-muted-foreground focus-visible:ring-ring h-8 w-full rounded-md border pr-3 pl-8 text-xs focus-visible:ring-2 focus-visible:outline-hidden\"\n          />\n          @if (searchQuery()) {\n            <button\n              type=\"button\"\n              class=\"text-muted-foreground hover:text-foreground absolute top-2 right-2\"\n              aria-label=\"Clear search\"\n              (click)=\"searchQuery.set('')\"\n            >\n              <lucide-icon [img]=\"X\" class=\"size-3.5\" />\n            </button>\n          }\n        </div>\n      </div>\n\n      <!-- Empty State when filtered out -->\n      @if (filteredRoutes().length === 0) {\n        <div\n          class=\"border-border flex flex-col items-center justify-center rounded-xl border border-dashed py-12 text-center\"\n        >\n          <lucide-icon [img]=\"Truck\" class=\"text-muted-foreground/50 mb-3 size-10\" />\n          <h3 class=\"text-foreground text-sm font-semibold\">No matching dispatch routes found</h3>\n          <p class=\"text-muted-foreground mt-1 max-w-sm text-xs\">\n            Try resetting your zone selector or search query to see active drivers and vehicle assignments.\n          </p>\n          <button ui-button variant=\"outline\" size=\"sm\" class=\"mt-4 h-8 text-xs\" (click)=\"resetFilters()\">\n            Reset Filters\n          </button>\n        </div>\n      } @else {\n        <div class=\"grid grid-cols-1 gap-6 xl:grid-cols-2\">\n          @for (route of filteredRoutes(); track route.id) {\n            <div\n              ui-card\n              class=\"border-border flex flex-col shadow-xs transition-[color,background-color,border-color,box-shadow] hover:shadow-sm\"\n            >\n              <div ui-card-header class=\"space-y-3 pb-3\">\n                <div class=\"flex flex-wrap items-start justify-between gap-2\">\n                  <div class=\"space-y-0.5\">\n                    <div class=\"flex items-center gap-2\">\n                      <span class=\"text-primary font-mono text-xs font-semibold\">{{ route.routeCode }}</span>\n                      <h3 ui-card-title class=\"text-foreground text-sm font-bold sm:text-base\">\n                        {{ route.routeName }}\n                      </h3>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs\">{{ route.zone }}</p>\n                  </div>\n                  <div class=\"flex items-center gap-1.5\">\n                    <span\n                      ui-badge\n                      variant=\"outline\"\n                      class=\"border-success/20 bg-success/10 text-success h-5 px-2 text-xs font-medium\"\n                    >\n                      In Transit · On Schedule\n                    </span>\n                  </div>\n                </div>\n\n                <div ui-separator></div>\n\n                <div\n                  class=\"bg-muted/40 flex flex-col gap-3 rounded-lg p-3 sm:flex-row sm:items-center sm:justify-between\"\n                >\n                  <div class=\"flex items-center gap-3\">\n                    <ui-avatar class=\"border-border h-9 w-9 border\">\n                      <ui-avatar-fallback class=\"bg-primary/10 text-primary text-xs font-bold\">\n                        {{ route.driver.initials }}\n                      </ui-avatar-fallback>\n                    </ui-avatar>\n                    <div class=\"space-y-0.5\">\n                      <div class=\"flex items-center gap-1.5\">\n                        <span class=\"text-foreground text-xs font-semibold\">{{ route.driver.name }}</span>\n                        <span class=\"bg-success inline-flex h-1.5 w-1.5 rounded-full\" title=\"Active\"></span>\n                      </div>\n                      <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n                        <span class=\"font-mono tabular-nums\">{{ route.driver.phone }}</span>\n                        <span>·</span>\n                        <span>{{ route.driver.radioChannel }}</span>\n                      </div>\n                    </div>\n                  </div>\n\n                  <div\n                    class=\"border-border flex items-center justify-between gap-x-2 border-t pt-2 sm:border-t-0 sm:pt-0 sm:text-right\"\n                  >\n                    <div class=\"space-y-0.5\">\n                      <div class=\"flex items-center gap-1.5 sm:justify-end\">\n                        <lucide-icon [img]=\"Truck\" class=\"text-muted-foreground size-3.5\" />\n                        <span class=\"text-foreground text-xs font-medium\">{{ route.vehicle.name }}</span>\n                      </div>\n                      <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs sm:justify-end\">\n                        <span class=\"font-mono text-xs\">{{ route.vehicle.plateNumber }}</span>\n                        <span>·</span>\n                        <span class=\"flex items-center gap-1 font-mono text-xs tabular-nums\">\n                          @if (route.vehicle.powerType === 'electric') {\n                            <lucide-icon [img]=\"BatteryCharging\" class=\"text-success size-3\" />\n                          } @else {\n                            <lucide-icon [img]=\"Fuel\" class=\"text-info size-3\" />\n                          }\n                          {{ route.vehicle.powerLevel }}\n                        </span>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <div ui-card-content class=\"flex-1 space-y-4\">\n                <div class=\"border-border bg-card grid grid-cols-1 gap-3 rounded-lg border p-3 sm:grid-cols-2\">\n                  <div class=\"space-y-1.5\">\n                    <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n                      <span class=\"text-muted-foreground\">Stops Completion</span>\n                      <span class=\"text-foreground font-mono font-semibold tabular-nums\">\n                        {{ route.completedStops }} / {{ route.totalStops }}\n                        <span class=\"text-muted-foreground font-normal\"> ({{ stopPct(route) }}%) </span>\n                      </span>\n                    </div>\n                    <div ui-progress [value]=\"stopPct(route)\" class=\"h-1.5\"></div>\n                    <div\n                      class=\"text-muted-foreground flex items-center justify-between gap-x-2 font-mono text-xs tabular-nums\"\n                    >\n                      <span>Shift: {{ route.shiftWindow }}</span>\n                      <span>ETA: {{ route.estimatedCompletion }}</span>\n                    </div>\n                  </div>\n\n                  <div class=\"space-y-1.5\">\n                    <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n                      <span class=\"text-muted-foreground\">Payload Load Balance</span>\n                      <span class=\"text-foreground font-mono font-semibold tabular-nums\">\n                        {{ route.currentPayloadLbs.toLocaleString() }} / {{ route.maxPayloadLbs.toLocaleString() }} lbs\n                      </span>\n                    </div>\n                    <div class=\"bg-muted relative h-1.5 w-full overflow-hidden rounded-full\">\n                      <div [class]=\"payloadBarClass(route)\" [style.width]=\"payloadPct(route) + '%'\"></div>\n                    </div>\n                    <div\n                      class=\"text-muted-foreground flex items-center justify-between gap-x-2 font-mono text-xs tabular-nums\"\n                    >\n                      <span>{{ payloadPct(route) }}% capacity</span>\n                      <span [class]=\"payloadAvailClass(route)\">\n                        {{ route.maxPayloadLbs - route.currentPayloadLbs }} lbs available\n                      </span>\n                    </div>\n                  </div>\n                </div>\n\n                <div class=\"space-y-2\">\n                  <div class=\"flex items-center justify-between gap-x-2\">\n                    <h4 class=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n                      Stop Sequence & Delivery Execution\n                    </h4>\n                    <span class=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                      {{ countBy(route, 'delivered') }} done · {{ countBy(route, 'in_progress') }} active ·\n                      {{ countBy(route, 'pending') }} pending\n                    </span>\n                  </div>\n\n                  <div\n                    class=\"before:bg-border relative space-y-3 pl-2 before:absolute before:top-3 before:bottom-3 before:left-5 before:w-px\"\n                  >\n                    @for (stop of route.stops; track stop.id) {\n                      <div [class]=\"stopRowClass(stop.status)\">\n                        <div class=\"relative z-10 flex shrink-0 items-center justify-center\">\n                          @if (stop.status === 'delivered') {\n                            <div\n                              class=\"ring-background bg-success/15 text-success flex h-6 w-6 items-center justify-center rounded-full ring-2\"\n                            >\n                              <lucide-icon [img]=\"Check\" class=\"size-3.5 stroke-[3]\" />\n                            </div>\n                          } @else if (stop.status === 'in_progress') {\n                            <div\n                              class=\"bg-primary text-primary-foreground ring-primary/20 relative flex h-6 w-6 items-center justify-center rounded-full shadow-xs ring-4\"\n                            >\n                              <lucide-icon [img]=\"MapPin\" class=\"size-3.5 animate-bounce\" />\n                            </div>\n                          } @else {\n                            <div\n                              class=\"border-border bg-muted text-muted-foreground ring-background flex h-6 w-6 items-center justify-center rounded-full border ring-2\"\n                            >\n                              <lucide-icon [img]=\"Clock\" class=\"size-3\" />\n                            </div>\n                          }\n                        </div>\n\n                        <div class=\"min-w-0 flex-1 space-y-0.5\">\n                          <div class=\"flex flex-wrap items-center justify-between gap-1\">\n                            <div class=\"flex items-center gap-1.5 truncate\">\n                              <span class=\"text-muted-foreground font-mono text-xs font-semibold\">\n                                #{{ stop.sequence }}\n                              </span>\n                              <span class=\"text-foreground truncate text-xs font-semibold\">\n                                {{ stop.locationName }}\n                              </span>\n                            </div>\n                            <div class=\"flex items-center gap-1\">\n                              @if (stop.status === 'delivered') {\n                                <span\n                                  ui-badge\n                                  variant=\"outline\"\n                                  class=\"border-success/20 bg-success/10 text-success h-4.5 px-1.5 font-mono text-xs font-medium tabular-nums\"\n                                >\n                                  Delivered {{ stop.deliveredTime }}\n                                </span>\n                              } @else if (stop.status === 'in_progress') {\n                                <span\n                                  ui-badge\n                                  variant=\"default\"\n                                  class=\"h-4.5 px-1.5 font-mono text-xs font-medium tabular-nums\"\n                                >\n                                  In Progress · ETA {{ stop.estimatedTime }}\n                                </span>\n                              } @else {\n                                <span\n                                  ui-badge\n                                  variant=\"secondary\"\n                                  class=\"text-muted-foreground h-4.5 px-1.5 font-mono text-xs font-medium tabular-nums\"\n                                >\n                                  Pending\n                                </span>\n                              }\n                            </div>\n                          </div>\n\n                          <p class=\"text-muted-foreground truncate text-xs\">{{ stop.address }}</p>\n\n                          <div class=\"text-muted-foreground flex flex-wrap items-center gap-2 pt-0.5 text-xs\">\n                            <span class=\"text-foreground font-mono font-medium tabular-nums\">\n                              {{ stop.packagesCount }} {{ stop.packageType }}\n                            </span>\n                            @if (stop.recipient) {\n                              <span class=\"text-muted-foreground\">· {{ stop.recipient }}</span>\n                            }\n                            @if (stop.notes) {\n                              <span class=\"text-warning font-medium\">· {{ stop.notes }}</span>\n                            }\n                          </div>\n                        </div>\n                      </div>\n                    }\n                  </div>\n                </div>\n              </div>\n\n              <div ui-card-footer class=\"border-border border-t pt-3\">\n                <div class=\"flex w-full flex-wrap items-center justify-between gap-2\">\n                  <div class=\"flex items-center gap-1.5\">\n                    <button\n                      ui-button\n                      variant=\"outline\"\n                      size=\"sm\"\n                      class=\"h-8 gap-1.5 text-xs font-medium\"\n                      (click)=\"openModal('reassign', route)\"\n                    >\n                      <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-3.5\" />\n                      <span>Reassign Stops</span>\n                    </button>\n                    <button\n                      ui-button\n                      variant=\"outline\"\n                      size=\"sm\"\n                      class=\"h-8 gap-1.5 text-xs font-medium\"\n                      (click)=\"openModal('call', route)\"\n                    >\n                      <lucide-icon [img]=\"Phone\" class=\"size-3.5\" />\n                      <span>Call Driver</span>\n                    </button>\n                  </div>\n                  <button\n                    ui-button\n                    variant=\"default\"\n                    size=\"sm\"\n                    class=\"h-8 gap-1.5 text-xs font-medium shadow-xs\"\n                    (click)=\"openModal('gps', route)\"\n                  >\n                    <lucide-icon [img]=\"Navigation\" class=\"size-3.5\" />\n                    <span>View Live GPS</span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          }\n        </div>\n      }\n\n      <!-- Action Modals (GPS telemetry, direct call, reassign stops) -->\n      @if (activeModal(); as modal) {\n        <div\n          class=\"animate-in fade-in fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-xs duration-150\"\n          (click)=\"onOverlayClick($event)\"\n        >\n          @if (modal.type === 'gps') {\n            <div class=\"border-border bg-card w-full max-w-lg space-y-4 rounded-xl border p-6 shadow-xl\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <div class=\"flex items-center gap-2\">\n                  <div class=\"bg-primary/10 text-primary flex h-8 w-8 items-center justify-center rounded-md\">\n                    <lucide-icon [img]=\"Navigation\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-sm font-bold\">Live Telemetry & GPS Tracking</h3>\n                    <p class=\"text-muted-foreground text-xs\">\n                      {{ modal.route.routeCode }} · {{ modal.route.driver.name }}\n                    </p>\n                  </div>\n                </div>\n                <button\n                  aria-label=\"Close modal\"\n                  type=\"button\"\n                  class=\"text-muted-foreground hover:text-foreground rounded-md p-1\"\n                  (click)=\"closeModal()\"\n                >\n                  <lucide-icon [img]=\"X\" class=\"size-4\" />\n                </button>\n              </div>\n\n              <div ui-separator></div>\n\n              <div class=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n                <div class=\"border-border bg-muted/30 rounded-lg border p-2.5 text-center\">\n                  <span class=\"text-muted-foreground text-xs\">Current Speed</span>\n                  <p class=\"text-foreground font-mono text-sm font-bold\">{{ modal.route.telemetry.speed }}</p>\n                </div>\n                <div class=\"border-border bg-muted/30 rounded-lg border p-2.5 text-center\">\n                  <span class=\"text-muted-foreground text-xs\">Heading</span>\n                  <p class=\"text-foreground font-mono text-sm font-bold\">{{ modal.route.telemetry.heading }}</p>\n                </div>\n                <div class=\"border-border bg-muted/30 rounded-lg border p-2.5 text-center\">\n                  <span class=\"text-muted-foreground text-xs\">Power / Fuel</span>\n                  <p class=\"text-success font-mono text-sm font-bold\">{{ modal.route.vehicle.powerLevel }}</p>\n                </div>\n                <div class=\"border-border bg-muted/30 rounded-lg border p-2.5 text-center\">\n                  <span class=\"text-muted-foreground text-xs\">GPS Ping</span>\n                  <p class=\"text-foreground font-mono text-sm font-bold\">{{ modal.route.telemetry.lastPing }}</p>\n                </div>\n              </div>\n\n              <div class=\"border-border bg-muted/20 space-y-1.5 rounded-lg border p-3\">\n                <div class=\"flex items-center justify-between gap-x-2 text-xs\">\n                  <span class=\"text-muted-foreground\">Current Coordinates & Street</span>\n                  <span class=\"text-success font-mono font-medium\">Signal: {{ modal.route.telemetry.signal }}</span>\n                </div>\n                <div class=\"flex items-start gap-2\">\n                  <lucide-icon [img]=\"MapPin\" class=\"text-primary mt-0.5 size-4 shrink-0\" />\n                  <p class=\"text-foreground text-xs font-semibold\">{{ modal.route.telemetry.currentLocation }}</p>\n                </div>\n              </div>\n\n              <div class=\"border-primary/20 bg-primary/5 space-y-1 rounded-lg border p-3\">\n                <span class=\"text-primary text-xs font-semibold tracking-wide uppercase\">Next Stop In Sequence</span>\n                <p class=\"text-foreground text-xs font-bold\">{{ nextStopName(modal.route) }}</p>\n                <p class=\"text-muted-foreground text-xs\">{{ nextStopAddress(modal.route) }}</p>\n              </div>\n\n              <div class=\"flex justify-end gap-2 pt-2\">\n                <button\n                  ui-button\n                  aria-label=\"Close modal\"\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"h-8 text-xs\"\n                  (click)=\"closeModal()\"\n                >\n                  Close\n                </button>\n                <button ui-button size=\"sm\" class=\"h-8 text-xs font-medium\" (click)=\"openModal('call', modal.route)\">\n                  <lucide-icon [img]=\"Phone\" class=\"mr-1.5 size-3.5\" /> Call Driver\n                </button>\n              </div>\n            </div>\n          }\n\n          @if (modal.type === 'call') {\n            <div class=\"border-border bg-card w-full max-w-md space-y-4 rounded-xl border p-6 shadow-xl\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <div class=\"flex items-center gap-2\">\n                  <div class=\"bg-success/10 text-success flex h-8 w-8 items-center justify-center rounded-md\">\n                    <lucide-icon [img]=\"PhoneCall\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-sm font-bold\">Dispatch Driver Communications</h3>\n                    <p class=\"text-muted-foreground text-xs\">{{ modal.route.routeCode }} Direct Link</p>\n                  </div>\n                </div>\n                <button\n                  aria-label=\"Close modal\"\n                  type=\"button\"\n                  class=\"text-muted-foreground hover:text-foreground rounded-md p-1\"\n                  (click)=\"closeModal()\"\n                >\n                  <lucide-icon [img]=\"X\" class=\"size-4\" />\n                </button>\n              </div>\n\n              <div ui-separator></div>\n\n              <div class=\"border-border bg-muted/40 flex items-center gap-3 rounded-lg border p-3\">\n                <ui-avatar class=\"border-border h-11 w-11 border\">\n                  <ui-avatar-fallback class=\"bg-primary/10 text-primary text-sm font-bold\">\n                    {{ modal.route.driver.initials }}\n                  </ui-avatar-fallback>\n                </ui-avatar>\n                <div class=\"space-y-0.5\">\n                  <h4 class=\"text-foreground text-sm font-semibold\">{{ modal.route.driver.name }}</h4>\n                  <p class=\"text-muted-foreground font-mono text-xs tabular-nums\">{{ modal.route.driver.phone }}</p>\n                  <p class=\"text-muted-foreground text-xs\">{{ modal.route.driver.radioChannel }} · Hands-Free Active</p>\n                </div>\n              </div>\n\n              <div class=\"space-y-2 text-xs\">\n                <span class=\"text-muted-foreground font-medium\">Quick Broadcast Dispatch Presets:</span>\n                <div class=\"grid grid-cols-2 gap-2\">\n                  <button\n                    type=\"button\"\n                    class=\"border-border bg-background hover:border-primary/40 hover:bg-accent rounded-md border p-2 text-left transition-colors\"\n                    (click)=\"handleConfirmReassign()\"\n                  >\n                    <span class=\"text-foreground block font-semibold\">Traffic Alert</span>\n                    <span class=\"text-muted-foreground text-xs\">Reroute around I-10 slowdown</span>\n                  </button>\n                  <button\n                    type=\"button\"\n                    class=\"border-border bg-background hover:border-primary/40 hover:bg-accent rounded-md border p-2 text-left transition-colors\"\n                    (click)=\"handleConfirmReassign()\"\n                  >\n                    <span class=\"text-foreground block font-semibold\">Priority Stop</span>\n                    <span class=\"text-muted-foreground text-xs\">Bump hospital drop to next</span>\n                  </button>\n                </div>\n              </div>\n\n              <div class=\"flex justify-end gap-2 pt-2\">\n                <button\n                  ui-button\n                  aria-label=\"Close modal\"\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"h-8 text-xs\"\n                  (click)=\"closeModal()\"\n                >\n                  Cancel\n                </button>\n                <button\n                  ui-button\n                  size=\"sm\"\n                  class=\"bg-success hover:bg-success/90 h-8 text-xs font-medium text-white\"\n                  (click)=\"handleConfirmReassign()\"\n                >\n                  <lucide-icon [img]=\"Phone\" class=\"mr-1.5 size-3.5\" /> Start Direct Call\n                </button>\n              </div>\n            </div>\n          }\n\n          @if (modal.type === 'reassign') {\n            <div class=\"border-border bg-card w-full max-w-lg space-y-4 rounded-xl border p-6 shadow-xl\">\n              <div class=\"flex items-center justify-between gap-x-2\">\n                <div class=\"flex items-center gap-2\">\n                  <div class=\"bg-warning/10 text-warning flex h-8 w-8 items-center justify-center rounded-md\">\n                    <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-4\" />\n                  </div>\n                  <div>\n                    <h3 class=\"text-foreground text-sm font-bold\">Reassign Pending Stops</h3>\n                    <p class=\"text-muted-foreground text-xs\">\n                      Transfer workload from {{ modal.route.routeCode }} ({{ modal.route.driver.name }})\n                    </p>\n                  </div>\n                </div>\n                <button\n                  aria-label=\"Close modal\"\n                  type=\"button\"\n                  class=\"text-muted-foreground hover:text-foreground rounded-md p-1\"\n                  (click)=\"closeModal()\"\n                >\n                  <lucide-icon [img]=\"X\" class=\"size-4\" />\n                </button>\n              </div>\n\n              <div ui-separator></div>\n\n              <div class=\"space-y-3 text-xs\">\n                <div>\n                  <label class=\"text-foreground mb-1 block font-semibold\">Pending Stop to Transfer:</label>\n                  <div class=\"border-border bg-muted/40 rounded-lg border p-3\">\n                    <div class=\"flex items-center justify-between gap-x-2\">\n                      <span class=\"text-foreground font-semibold\">{{ pendingStopName(modal.route) }}</span>\n                      <span ui-badge variant=\"outline\" class=\"text-xs\"\n                        >{{ pendingStopPackages(modal.route) }} packages</span\n                      >\n                    </div>\n                    <p class=\"text-muted-foreground mt-0.5 text-xs\">{{ pendingStopAddress(modal.route) }}</p>\n                  </div>\n                </div>\n\n                <div>\n                  <label class=\"text-foreground mb-1 block font-semibold\">Target Available Route / Driver:</label>\n                  <div class=\"space-y-2\">\n                    @for (target of reassignTargets(modal.route.id); track target.id) {\n                      <div\n                        [class]=\"targetRowClass(modal.targetRouteId === target.id)\"\n                        (click)=\"selectTargetRoute(target.id)\"\n                      >\n                        <div class=\"space-y-0.5\">\n                          <div class=\"flex items-center gap-1.5\">\n                            <span class=\"text-foreground font-semibold\"\n                              >{{ target.routeCode }} · {{ target.routeName }}</span\n                            >\n                            <span class=\"text-muted-foreground text-xs\">({{ target.driver.name }})</span>\n                          </div>\n                          <p class=\"text-muted-foreground text-xs\">\n                            Current Load: {{ target.currentPayloadLbs }} lbs ({{ payloadPct(target) }}%) ·\n                            {{ target.totalStops - target.completedStops }} stops left\n                          </p>\n                        </div>\n                        <div [class]=\"targetRadioClass(modal.targetRouteId === target.id)\">\n                          @if (modal.targetRouteId === target.id) {\n                            <lucide-icon [img]=\"Check\" class=\"size-3 stroke-3\" />\n                          }\n                        </div>\n                      </div>\n                    }\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"flex justify-end gap-2 pt-2\">\n                <button\n                  ui-button\n                  aria-label=\"Close modal\"\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"h-8 text-xs\"\n                  (click)=\"closeModal()\"\n                >\n                  Cancel\n                </button>\n                <button ui-button size=\"sm\" class=\"h-8 text-xs font-medium\" (click)=\"handleConfirmReassign()\">\n                  <lucide-icon [img]=\"Check\" class=\"mr-1.5 size-3.5\" /> Confirm Stop Reassignment\n                </button>\n              </div>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n})\nexport class UiDispatchAssignmentBoardComponent {\n  protected readonly ArrowRightLeft = ArrowRightLeft\n  protected readonly BatteryCharging = BatteryCharging\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Download = Download\n  protected readonly Fuel = Fuel\n  protected readonly Gauge = Gauge\n  protected readonly MapPin = MapPin\n  protected readonly Navigation = Navigation\n  protected readonly PackageCheck = PackageCheck\n  protected readonly Phone = Phone\n  protected readonly PhoneCall = PhoneCall\n  protected readonly Search = Search\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Truck = Truck\n  protected readonly X = X\n\n  protected readonly zoneOptions = ZONE_OPTIONS\n\n  @Input() set initialZone(v: string | undefined) {\n    if (v !== undefined) this.selectedZone.set(v)\n  }\n  @Input() set initialFilter(v: DispatchFilter | undefined) {\n    if (v !== undefined) this.filterType.set(v)\n  }\n  @Input('class') className?: string\n\n  readonly routes = signal<DriverRoute[]>(DRIVER_ROUTES_DATA)\n  readonly selectedZone = signal('Metro Los Angeles - North Zone')\n  readonly filterType = signal<DispatchFilter>('all')\n  readonly searchQuery = signal('')\n  readonly isOptimizing = signal(false)\n  readonly notificationBanner = signal<{ title: string; message: string; type: 'success' | 'info' } | null>(null)\n  readonly activeModal = signal<ActiveModalState | null>(null)\n\n  private optimizeTimer: ReturnType<typeof setTimeout> | undefined\n\n  constructor() {\n    inject(DestroyRef).onDestroy(() => clearTimeout(this.optimizeTimer))\n  }\n\n  readonly filteredRoutes = computed(() => {\n    const zone = this.selectedZone()\n    const filter = this.filterType()\n    const q = this.searchQuery().trim().toLowerCase()\n    return this.routes().filter((route) => {\n      if (zone !== 'all' && route.zone !== zone) return false\n      if (filter === 'in_transit' && route.driver.status !== 'on_route') return false\n      if (filter === 'high_load' && route.currentPayloadLbs / route.maxPayloadLbs < 0.8) return false\n      if (filter === 'near_complete' && route.completedStops / route.totalStops < 0.75) return false\n      if (q) {\n        const matchRoute = route.routeCode.toLowerCase().includes(q) || route.routeName.toLowerCase().includes(q)\n        const matchDriver = route.driver.name.toLowerCase().includes(q)\n        const matchVehicle =\n          route.vehicle.name.toLowerCase().includes(q) || route.vehicle.plateNumber.toLowerCase().includes(q)\n        const matchStop = route.stops.some(\n          (s) => s.locationName.toLowerCase().includes(q) || s.address.toLowerCase().includes(q),\n        )\n        if (!matchRoute && !matchDriver && !matchVehicle && !matchStop) return false\n      }\n      return true\n    })\n  })\n\n  get rootClass(): string {\n    return cn('text-foreground w-full space-y-6', this.className)\n  }\n\n  get optimizeIconClass(): string {\n    return cn('size-3.5', this.isOptimizing() && 'text-primary-foreground animate-spin')\n  }\n\n  bannerClass(type: 'success' | 'info'): string {\n    return cn(\n      'animate-in fade-in-50 flex items-start justify-between rounded-lg border p-3.5 text-xs transition-colors duration-200',\n      type === 'success'\n        ? 'border-success/30 bg-success/10 text-success'\n        : 'border-primary/30 bg-primary/10 text-foreground',\n    )\n  }\n\n  stopPct(route: DriverRoute): number {\n    return Math.round((route.completedStops / route.totalStops) * 100)\n  }\n\n  payloadPct(route: DriverRoute): number {\n    return Math.round((route.currentPayloadLbs / route.maxPayloadLbs) * 100)\n  }\n\n  payloadBarClass(route: DriverRoute): string {\n    return cn(\n      'h-full rounded-full transition-[width,background-color] duration-500',\n      route.currentPayloadLbs / route.maxPayloadLbs > 0.85 ? 'bg-warning' : 'bg-primary',\n    )\n  }\n\n  payloadAvailClass(route: DriverRoute): string {\n    return route.currentPayloadLbs / route.maxPayloadLbs > 0.85 ? 'text-warning font-medium' : 'text-muted-foreground'\n  }\n\n  countBy(route: DriverRoute, status: StopStatus): number {\n    return route.stops.filter((s) => s.status === status).length\n  }\n\n  stopRowClass(status: StopStatus): string {\n    return cn(\n      'hover:border-border hover:bg-muted/30 relative flex items-start gap-3 rounded-lg border border-transparent p-2 transition-colors',\n      status === 'in_progress' && 'border-primary/30 bg-primary/5 dark:bg-primary/10',\n    )\n  }\n\n  nextStopName(route: DriverRoute): string {\n    return route.stops.find((s) => s.status === 'in_progress')?.locationName || 'Hub Return'\n  }\n\n  nextStopAddress(route: DriverRoute): string {\n    return route.stops.find((s) => s.status === 'in_progress')?.address || ''\n  }\n\n  pendingStopName(route: DriverRoute): string {\n    return route.stops.find((s) => s.status === 'pending')?.locationName || 'Stop #4 - Delivery Destination'\n  }\n\n  pendingStopPackages(route: DriverRoute): number {\n    return route.stops.find((s) => s.status === 'pending')?.packagesCount || 2\n  }\n\n  pendingStopAddress(route: DriverRoute): string {\n    return route.stops.find((s) => s.status === 'pending')?.address || ''\n  }\n\n  reassignTargets(excludeId: string): DriverRoute[] {\n    return this.routes().filter((r) => r.id !== excludeId)\n  }\n\n  targetRowClass(selected: boolean): string {\n    return cn(\n      'flex cursor-pointer items-center justify-between rounded-lg border p-2.5 transition-colors',\n      selected ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/30',\n    )\n  }\n\n  targetRadioClass(selected: boolean): string {\n    return cn(\n      'border-border flex h-5 w-5 items-center justify-center rounded-full border',\n      selected && 'border-primary bg-primary text-primary-foreground',\n    )\n  }\n\n  handleAutoOptimize(): void {\n    this.isOptimizing.set(true)\n    this.notificationBanner.set(null)\n    clearTimeout(this.optimizeTimer)\n    this.optimizeTimer = setTimeout(() => {\n      this.isOptimizing.set(false)\n      this.notificationBanner.set({\n        title: 'AI Route Optimization Complete',\n        message: 'Re-sequenced 4 active routes · Saved 18.4 road miles · Estimated 22 min overall transit reduction.',\n        type: 'success',\n      })\n    }, 750)\n  }\n\n  handleExportManifests(): void {\n    this.notificationBanner.set({\n      title: 'Dispatch Manifests Exported',\n      message: 'Generated PDF loading manifests and CSV stop sequences for 4 routes (180 total stops).',\n      type: 'info',\n    })\n  }\n\n  openModal(type: 'gps' | 'call' | 'reassign', route: DriverRoute): void {\n    this.activeModal.set({\n      type,\n      route,\n      targetRouteId: this.routes().find((r) => r.id !== route.id)?.id,\n    })\n  }\n\n  closeModal(): void {\n    this.activeModal.set(null)\n  }\n\n  onOverlayClick(event: MouseEvent): void {\n    if (event.target === event.currentTarget) this.closeModal()\n  }\n\n  selectTargetRoute(targetId: string): void {\n    const modal = this.activeModal()\n    if (modal) this.activeModal.set({ ...modal, targetRouteId: targetId })\n  }\n\n  handleConfirmReassign(): void {\n    const modal = this.activeModal()\n    if (modal) {\n      this.notificationBanner.set({\n        title: 'Stops Successfully Reassigned',\n        message: `Pending stop from ${modal.route.routeCode} transferred. Driver GPS routes and manifest synced.`,\n        type: 'success',\n      })\n      this.closeModal()\n    }\n  }\n\n  resetFilters(): void {\n    this.selectedZone.set('all')\n    this.searchQuery.set('')\n    this.filterType.set('all')\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/dispatch-assignment-board/dispatch-assignment-board.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/dispatch-assignment-board/index.ts",
      "content": "export {\n  UiDispatchAssignmentBoardComponent,\n  DRIVER_ROUTES_DATA,\n  type ActiveModalState,\n  type DispatchFilter,\n  type DriverRoute,\n  type RouteStop,\n  type StopStatus,\n} from './dispatch-assignment-board.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/dispatch-assignment-board/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/avatar.json",
    "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/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/separator.json"
  ],
  "description": "Last-mile route dispatching, delivery driver stop sequencing, and vehicle payload load balancing: live dispatch overview KPIs, zone filtering, AI route auto-sequencing, and driver route cards with vehicle payload load balancing, live progress tracking, interactive stops timeline, driver communications, and telemetry actions.",
  "categories": [
    "logistics",
    "app"
  ]
}