@fleetbase/fleetops-engine 0.6.47 → 0.6.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/addon/components/admin/routing-settings.hbs +71 -0
  2. package/addon/components/admin/routing-settings.js +124 -0
  3. package/addon/components/customer/orders.js +1 -1
  4. package/addon/components/display-place.hbs +1 -1
  5. package/addon/components/driver/details.hbs +5 -1
  6. package/addon/components/driver/form.hbs +11 -1
  7. package/addon/components/fleet-listing-panel.hbs +2 -2
  8. package/addon/components/fleet-listing-panel.js +10 -0
  9. package/addon/components/map/google-live-map.js +12 -73
  10. package/addon/components/map/leaflet-live-map.hbs +149 -33
  11. package/addon/components/map/order-list-overlay/order.hbs +18 -3
  12. package/addon/components/map/toolbar.hbs +2 -2
  13. package/addon/components/map/toolbar.js +10 -2
  14. package/addon/components/orchestrator/phase-builder.hbs +49 -5
  15. package/addon/components/orchestrator/phase-builder.js +34 -1
  16. package/addon/components/orchestrator/resource-panel.hbs +19 -1
  17. package/addon/components/orchestrator/resource-panel.js +4 -0
  18. package/addon/components/orchestrator-workbench.js +4 -1
  19. package/addon/components/order/details/purchase-rate.hbs +19 -22
  20. package/addon/components/order/details/route.hbs +26 -1
  21. package/addon/components/order/details/route.js +50 -0
  22. package/addon/components/order/details/tracking.hbs +171 -27
  23. package/addon/components/order/details/tracking.js +457 -0
  24. package/addon/components/order/form.hbs +2 -2
  25. package/addon/components/order/kanban-card.hbs +18 -3
  26. package/addon/components/order-list-overlay/order.hbs +18 -3
  27. package/addon/components/order-progress-card.hbs +21 -6
  28. package/addon/components/order-tracking-lookup.hbs +7 -7
  29. package/addon/components/order-tracking-lookup.js +1 -1
  30. package/addon/components/route-list.hbs +78 -8
  31. package/addon/components/route-list.js +48 -6
  32. package/addon/components/tracking-stop-progress.hbs +45 -0
  33. package/addon/components/tracking-stop-progress.js +79 -0
  34. package/addon/components/widget/fleet-ops-key-metrics.hbs +19 -17
  35. package/addon/components/widget/fleet-ops-key-metrics.js +26 -0
  36. package/addon/components/widget/fuel-efficiency.hbs +26 -0
  37. package/addon/components/widget/fuel-efficiency.js +43 -0
  38. package/addon/components/widget/geofence-violations.hbs +44 -0
  39. package/addon/components/widget/geofence-violations.js +55 -0
  40. package/addon/components/widget/issues-insights.hbs +43 -0
  41. package/addon/components/widget/issues-insights.js +62 -0
  42. package/addon/components/widget/kpi-active-orders.hbs +10 -0
  43. package/addon/components/widget/kpi-active-orders.js +5 -0
  44. package/addon/components/widget/kpi-aov.hbs +10 -0
  45. package/addon/components/widget/kpi-aov.js +5 -0
  46. package/addon/components/widget/kpi-distance.hbs +10 -0
  47. package/addon/components/widget/kpi-distance.js +5 -0
  48. package/addon/components/widget/kpi-drivers-online.hbs +10 -0
  49. package/addon/components/widget/kpi-drivers-online.js +5 -0
  50. package/addon/components/widget/kpi-earnings.hbs +10 -0
  51. package/addon/components/widget/kpi-earnings.js +5 -0
  52. package/addon/components/widget/kpi-open-issues.hbs +11 -0
  53. package/addon/components/widget/kpi-open-issues.js +5 -0
  54. package/addon/components/widget/kpi-tile.hbs +59 -0
  55. package/addon/components/widget/kpi-tile.js +168 -0
  56. package/addon/components/widget/live-fleet.hbs +122 -0
  57. package/addon/components/widget/live-fleet.js +365 -0
  58. package/addon/components/widget/maintenance-overview.hbs +45 -0
  59. package/addon/components/widget/maintenance-overview.js +40 -0
  60. package/addon/components/widget/on-time-delivery.hbs +27 -0
  61. package/addon/components/widget/on-time-delivery.js +73 -0
  62. package/addon/components/widget/operations-pulse.hbs +51 -0
  63. package/addon/components/widget/operations-pulse.js +173 -0
  64. package/addon/components/widget/orders-by-status.hbs +26 -0
  65. package/addon/components/widget/orders-by-status.js +54 -0
  66. package/addon/components/widget/revenue-trend.hbs +34 -0
  67. package/addon/components/widget/revenue-trend.js +67 -0
  68. package/addon/components/widget/top-drivers.hbs +44 -0
  69. package/addon/components/widget/top-drivers.js +54 -0
  70. package/addon/controllers/settings/routing.js +124 -1
  71. package/addon/extension.js +172 -3
  72. package/addon/helpers/format-duration.js +38 -0
  73. package/addon/routes/application.js +6 -0
  74. package/addon/services/map-adapter/google.js +13 -2
  75. package/addon/services/order-list-overlay.js +2 -2
  76. package/addon/styles/fleetops-engine.css +806 -46
  77. package/addon/templates/maintenance/equipment/index.hbs +1 -1
  78. package/addon/templates/maintenance/parts/index.hbs +1 -1
  79. package/addon/templates/maintenance/schedules/index.hbs +1 -1
  80. package/addon/templates/management/vehicles/index.hbs +1 -1
  81. package/addon/templates/settings/avatars.hbs +1 -1
  82. package/addon/templates/settings/custom-fields.hbs +1 -1
  83. package/addon/templates/settings/map.hbs +1 -1
  84. package/addon/templates/settings/navigator-app.hbs +1 -1
  85. package/addon/templates/settings/notifications.hbs +1 -1
  86. package/addon/templates/settings/orchestrator.hbs +1 -1
  87. package/addon/templates/settings/payments/index.hbs +1 -1
  88. package/addon/templates/settings/payments/onboard.hbs +1 -1
  89. package/addon/templates/settings/routing.hbs +82 -4
  90. package/addon/templates/settings/scheduling.hbs +1 -1
  91. package/addon/utils/live-map-card-content.js +171 -0
  92. package/app/components/tracking-stop-progress.js +1 -0
  93. package/app/components/widget/fuel-efficiency.js +1 -0
  94. package/app/components/widget/geofence-violations.js +1 -0
  95. package/app/components/widget/issues-insights.js +1 -0
  96. package/app/components/widget/kpi-active-orders.js +1 -0
  97. package/app/components/widget/kpi-aov.js +1 -0
  98. package/app/components/widget/kpi-distance.js +1 -0
  99. package/app/components/widget/kpi-drivers-online.js +1 -0
  100. package/app/components/widget/kpi-earnings.js +1 -0
  101. package/app/components/widget/kpi-open-issues.js +1 -0
  102. package/app/components/widget/kpi-tile.js +1 -0
  103. package/app/components/widget/live-fleet.js +1 -0
  104. package/app/components/widget/maintenance-overview.js +1 -0
  105. package/app/components/widget/on-time-delivery.js +1 -0
  106. package/app/components/widget/operations-pulse.js +1 -0
  107. package/app/components/widget/orders-by-status.js +1 -0
  108. package/app/components/widget/revenue-trend.js +1 -0
  109. package/app/components/widget/top-drivers.js +1 -0
  110. package/app/helpers/format-duration.js +1 -0
  111. package/app/utils/live-map-card-content.js +1 -0
  112. package/composer.json +1 -1
  113. package/extension.json +1 -1
  114. package/package.json +3 -3
  115. package/pnpm-workspace.yaml +1 -0
  116. package/server/config/fleetops.php +32 -11
  117. package/server/config/telematics.php +111 -1
  118. package/server/migrations/2026_05_13_000001_repair_customer_contact_user_types.php +86 -0
  119. package/server/migrations/2026_05_18_000001_add_license_expiry_to_drivers_table.php +25 -0
  120. package/server/seeders/Testing/Concerns/SeedsTestingData.php +183 -0
  121. package/server/seeders/Testing/ConnectivitySeeder.php +212 -0
  122. package/server/seeders/Testing/FleetSeeder.php +341 -0
  123. package/server/seeders/Testing/MaintenanceSeeder.php +238 -0
  124. package/server/seeders/Testing/NetworkSeeder.php +250 -0
  125. package/server/seeders/Testing/OrdersSeeder.php +214 -0
  126. package/server/seeders/Testing/TestingSeeder.php +40 -0
  127. package/server/seeders/Testing/VroomOrchestrationSeeder.php +409 -0
  128. package/server/src/Console/Commands/ProcessOperationalAlerts.php +279 -0
  129. package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +64 -0
  130. package/server/src/Http/Controllers/Api/v1/OrderController.php +26 -26
  131. package/server/src/Http/Controllers/Api/v1/PayloadController.php +10 -10
  132. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +1 -1
  133. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +119 -0
  134. package/server/src/Http/Controllers/Internal/v1/ContactController.php +41 -0
  135. package/server/src/Http/Controllers/Internal/v1/LiveController.php +6 -42
  136. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +82 -3
  137. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +1 -1
  138. package/server/src/Http/Controllers/Internal/v1/OrderController.php +52 -21
  139. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +1 -1
  140. package/server/src/Http/Controllers/Internal/v1/SettingController.php +164 -12
  141. package/server/src/Http/Resources/v1/Driver.php +2 -0
  142. package/server/src/Http/Resources/v1/Fleet.php +4 -0
  143. package/server/src/Http/Resources/v1/Index/Driver.php +48 -0
  144. package/server/src/Http/Resources/v1/Index/Payload.php +2 -2
  145. package/server/src/Http/Resources/v1/Index/Vehicle.php +74 -1
  146. package/server/src/Models/Contact.php +122 -13
  147. package/server/src/Models/Driver.php +2 -0
  148. package/server/src/Models/Order.php +1 -1
  149. package/server/src/Models/OrderConfig.php +14 -11
  150. package/server/src/Models/Payload.php +8 -8
  151. package/server/src/Models/Place.php +0 -3
  152. package/server/src/Models/ServiceRate.php +1 -1
  153. package/server/src/Notifications/LateDeparture.php +48 -0
  154. package/server/src/Notifications/ProlongedStoppage.php +48 -0
  155. package/server/src/Notifications/RouteDeviation.php +48 -0
  156. package/server/src/Observers/ContactObserver.php +8 -0
  157. package/server/src/Orchestration/Engines/CapacityAllocationEngine.php +220 -0
  158. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +357 -38
  159. package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +259 -51
  160. package/server/src/Providers/FleetOpsServiceProvider.php +32 -0
  161. package/server/src/Providers/NotificationServiceProvider.php +3 -0
  162. package/server/src/Support/Analytics/AbstractAnalytics.php +77 -0
  163. package/server/src/Support/Analytics/FuelEfficiency.php +83 -0
  164. package/server/src/Support/Analytics/GeofenceViolations.php +63 -0
  165. package/server/src/Support/Analytics/IssuesInsights.php +67 -0
  166. package/server/src/Support/Analytics/LiveFleet.php +127 -0
  167. package/server/src/Support/Analytics/MaintenanceOverview.php +70 -0
  168. package/server/src/Support/Analytics/OnTimeDelivery.php +75 -0
  169. package/server/src/Support/Analytics/OperationsPulse.php +86 -0
  170. package/server/src/Support/Analytics/OrdersByStatus.php +64 -0
  171. package/server/src/Support/Analytics/RevenueTrend.php +79 -0
  172. package/server/src/Support/Analytics/TopDrivers.php +92 -0
  173. package/server/src/Support/LiveOrderQuery.php +75 -0
  174. package/server/src/Support/Metrics/AbstractMetric.php +170 -0
  175. package/server/src/Support/Metrics/ActiveLiveOrdersMetric.php +28 -0
  176. package/server/src/Support/Metrics/AvgOrderValueMetric.php +53 -0
  177. package/server/src/Support/Metrics/DriversOnlineMetric.php +30 -0
  178. package/server/src/Support/Metrics/EarningsMetric.php +30 -0
  179. package/server/src/Support/Metrics/FuelCostsMetric.php +30 -0
  180. package/server/src/Support/Metrics/MoneyMetric.php +30 -0
  181. package/server/src/Support/Metrics/OpenIssuesMetric.php +35 -0
  182. package/server/src/Support/Metrics/OrdersCanceledMetric.php +35 -0
  183. package/server/src/Support/Metrics/OrdersCompletedMetric.php +35 -0
  184. package/server/src/Support/Metrics/OrdersInProgressMetric.php +51 -0
  185. package/server/src/Support/Metrics/OrdersScheduledMetric.php +37 -0
  186. package/server/src/Support/Metrics/Registry.php +46 -0
  187. package/server/src/Support/Metrics/ResolvedIssuesMetric.php +35 -0
  188. package/server/src/Support/Metrics/TotalCustomersMetric.php +29 -0
  189. package/server/src/Support/Metrics/TotalDistanceTraveledMetric.php +35 -0
  190. package/server/src/Support/Metrics/TotalDriversMetric.php +28 -0
  191. package/server/src/Support/Metrics/TotalTimeTraveledMetric.php +35 -0
  192. package/server/src/Support/Metrics.php +46 -234
  193. package/server/src/Support/OSRM.php +11 -6
  194. package/server/src/Support/OrderTracker.php +7 -582
  195. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +290 -0
  196. package/server/src/Support/Telematics/Providers/SafeeProvider.php +333 -0
  197. package/server/src/Support/Utils.php +1 -1
  198. package/server/src/Tracking/Contracts/TrackingProviderInterface.php +19 -0
  199. package/server/src/Tracking/Providers/CalculatedTrackingProvider.php +65 -0
  200. package/server/src/Tracking/Providers/GoogleRoutesTrackingProvider.php +118 -0
  201. package/server/src/Tracking/Providers/OsrmTrackingProvider.php +71 -0
  202. package/server/src/Tracking/README.md +25 -0
  203. package/server/src/Tracking/Support/FakeTrackingProvider.php +42 -0
  204. package/server/src/Tracking/TrackingContext.php +63 -0
  205. package/server/src/Tracking/TrackingContextBuilder.php +204 -0
  206. package/server/src/Tracking/TrackingIntelligenceService.php +180 -0
  207. package/server/src/Tracking/TrackingOptions.php +49 -0
  208. package/server/src/Tracking/TrackingProviderCapabilities.php +30 -0
  209. package/server/src/Tracking/TrackingProviderManager.php +89 -0
  210. package/server/src/Tracking/TrackingProviderRegistry.php +35 -0
  211. package/server/src/Tracking/TrackingProviderResult.php +20 -0
  212. package/server/src/Tracking/TrackingStop.php +59 -0
  213. package/server/src/routes.php +27 -0
  214. package/server/tests/AnalyticsRoutesTest.php +41 -0
  215. package/server/tests/CapacityAllocationEngineTest.php +108 -0
  216. package/server/tests/LiveOrderQueryTest.php +34 -0
  217. package/server/tests/MetricsRegistryTest.php +88 -0
  218. package/server/tests/OrchestrationPayloadBuilderTest.php +132 -0
  219. package/server/tests/OrchestratorConsumableApiTest.php +74 -0
  220. package/server/tests/PingDriverEndpointTest.php +19 -0
  221. package/server/tests/TrackingIntelligenceTest.php +176 -0
  222. package/server/tests/VroomOrchestrationEngineTest.php +250 -0
  223. package/translations/en-us.yaml +41 -0
@@ -1,3 +1,4 @@
1
+ /* stylelint-disable alpha-value-notation -- FleetOps lazy engine production CSS is minified by legacy clean-css, which corrupts comma-form rgba() percent alpha values. */
1
2
  .scheduler-left-sidebar {
2
3
  border-right: 1px rgb(229 231 235 / 100%) solid;
3
4
  height: 100vh;
@@ -425,7 +426,7 @@ body[data-theme='light'] .fleetops-pill-tabs > nav > a.ui-tab.active {
425
426
 
426
427
  body[data-theme='light'] .flow-activity {
427
428
  stroke: #e5e7eb;
428
- fill: rgba(249, 250, 251, 50%);
429
+ fill: rgba(249, 250, 251, 0.5);
429
430
  }
430
431
 
431
432
  body[data-theme='light'] .flow-activity:hover,
@@ -856,7 +857,7 @@ body[data-theme='dark'] .order-progress-bar > .order-progress-bar-marker-wrapper
856
857
  }
857
858
 
858
859
  .order-progress-bar.has-progress > .order-progress-bar-wrapper > .order-progress-bar-track {
859
- border-top: 4px dashed rgba(209, 213, 219, 50%);
860
+ border-top: 4px dashed rgba(209, 213, 219, 0.5);
860
861
  }
861
862
 
862
863
  .order-progress-bar > .order-progress-bar-wrapper > .order-progress-bar-track {
@@ -1872,21 +1873,21 @@ main.console-fleet-ops-operations-orders-index-index section.next-view-section >
1872
1873
  .positions-replay-component .metric-card {
1873
1874
  padding: 0.75rem;
1874
1875
  border-radius: 0.5rem;
1875
- background-color: rgba(0, 0, 0, 2%);
1876
+ background-color: rgba(0, 0, 0, 0.02);
1876
1877
  transition: all 0.2s ease-in-out;
1877
1878
  }
1878
1879
 
1879
1880
  .positions-replay-component .metric-card:hover {
1880
- background-color: rgba(0, 0, 0, 4%);
1881
- box-shadow: 0 4px 6px rgba(0, 0, 0, 10%);
1881
+ background-color: rgba(0, 0, 0, 0.04);
1882
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
1882
1883
  }
1883
1884
 
1884
1885
  body[data-theme='dark'] .positions-replay-component .metric-card {
1885
- background-color: rgba(255, 255, 255, 5%);
1886
+ background-color: rgba(255, 255, 255, 0.05);
1886
1887
  }
1887
1888
 
1888
1889
  body[data-theme='dark'] .positions-replay-component .metric-card:hover {
1889
- background-color: rgba(255, 255, 255, 8%);
1890
+ background-color: rgba(255, 255, 255, 0.08);
1890
1891
  }
1891
1892
 
1892
1893
  .positions-replay-component .metric-label {
@@ -2221,7 +2222,7 @@ body[data-theme='dark'] #fleet-ops-fleet-schedule-container .fc-timeline-slot.fc
2221
2222
  font-weight: 500;
2222
2223
  padding: 0.1rem 0.35rem;
2223
2224
  cursor: pointer;
2224
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
2225
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
2225
2226
  }
2226
2227
 
2227
2228
  #fleet-ops-fleet-schedule-container .fc-event:hover {
@@ -2390,7 +2391,7 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-day {
2390
2391
  font-weight: 500;
2391
2392
  padding: 0.25rem 0.5rem;
2392
2393
  cursor: pointer;
2393
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
2394
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
2394
2395
  border: none;
2395
2396
  min-height: 3.25rem;
2396
2397
  overflow: hidden;
@@ -2412,11 +2413,11 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-day {
2412
2413
 
2413
2414
  /* Drag-over hover state */
2414
2415
  #fleet-ops-scheduler-timeline[data-dragging-over='true'] .ec-main {
2415
- background-color: rgba(99, 102, 241, 4%);
2416
+ background-color: rgba(99, 102, 241, 0.04);
2416
2417
  }
2417
2418
 
2418
2419
  body[data-theme='dark'] #fleet-ops-scheduler-timeline[data-dragging-over='true'] .ec-main {
2419
- background-color: rgba(129, 140, 248, 6%);
2420
+ background-color: rgba(129, 140, 248, 0.06);
2420
2421
  }
2421
2422
 
2422
2423
  /* Per-column drop cursor indicator */
@@ -2429,13 +2430,13 @@ body[data-theme='dark'] #fleet-ops-scheduler-timeline[data-dragging-over='true']
2429
2430
  pointer-events: none;
2430
2431
  z-index: 10;
2431
2432
  border-radius: 1px;
2432
- box-shadow: 0 0 6px rgba(99, 102, 241, 70%);
2433
+ box-shadow: 0 0 6px rgba(99, 102, 241, 0.7);
2433
2434
  transition: left 0.04s linear;
2434
2435
  }
2435
2436
 
2436
2437
  body[data-theme='dark'] #fleet-ops-scheduler-timeline .ec-drop-cursor {
2437
2438
  background-color: #818cf8;
2438
- box-shadow: 0 0 6px rgba(129, 140, 248, 70%);
2439
+ box-shadow: 0 0 6px rgba(129, 140, 248, 0.7);
2439
2440
  }
2440
2441
 
2441
2442
  /* Full-height timeline */
@@ -2726,7 +2727,7 @@ body[data-theme='dark'] .order-pool-card.selected,
2726
2727
  }
2727
2728
 
2728
2729
  .vehicle-drop-zone.drag-over {
2729
- background: rgba(59, 130, 246, 10%);
2730
+ background: rgba(59, 130, 246, 0.1);
2730
2731
  outline: 1px dashed #3b82f6;
2731
2732
  border-radius: 4px;
2732
2733
  }
@@ -2832,7 +2833,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2832
2833
  border-radius: 50%;
2833
2834
  background: #3b82f6;
2834
2835
  border: 2px solid #fff;
2835
- box-shadow: 0 1px 3px rgba(0, 0, 0, 50%);
2836
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
2836
2837
  transition: transform 0.1s;
2837
2838
  }
2838
2839
 
@@ -2848,7 +2849,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2848
2849
  height: 16px;
2849
2850
  border-radius: 50%;
2850
2851
  border: 2px solid #fff;
2851
- box-shadow: 0 1px 3px rgba(0, 0, 0, 50%);
2852
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
2852
2853
  background: #ef4444; /* default: offline */
2853
2854
  }
2854
2855
 
@@ -2875,7 +2876,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2875
2876
  * Minimal padding, small font, semi-transparent dark background.
2876
2877
  */
2877
2878
  .fleetops-waypoint-tooltip {
2878
- background: rgba(15, 23, 42, 88%) !important;
2879
+ background: rgba(15, 23, 42, 0.88) !important;
2879
2880
  border: none !important;
2880
2881
  border-radius: 4px !important;
2881
2882
  color: #f8fafc !important;
@@ -2883,11 +2884,11 @@ body[data-theme='dark'] .import-dropzone.dragging,
2883
2884
  font-weight: 600 !important;
2884
2885
  padding: 3px 7px !important;
2885
2886
  white-space: nowrap;
2886
- box-shadow: 0 2px 6px rgba(0, 0, 0, 35%) !important;
2887
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35) !important;
2887
2888
  }
2888
2889
 
2889
2890
  .fleetops-waypoint-tooltip::before {
2890
- border-top-color: rgba(15, 23, 42, 88%) !important;
2891
+ border-top-color: rgba(15, 23, 42, 0.88) !important;
2891
2892
  }
2892
2893
 
2893
2894
  /* ============================================================
@@ -2899,7 +2900,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2899
2900
  */
2900
2901
  .fleetops-waypoint-popup-wrapper .leaflet-popup-content-wrapper {
2901
2902
  border-radius: 6px !important;
2902
- box-shadow: 0 4px 16px rgba(0, 0, 0, 20%) !important;
2903
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important;
2903
2904
  padding: 0 !important;
2904
2905
  overflow: hidden;
2905
2906
  }
@@ -2986,10 +2987,10 @@ body[data-theme='dark'] .import-dropzone.dragging,
2986
2987
  }
2987
2988
 
2988
2989
  .fleetops-route-tooltip-wrapper .leaflet-tooltip {
2989
- background: rgba(15, 23, 42, 92%) !important;
2990
+ background: rgba(15, 23, 42, 0.92) !important;
2990
2991
  border: none !important;
2991
2992
  border-radius: 5px !important;
2992
- box-shadow: 0 3px 10px rgba(0, 0, 0, 30%) !important;
2993
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3) !important;
2993
2994
  padding: 6px 10px !important;
2994
2995
  color: #f1f5f9 !important;
2995
2996
  font-size: 11px !important;
@@ -2997,7 +2998,7 @@ body[data-theme='dark'] .import-dropzone.dragging,
2997
2998
  }
2998
2999
 
2999
3000
  .fleetops-route-tooltip-wrapper .leaflet-tooltip::before {
3000
- border-top-color: rgba(15, 23, 42, 92%) !important;
3001
+ border-top-color: rgba(15, 23, 42, 0.92) !important;
3001
3002
  }
3002
3003
 
3003
3004
  .fleetops-route-tooltip {
@@ -3188,7 +3189,7 @@ body[data-theme='dark'] #fleet-ops-orchestrator-plan-timeline .ec-day {
3188
3189
  font-weight: 500;
3189
3190
  padding: 0.25rem 0.5rem;
3190
3191
  cursor: default;
3191
- box-shadow: 0 1px 2px rgba(0, 0, 0, 8%);
3192
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
3192
3193
  border: none;
3193
3194
  min-height: 3.25rem;
3194
3195
  overflow: hidden;
@@ -3393,21 +3394,21 @@ body[data-theme='dark'] .import-mapping-row,
3393
3394
  }
3394
3395
 
3395
3396
  .import-mapping-row:hover {
3396
- background: rgba(0, 0, 0, 2%); /* light mode hover */
3397
+ background: rgba(0, 0, 0, 0.02); /* light mode hover */
3397
3398
  }
3398
3399
 
3399
3400
  body[data-theme='dark'] .import-mapping-row:hover,
3400
3401
  .dark .import-mapping-row:hover {
3401
- background: rgba(255, 255, 255, 2%);
3402
+ background: rgba(255, 255, 255, 0.02);
3402
3403
  }
3403
3404
 
3404
3405
  /* Highlight rows that have a mapping applied */
3405
3406
  .import-mapping-row--mapped {
3406
- background: rgba(16, 185, 129, 5%);
3407
+ background: rgba(16, 185, 129, 0.05);
3407
3408
  }
3408
3409
 
3409
3410
  .import-mapping-row--mapped:hover {
3410
- background: rgba(16, 185, 129, 9%);
3411
+ background: rgba(16, 185, 129, 0.09);
3411
3412
  }
3412
3413
 
3413
3414
  /* Column sizing helpers */
@@ -3618,15 +3619,15 @@ body[data-theme='light'] .import-preview-table td {
3618
3619
  }
3619
3620
 
3620
3621
  .import-preview-table tbody tr:hover td {
3621
- background: rgba(255, 255, 255, 2%);
3622
+ background: rgba(255, 255, 255, 0.02);
3622
3623
  }
3623
3624
 
3624
3625
  body[data-theme='light'] .import-preview-table tbody tr:hover td {
3625
- background: rgba(0, 0, 0, 2%);
3626
+ background: rgba(0, 0, 0, 0.02);
3626
3627
  }
3627
3628
 
3628
3629
  .import-preview-row--error td {
3629
- background: rgba(239, 68, 68, 6%) !important;
3630
+ background: rgba(239, 68, 68, 0.06) !important;
3630
3631
  }
3631
3632
 
3632
3633
  /* Address cell — allow wrapping for long addresses */
@@ -3650,17 +3651,17 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3650
3651
  }
3651
3652
 
3652
3653
  .import-preview-badge--blue {
3653
- background: rgba(59, 130, 246, 15%);
3654
+ background: rgba(59, 130, 246, 0.15);
3654
3655
  color: #60a5fa;
3655
3656
  }
3656
3657
 
3657
3658
  .import-preview-badge--gray {
3658
- background: rgba(107, 114, 128, 15%);
3659
+ background: rgba(107, 114, 128, 0.15);
3659
3660
  color: #9ca3af;
3660
3661
  }
3661
3662
 
3662
3663
  .import-preview-badge--green {
3663
- background: rgba(16, 185, 129, 15%);
3664
+ background: rgba(16, 185, 129, 0.15);
3664
3665
  color: #34d399;
3665
3666
  }
3666
3667
 
@@ -3746,7 +3747,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3746
3747
  border-top: 1px solid #1f2937;
3747
3748
  font-size: 0.72rem;
3748
3749
  color: #fbbf24;
3749
- background: rgba(251, 191, 36, 6%);
3750
+ background: rgba(251, 191, 36, 0.06);
3750
3751
  }
3751
3752
 
3752
3753
  .fleetops-google-contextmenu {
@@ -3754,7 +3755,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3754
3755
  background: #1f2937;
3755
3756
  color: #f9fafb;
3756
3757
  border-radius: 0.375rem;
3757
- box-shadow: 0 10px 30px rgba(15, 23, 42, 28%);
3758
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.28);
3758
3759
  border: 0;
3759
3760
  padding: 0;
3760
3761
  overflow: hidden;
@@ -3808,7 +3809,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3808
3809
  padding: 0.313rem;
3809
3810
  border-radius: 9999px;
3810
3811
  background: #fff;
3811
- box-shadow: 0 10px 30px rgba(15, 23, 42, 18%);
3812
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.18);
3812
3813
  border: 0;
3813
3814
  pointer-events: auto;
3814
3815
  }
@@ -3899,7 +3900,7 @@ body[data-theme='light'] .import-preview-table tbody tr:hover td {
3899
3900
  body[data-theme='light'] .fleetops-google-contextmenu {
3900
3901
  background: #fff;
3901
3902
  color: #111827;
3902
- box-shadow: 0 10px 30px rgba(15, 23, 42, 18%);
3903
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.18);
3903
3904
  }
3904
3905
 
3905
3906
  body[data-theme='light'] .fleetops-google-contextmenu > .fleetops-google-contextmenu-separator {
@@ -3945,7 +3946,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3945
3946
  max-width: 180px;
3946
3947
  padding: 2px 8px;
3947
3948
  border-radius: 9999px;
3948
- background: rgba(17, 24, 39, 88%);
3949
+ background: rgba(17, 24, 39, 0.88);
3949
3950
  color: #f9fafb;
3950
3951
  font-size: 11px;
3951
3952
  font-weight: 600;
@@ -3953,22 +3954,22 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3953
3954
  white-space: nowrap;
3954
3955
  text-overflow: ellipsis;
3955
3956
  overflow: hidden;
3956
- box-shadow: 0 6px 16px rgba(15, 23, 42, 22%);
3957
+ box-shadow: 0 6px 16px rgba(15, 23, 42, 0.22);
3957
3958
  }
3958
3959
 
3959
3960
  .fleetops-google-hover-tooltip {
3960
3961
  position: absolute;
3961
3962
  z-index: 99999;
3962
3963
  display: none;
3963
- max-width: 240px;
3964
+ max-width: none;
3964
3965
  padding: 0.45rem 0.65rem;
3965
3966
  border-radius: 0.625rem;
3966
- background: rgba(17, 24, 39, 94%);
3967
+ background: rgba(17, 24, 39, 0.94);
3967
3968
  color: #f9fafb;
3968
3969
  font-size: 0.75rem;
3969
3970
  line-height: 1.25;
3970
3971
  pointer-events: none;
3971
- box-shadow: 0 10px 30px rgba(15, 23, 42, 22%);
3972
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.22);
3972
3973
  transform: translateY(-50%);
3973
3974
  }
3974
3975
 
@@ -3988,8 +3989,8 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3988
3989
  height: 8px;
3989
3990
  border-radius: 9999px;
3990
3991
  background: #3b82f6;
3991
- border: 1px solid rgba(255, 255, 255, 95%);
3992
- box-shadow: 0 0 0 1px rgba(59, 130, 246, 25%);
3992
+ border: 1px solid rgba(255, 255, 255, 0.95);
3993
+ box-shadow: 0 0 0 1px rgba(59, 130, 246, 0.25);
3993
3994
  }
3994
3995
 
3995
3996
  .fleetops-google-popover {
@@ -3999,7 +4000,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
3999
4000
  border-radius: 1rem;
4000
4001
  background: #111827;
4001
4002
  color: #f9fafb;
4002
- box-shadow: 0 16px 40px rgba(15, 23, 42, 28%);
4003
+ box-shadow: 0 16px 40px rgba(15, 23, 42, 0.28);
4003
4004
  }
4004
4005
 
4005
4006
  .fleetops-google-popover--compact {
@@ -4064,3 +4065,762 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4064
4065
  .gm-style .gm-style-iw-tc::after {
4065
4066
  background: #111827 !important;
4066
4067
  }
4068
+
4069
+ .fleetops-google-popover__close {
4070
+ position: absolute;
4071
+ top: 0.25rem;
4072
+ right: 0.35rem;
4073
+ z-index: 1;
4074
+ width: 1rem;
4075
+ height: 1rem;
4076
+ border: 0;
4077
+ border-radius: 9999px;
4078
+ background: rgba(31, 41, 55, 0.8);
4079
+ color: #d1d5db;
4080
+ font-size: 0.8rem;
4081
+ line-height: 1rem;
4082
+ text-align: center;
4083
+ cursor: pointer;
4084
+ }
4085
+
4086
+ .fleetops-google-popover__close:hover {
4087
+ background: rgba(55, 65, 81, 0.95);
4088
+ color: #fff;
4089
+ }
4090
+
4091
+ /* Tracking intelligence panel */
4092
+ .tracking-intelligence {
4093
+ display: flex;
4094
+ flex-direction: column;
4095
+ gap: 0.75rem;
4096
+ }
4097
+
4098
+ .tracking-intelligence__status {
4099
+ display: flex;
4100
+ flex-wrap: wrap;
4101
+ align-items: center;
4102
+ gap: 0.375rem;
4103
+ font-size: 0.72rem;
4104
+ }
4105
+
4106
+ .tracking-intelligence__updated {
4107
+ margin-left: auto;
4108
+ color: #6b7280;
4109
+ white-space: nowrap;
4110
+ }
4111
+
4112
+ [data-theme='dark'] .tracking-intelligence__updated {
4113
+ color: #6b7280;
4114
+ }
4115
+
4116
+ .tracking-intelligence-pill {
4117
+ display: inline-flex;
4118
+ align-items: center;
4119
+ gap: 0.35rem;
4120
+ padding: 0.125rem 0.5rem;
4121
+ border: 1px solid transparent;
4122
+ border-radius: 9999px;
4123
+ font-size: 0.7rem;
4124
+ font-weight: 600;
4125
+ line-height: 1.35;
4126
+ white-space: nowrap;
4127
+ }
4128
+
4129
+ .tracking-intelligence-pill__dot {
4130
+ width: 0.35rem;
4131
+ height: 0.35rem;
4132
+ border-radius: 9999px;
4133
+ background: currentcolor;
4134
+ }
4135
+
4136
+ .tracking-intelligence-pill--good {
4137
+ color: #16a34a;
4138
+ background: rgba(34, 197, 94, 0.1);
4139
+ border-color: rgba(34, 197, 94, 0.24);
4140
+ }
4141
+
4142
+ .tracking-intelligence-pill--warn {
4143
+ color: #d97706;
4144
+ background: rgba(245, 158, 11, 0.12);
4145
+ border-color: rgba(245, 158, 11, 0.28);
4146
+ }
4147
+
4148
+ .tracking-intelligence-pill--bad {
4149
+ color: #dc2626;
4150
+ background: rgba(239, 68, 68, 0.11);
4151
+ border-color: rgba(239, 68, 68, 0.28);
4152
+ }
4153
+
4154
+ .tracking-intelligence-pill--muted {
4155
+ color: #6b7280;
4156
+ background: rgba(107, 114, 128, 0.1);
4157
+ border-color: rgba(107, 114, 128, 0.22);
4158
+ }
4159
+
4160
+ [data-theme='dark'] .tracking-intelligence-pill--good {
4161
+ color: #5bc796;
4162
+ background: rgba(91, 199, 150, 0.12);
4163
+ }
4164
+
4165
+ [data-theme='dark'] .tracking-intelligence-pill--warn {
4166
+ color: #e5a14b;
4167
+ background: rgba(229, 161, 75, 0.12);
4168
+ border-color: rgba(229, 161, 75, 0.32);
4169
+ }
4170
+
4171
+ [data-theme='dark'] .tracking-intelligence-pill--bad {
4172
+ color: #e26b6b;
4173
+ background: rgba(226, 107, 107, 0.13);
4174
+ border-color: rgba(226, 107, 107, 0.32);
4175
+ }
4176
+
4177
+ [data-theme='dark'] .tracking-intelligence-pill--muted {
4178
+ color: #7c8896;
4179
+ background: rgba(255, 255, 255, 0.04);
4180
+ border-color: #232c38;
4181
+ }
4182
+
4183
+ .tracking-intelligence-alert {
4184
+ display: grid;
4185
+ grid-template-columns: 1.125rem minmax(0, 1fr) auto;
4186
+ gap: 0.625rem;
4187
+ align-items: flex-start;
4188
+ padding: 0.625rem 0.7rem;
4189
+ border: 1px solid rgba(245, 158, 11, 0.28);
4190
+ border-radius: 0.5rem;
4191
+ background: rgba(245, 158, 11, 0.1);
4192
+ color: #92400e;
4193
+ font-size: 0.75rem;
4194
+ }
4195
+
4196
+ .tracking-intelligence-alert--critical {
4197
+ border-color: rgba(239, 68, 68, 0.28);
4198
+ background: rgba(239, 68, 68, 0.1);
4199
+ color: #991b1b;
4200
+ }
4201
+
4202
+ .tracking-intelligence-alert__icon {
4203
+ display: flex;
4204
+ width: 1.125rem;
4205
+ height: 1.125rem;
4206
+ align-items: center;
4207
+ justify-content: center;
4208
+ border-radius: 0.3125rem;
4209
+ background: rgba(0, 0, 0, 0.1);
4210
+ }
4211
+
4212
+ .tracking-intelligence-alert__title {
4213
+ color: #111827;
4214
+ font-weight: 700;
4215
+ }
4216
+
4217
+ .tracking-intelligence-alert__body {
4218
+ margin-top: 0.125rem;
4219
+ color: #78350f;
4220
+ line-height: 1.35;
4221
+ }
4222
+
4223
+ [data-theme='dark'] .tracking-intelligence-alert {
4224
+ border-color: rgba(229, 161, 75, 0.32);
4225
+ background: rgba(229, 161, 75, 0.12);
4226
+ color: #e5a14b;
4227
+ }
4228
+
4229
+ [data-theme='dark'] .tracking-intelligence-alert--critical {
4230
+ border-color: rgba(226, 107, 107, 0.32);
4231
+ background: rgba(226, 107, 107, 0.13);
4232
+ color: #e26b6b;
4233
+ }
4234
+
4235
+ [data-theme='dark'] .tracking-intelligence-alert__title {
4236
+ color: #eceff4;
4237
+ }
4238
+
4239
+ [data-theme='dark'] .tracking-intelligence-alert__body {
4240
+ color: #b6bfca;
4241
+ }
4242
+
4243
+ .tracking-intelligence-alert--critical .tracking-intelligence-alert__cta {
4244
+ border-color: rgba(239, 68, 68, 0.3);
4245
+ background: rgba(239, 68, 68, 0.08);
4246
+ color: #b91c1c;
4247
+ }
4248
+
4249
+ [data-theme='dark'] .tracking-intelligence-alert--critical .tracking-intelligence-alert__cta {
4250
+ border-color: rgba(226, 107, 107, 0.32);
4251
+ background: rgba(226, 107, 107, 0.1);
4252
+ color: #e26b6b;
4253
+ }
4254
+
4255
+ .tracking-intelligence__eta-grid {
4256
+ display: grid;
4257
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
4258
+ gap: 0.5rem;
4259
+ }
4260
+
4261
+ .tracking-intelligence-cell,
4262
+ .tracking-intelligence-destination,
4263
+ .tracking-intelligence-distance,
4264
+ .tracking-intelligence-diagnostics,
4265
+ .tracking-intelligence-labels,
4266
+ .tracking-stop-progress {
4267
+ border: 1px solid #e5e7eb;
4268
+ border-radius: 0.5rem;
4269
+ background: #f9fafb;
4270
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);
4271
+ }
4272
+
4273
+ [data-theme='dark'] .tracking-intelligence-cell,
4274
+ [data-theme='dark'] .tracking-intelligence-destination,
4275
+ [data-theme='dark'] .tracking-intelligence-distance,
4276
+ [data-theme='dark'] .tracking-intelligence-diagnostics,
4277
+ [data-theme='dark'] .tracking-intelligence-labels,
4278
+ [data-theme='dark'] .tracking-stop-progress {
4279
+ border-color: #374151;
4280
+ background: #1f2937;
4281
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.18);
4282
+ }
4283
+
4284
+ .tracking-intelligence-cell {
4285
+ min-width: 0;
4286
+ padding: 0.6rem 0.7rem;
4287
+ }
4288
+
4289
+ .tracking-intelligence-cell--accent {
4290
+ border-color: rgba(245, 158, 11, 0.32);
4291
+ background: linear-gradient(180deg, rgba(245, 158, 11, 0.08), transparent), #f9fafb;
4292
+ }
4293
+
4294
+ [data-theme='dark'] .tracking-intelligence-cell--accent {
4295
+ border-color: rgba(229, 161, 75, 0.32);
4296
+ background: linear-gradient(180deg, rgba(229, 161, 75, 0.08), transparent), #1f2937;
4297
+ }
4298
+
4299
+ .tracking-intelligence-cell__label {
4300
+ display: flex;
4301
+ flex-wrap: wrap;
4302
+ align-items: center;
4303
+ gap: 0.35rem;
4304
+ margin-bottom: 0.3rem;
4305
+ color: #6b7280;
4306
+ font-size: 0.62rem;
4307
+ font-weight: 700;
4308
+ letter-spacing: 0.08em;
4309
+ text-transform: uppercase;
4310
+ }
4311
+
4312
+ .tracking-intelligence-cell__value {
4313
+ overflow: hidden;
4314
+ color: #111827;
4315
+ font-size: 1rem;
4316
+ font-weight: 700;
4317
+ line-height: 1.2;
4318
+ text-overflow: ellipsis;
4319
+ white-space: nowrap;
4320
+ }
4321
+
4322
+ .tracking-intelligence-cell--accent .tracking-intelligence-cell__value {
4323
+ color: #d97706;
4324
+ }
4325
+
4326
+ .tracking-intelligence-cell__value--muted {
4327
+ color: #6b7280;
4328
+ text-decoration: line-through;
4329
+ text-decoration-color: #ef4444;
4330
+ text-decoration-thickness: 1px;
4331
+ }
4332
+
4333
+ .tracking-intelligence-cell__sub {
4334
+ margin-top: 0.2rem;
4335
+ overflow: hidden;
4336
+ color: #6b7280;
4337
+ font-size: 0.68rem;
4338
+ line-height: 1.25;
4339
+ text-overflow: ellipsis;
4340
+ white-space: nowrap;
4341
+ }
4342
+
4343
+ .tracking-intelligence-cell__sub--warn {
4344
+ color: #b45309;
4345
+ white-space: normal;
4346
+ }
4347
+
4348
+ [data-theme='dark'] .tracking-intelligence-cell__label,
4349
+ [data-theme='dark'] .tracking-intelligence-cell__sub {
4350
+ color: #7c8896;
4351
+ }
4352
+
4353
+ [data-theme='dark'] .tracking-intelligence-cell__value {
4354
+ color: #eceff4;
4355
+ }
4356
+
4357
+ [data-theme='dark'] .tracking-intelligence-cell--accent .tracking-intelligence-cell__value {
4358
+ color: #e5a14b;
4359
+ }
4360
+
4361
+ [data-theme='dark'] .tracking-intelligence-cell__value--muted {
4362
+ color: #7c8896;
4363
+ }
4364
+
4365
+ [data-theme='dark'] .tracking-intelligence-cell__sub--warn {
4366
+ color: #e5a14b;
4367
+ }
4368
+
4369
+ .tracking-intelligence-tag {
4370
+ padding: 0.0625rem 0.3rem;
4371
+ border-radius: 0.2rem;
4372
+ background: rgba(245, 158, 11, 0.12);
4373
+ color: #d97706;
4374
+ font-size: 0.55rem;
4375
+ font-weight: 800;
4376
+ }
4377
+
4378
+ .tracking-intelligence-confidence {
4379
+ display: grid;
4380
+ grid-template-columns: auto minmax(0, 1fr) auto;
4381
+ gap: 0.5rem;
4382
+ align-items: center;
4383
+ font-size: 0.7rem;
4384
+ }
4385
+
4386
+ .tracking-intelligence-confidence__label,
4387
+ .tracking-intelligence-confidence__value {
4388
+ color: #6b7280;
4389
+ font-weight: 700;
4390
+ text-transform: uppercase;
4391
+ }
4392
+
4393
+ .tracking-intelligence-confidence__segments {
4394
+ display: flex;
4395
+ gap: 0.125rem;
4396
+ }
4397
+
4398
+ .tracking-intelligence-confidence__segments span {
4399
+ height: 0.25rem;
4400
+ flex: 1;
4401
+ border-radius: 0.125rem;
4402
+ background: #e5e7eb;
4403
+ }
4404
+
4405
+ .tracking-intelligence-confidence__segments .is-lit {
4406
+ background: #d97706;
4407
+ }
4408
+
4409
+ .tracking-intelligence-confidence__segments.tracking-intelligence-pill--good .is-lit {
4410
+ background: #16a34a;
4411
+ }
4412
+
4413
+ .tracking-intelligence-confidence__segments.tracking-intelligence-pill--bad .is-lit {
4414
+ background: #dc2626;
4415
+ }
4416
+
4417
+ [data-theme='dark'] .tracking-intelligence-confidence__label,
4418
+ [data-theme='dark'] .tracking-intelligence-confidence__value {
4419
+ color: #7c8896;
4420
+ }
4421
+
4422
+ [data-theme='dark'] .tracking-intelligence-confidence__segments span {
4423
+ background: #232c38;
4424
+ }
4425
+
4426
+ [data-theme='dark'] .tracking-intelligence-confidence__segments .is-lit {
4427
+ background: #e5a14b;
4428
+ }
4429
+
4430
+ .tracking-intelligence-destination {
4431
+ display: flex;
4432
+ gap: 0.625rem;
4433
+ align-items: flex-start;
4434
+ padding: 0.65rem 0.7rem;
4435
+ }
4436
+
4437
+ .tracking-intelligence-destination__marker {
4438
+ display: flex;
4439
+ width: 1.5rem;
4440
+ height: 1.5rem;
4441
+ flex-shrink: 0;
4442
+ align-items: center;
4443
+ justify-content: center;
4444
+ border-radius: 9999px;
4445
+ background: #f59e0b;
4446
+ color: #1f1300;
4447
+ font-size: 0.7rem;
4448
+ font-weight: 800;
4449
+ }
4450
+
4451
+ .tracking-intelligence-destination__label {
4452
+ color: #6b7280;
4453
+ font-size: 0.62rem;
4454
+ font-weight: 800;
4455
+ letter-spacing: 0.08em;
4456
+ text-transform: uppercase;
4457
+ }
4458
+
4459
+ .tracking-intelligence-destination__address {
4460
+ margin-top: 0.15rem;
4461
+ color: #111827;
4462
+ font-size: 0.82rem;
4463
+ font-weight: 700;
4464
+ line-height: 1.3;
4465
+ }
4466
+
4467
+ .tracking-intelligence-destination__eta {
4468
+ margin-top: 0.2rem;
4469
+ color: #6b7280;
4470
+ font-size: 0.7rem;
4471
+ }
4472
+
4473
+ [data-theme='dark'] .tracking-intelligence-destination__label,
4474
+ [data-theme='dark'] .tracking-intelligence-destination__eta {
4475
+ color: #7c8896;
4476
+ }
4477
+
4478
+ [data-theme='dark'] .tracking-intelligence-destination__address {
4479
+ color: #eceff4;
4480
+ }
4481
+
4482
+ .tracking-intelligence-distance {
4483
+ padding: 0.6rem 0.7rem;
4484
+ }
4485
+
4486
+ .tracking-intelligence-distance__row {
4487
+ display: grid;
4488
+ grid-template-columns: minmax(0, 1fr) auto;
4489
+ gap: 0.75rem;
4490
+ align-items: center;
4491
+ color: #6b7280;
4492
+ font-size: 0.72rem;
4493
+ }
4494
+
4495
+ .tracking-intelligence-distance__row + .tracking-intelligence-distance__row {
4496
+ margin-top: 0.35rem;
4497
+ }
4498
+
4499
+ .tracking-intelligence-distance__row strong {
4500
+ color: #111827;
4501
+ }
4502
+
4503
+ .tracking-intelligence-distance__bar {
4504
+ grid-column: 1 / -1;
4505
+ height: 0.32rem;
4506
+ overflow: hidden;
4507
+ border-radius: 9999px;
4508
+ background: #e5e7eb;
4509
+ }
4510
+
4511
+ .tracking-intelligence-distance__bar span {
4512
+ display: block;
4513
+ height: 100%;
4514
+ border-radius: inherit;
4515
+ background: #f59e0b;
4516
+ }
4517
+
4518
+ .tracking-intelligence-distance__bar--secondary span {
4519
+ background: #38bdf8;
4520
+ }
4521
+
4522
+ .tracking-intelligence-distance__foot {
4523
+ margin-top: 0.5rem;
4524
+ padding-top: 0.45rem;
4525
+ border-top: 1px dashed #d1d5db;
4526
+ color: #9ca3af;
4527
+ font-size: 0.65rem;
4528
+ }
4529
+
4530
+ [data-theme='dark'] .tracking-intelligence-distance__row {
4531
+ color: #7c8896;
4532
+ }
4533
+
4534
+ [data-theme='dark'] .tracking-intelligence-distance__row strong {
4535
+ color: #eceff4;
4536
+ }
4537
+
4538
+ [data-theme='dark'] .tracking-intelligence-distance__bar {
4539
+ background: #20293a;
4540
+ }
4541
+
4542
+ [data-theme='dark'] .tracking-intelligence-distance__bar span {
4543
+ background: #e5a14b;
4544
+ }
4545
+
4546
+ [data-theme='dark'] .tracking-intelligence-distance__bar--secondary span {
4547
+ background: #5baec7;
4548
+ }
4549
+
4550
+ [data-theme='dark'] .tracking-intelligence-distance__foot {
4551
+ border-color: #374151;
4552
+ color: #54616f;
4553
+ }
4554
+
4555
+ .tracking-intelligence-diagnostics {
4556
+ overflow: hidden;
4557
+ }
4558
+
4559
+ .tracking-intelligence-diagnostics summary {
4560
+ display: flex;
4561
+ cursor: pointer;
4562
+ align-items: center;
4563
+ justify-content: space-between;
4564
+ gap: 0.5rem;
4565
+ padding: 0.55rem 0.7rem;
4566
+ color: #6b7280;
4567
+ font-size: 0.68rem;
4568
+ font-weight: 800;
4569
+ letter-spacing: 0.08em;
4570
+ list-style: none;
4571
+ text-transform: uppercase;
4572
+ }
4573
+
4574
+ .tracking-intelligence-diagnostics__summary {
4575
+ display: inline-flex;
4576
+ align-items: center;
4577
+ gap: 0.35rem;
4578
+ white-space: nowrap;
4579
+ }
4580
+
4581
+ .tracking-intelligence-diagnostics__summary svg {
4582
+ transition: transform 160ms ease;
4583
+ }
4584
+
4585
+ .tracking-intelligence-diagnostics[open] .tracking-intelligence-diagnostics__summary svg {
4586
+ transform: rotate(90deg);
4587
+ }
4588
+
4589
+ .tracking-intelligence-diagnostics summary::-webkit-details-marker {
4590
+ display: none;
4591
+ }
4592
+
4593
+ .tracking-intelligence-diagnostics__body {
4594
+ padding: 0 0.7rem 0.7rem;
4595
+ }
4596
+
4597
+ .tracking-intelligence-diagnostics__row {
4598
+ display: flex;
4599
+ justify-content: space-between;
4600
+ gap: 1rem;
4601
+ padding: 0.28rem 0;
4602
+ border-top: 1px dashed #e5e7eb;
4603
+ color: #6b7280;
4604
+ font-size: 0.72rem;
4605
+ }
4606
+
4607
+ .tracking-intelligence-diagnostics__row strong {
4608
+ color: #111827;
4609
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
4610
+ }
4611
+
4612
+ .tracking-intelligence-diagnostics__warnings {
4613
+ display: flex;
4614
+ flex-wrap: wrap;
4615
+ gap: 0.25rem;
4616
+ padding-top: 0.5rem;
4617
+ }
4618
+
4619
+ .tracking-intelligence-diagnostics__warnings span {
4620
+ padding: 0.125rem 0.375rem;
4621
+ border: 1px solid rgba(245, 158, 11, 0.25);
4622
+ border-radius: 0.25rem;
4623
+ background: rgba(245, 158, 11, 0.1);
4624
+ color: #b45309;
4625
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
4626
+ font-size: 0.62rem;
4627
+ }
4628
+
4629
+ [data-theme='dark'] .tracking-intelligence-diagnostics summary,
4630
+ [data-theme='dark'] .tracking-intelligence-diagnostics__row {
4631
+ color: #7c8896;
4632
+ }
4633
+
4634
+ [data-theme='dark'] .tracking-intelligence-diagnostics__row {
4635
+ border-color: #374151;
4636
+ }
4637
+
4638
+ [data-theme='dark'] .tracking-intelligence-diagnostics__row strong {
4639
+ color: #eceff4;
4640
+ }
4641
+
4642
+ .tracking-stop-progress {
4643
+ padding: 0.65rem 0.7rem;
4644
+ }
4645
+
4646
+ .tracking-stop-progress__header {
4647
+ display: flex;
4648
+ align-items: baseline;
4649
+ justify-content: space-between;
4650
+ gap: 0.75rem;
4651
+ margin-bottom: 0.55rem;
4652
+ }
4653
+
4654
+ .tracking-stop-progress__title {
4655
+ color: #6b7280;
4656
+ font-size: 0.65rem;
4657
+ font-weight: 800;
4658
+ letter-spacing: 0.08em;
4659
+ text-transform: uppercase;
4660
+ }
4661
+
4662
+ .tracking-stop-progress__count {
4663
+ color: #6b7280;
4664
+ font-size: 0.7rem;
4665
+ white-space: nowrap;
4666
+ }
4667
+
4668
+ .tracking-stop-progress__scroller {
4669
+ overflow: auto hidden;
4670
+ min-height: 2rem;
4671
+ padding: 0.2rem 0 0.05rem;
4672
+ }
4673
+
4674
+ .tracking-stop-progress__rail {
4675
+ display: flex;
4676
+ min-width: 100%;
4677
+ }
4678
+
4679
+ .tracking-stop-progress__stop {
4680
+ min-width: 2.5rem;
4681
+ flex: 1;
4682
+ }
4683
+
4684
+ .tracking-stop-progress__line {
4685
+ display: flex;
4686
+ align-items: center;
4687
+ }
4688
+
4689
+ .tracking-stop-progress__connector {
4690
+ height: 1px;
4691
+ flex: 1;
4692
+ border-top: 1px dashed #d1d5db;
4693
+ }
4694
+
4695
+ .tracking-stop-progress__dot {
4696
+ position: relative;
4697
+ z-index: 1;
4698
+ display: flex;
4699
+ width: 1.25rem;
4700
+ height: 1.25rem;
4701
+ flex-shrink: 0;
4702
+ align-items: center;
4703
+ justify-content: center;
4704
+ border: 1px solid #d1d5db;
4705
+ border-radius: 9999px;
4706
+ background: #f3f4f6;
4707
+ color: #6b7280;
4708
+ font-size: 0.58rem;
4709
+ font-weight: 800;
4710
+ }
4711
+
4712
+ .tracking-stop-progress__dot--done {
4713
+ border-color: #22c55e;
4714
+ background: #22c55e;
4715
+ color: #06210f;
4716
+ }
4717
+
4718
+ .tracking-stop-progress__dot--active {
4719
+ border-color: #f59e0b;
4720
+ background: #f59e0b;
4721
+ color: #1f1300;
4722
+ box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.14);
4723
+ }
4724
+
4725
+ .tracking-stop-progress__dot--active::before,
4726
+ .fleetops-route-stop-badge--active::before {
4727
+ position: absolute;
4728
+ inset: -0.45rem;
4729
+ border: 1.5px solid currentcolor;
4730
+ border-radius: 9999px;
4731
+ content: '';
4732
+ opacity: 0.65;
4733
+ animation: fleetops-tracking-pulse 2.2s ease-out infinite;
4734
+ }
4735
+
4736
+ .fleetops-route-stop-badge--active {
4737
+ position: relative;
4738
+ overflow: visible !important;
4739
+ }
4740
+
4741
+ @keyframes fleetops-tracking-pulse {
4742
+ 0% {
4743
+ opacity: 0.7;
4744
+ transform: scale(0.72);
4745
+ }
4746
+
4747
+ 100% {
4748
+ opacity: 0;
4749
+ transform: scale(1.65);
4750
+ }
4751
+ }
4752
+
4753
+ [data-theme='dark'] .tracking-stop-progress__title,
4754
+ [data-theme='dark'] .tracking-stop-progress__count {
4755
+ color: #7c8896;
4756
+ }
4757
+
4758
+ [data-theme='dark'] .tracking-stop-progress__connector {
4759
+ border-color: #374151;
4760
+ }
4761
+
4762
+ [data-theme='dark'] .tracking-stop-progress__dot {
4763
+ border-color: #374151;
4764
+ background: #20293a;
4765
+ color: #7c8896;
4766
+ }
4767
+
4768
+ [data-theme='dark'] .tracking-stop-progress__dot--done {
4769
+ border-color: #5bc796;
4770
+ background: #5bc796;
4771
+ color: #0a1f15;
4772
+ }
4773
+
4774
+ [data-theme='dark'] .tracking-stop-progress__dot--active {
4775
+ border-color: #e5a14b;
4776
+ background: #e5a14b;
4777
+ color: #1a1206;
4778
+ }
4779
+
4780
+ .tracking-intelligence-alert__cta,
4781
+ .tracking-intelligence-footer__button {
4782
+ display: inline-flex;
4783
+ align-items: center;
4784
+ gap: 0.35rem;
4785
+ border: 1px solid rgba(245, 158, 11, 0.32);
4786
+ border-radius: 0.375rem;
4787
+ background: rgba(245, 158, 11, 0.08);
4788
+ color: #b45309;
4789
+ font-size: 0.7rem;
4790
+ font-weight: 700;
4791
+ line-height: 1.2;
4792
+ padding: 0.35rem 0.55rem;
4793
+ white-space: nowrap;
4794
+ }
4795
+
4796
+ .tracking-intelligence-alert__cta:disabled,
4797
+ .tracking-intelligence-footer__button:disabled {
4798
+ cursor: progress;
4799
+ opacity: 0.7;
4800
+ }
4801
+
4802
+ [data-theme='dark'] .tracking-intelligence-alert__cta,
4803
+ [data-theme='dark'] .tracking-intelligence-footer__button {
4804
+ border-color: rgba(229, 161, 75, 0.32);
4805
+ background: rgba(229, 161, 75, 0.1);
4806
+ color: #e5a14b;
4807
+ }
4808
+
4809
+ .tracking-intelligence-footer {
4810
+ display: flex;
4811
+ align-items: center;
4812
+ justify-content: space-between;
4813
+ gap: 0.75rem;
4814
+ color: #9ca3af;
4815
+ font-size: 0.68rem;
4816
+ }
4817
+
4818
+ .tracking-intelligence-labels {
4819
+ display: flex;
4820
+ flex-direction: column;
4821
+ padding: 0.75rem;
4822
+ }
4823
+
4824
+ .overflow-y-scroll-i {
4825
+ overflow-y: scroll !important;
4826
+ }