@fleetbase/fleetops-engine 0.6.51 → 0.6.53

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 (396) hide show
  1. package/README.md +0 -2
  2. package/addon/components/cell/telematic-provider.hbs +16 -0
  3. package/addon/components/cell/telematic-provider.js +36 -0
  4. package/addon/components/cell/telematic-status.hbs +1 -0
  5. package/addon/components/cell/telematic-status.js +39 -0
  6. package/addon/components/device/manager.hbs +5 -6
  7. package/addon/components/device/manager.js +12 -15
  8. package/addon/components/driver/details.hbs +1 -1
  9. package/addon/components/fleet/vehicle-listing.js +1 -0
  10. package/addon/components/fuel-integration/form.hbs +200 -0
  11. package/addon/components/fuel-integration/form.js +242 -0
  12. package/addon/components/fuel-integration/hub.hbs +154 -0
  13. package/addon/components/fuel-integration/hub.js +165 -0
  14. package/addon/components/fuel-integration/matching-priority.hbs +76 -0
  15. package/addon/components/fuel-integration/matching-priority.js +145 -0
  16. package/addon/components/fuel-report/details.hbs +13 -1
  17. package/addon/components/issue/details.hbs +3 -57
  18. package/addon/components/issue/details.js +0 -96
  19. package/addon/components/layout/fleet-ops-sidebar/operations-monitor.hbs +201 -0
  20. package/addon/components/layout/fleet-ops-sidebar/operations-monitor.js +589 -0
  21. package/addon/components/layout/fleet-ops-sidebar.hbs +19 -233
  22. package/addon/components/layout/fleet-ops-sidebar.js +287 -376
  23. package/addon/components/maintenance-schedule/form.js +1 -0
  24. package/addon/components/map/drawer/device-event-listing.hbs +12 -2
  25. package/addon/components/map/drawer/driver-listing.hbs +14 -1
  26. package/addon/components/map/drawer/place-listing.hbs +14 -1
  27. package/addon/components/map/drawer/position-listing.hbs +12 -2
  28. package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
  29. package/addon/components/modals/assigned-orders.hbs +40 -0
  30. package/addon/components/modals/attach-device.hbs +4 -3
  31. package/addon/components/modals/attach-telematic-device.hbs +25 -0
  32. package/addon/components/modals/attach-telematic-device.js +3 -0
  33. package/addon/components/modals/driver-assign-order.hbs +7 -58
  34. package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
  35. package/addon/components/modals/fleet-assign-driver.hbs +18 -0
  36. package/addon/components/modals/fleet-assign-driver.js +3 -0
  37. package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
  38. package/addon/components/modals/fleet-assign-vehicle.js +3 -0
  39. package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
  40. package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
  41. package/addon/components/modals/vehicle-details.hbs +6 -1
  42. package/addon/components/modals/vehicle-form.hbs +8 -1
  43. package/addon/components/order/card.hbs +106 -0
  44. package/addon/components/order/card.js +257 -0
  45. package/addon/components/order/form/payload.js +3 -1
  46. package/addon/components/order/form/service-rate.hbs +2 -0
  47. package/addon/components/service-rate/form.hbs +3 -2
  48. package/addon/components/telematic/details.hbs +98 -87
  49. package/addon/components/telematic/details.js +230 -1
  50. package/addon/components/telematic/form.hbs +303 -72
  51. package/addon/components/telematic/form.js +519 -3
  52. package/addon/components/telematic/hub.hbs +149 -0
  53. package/addon/components/telematic/hub.js +142 -0
  54. package/addon/components/telematic/settings.hbs +152 -0
  55. package/addon/components/telematic/settings.js +45 -0
  56. package/addon/components/telematic/tab-empty-state.hbs +29 -0
  57. package/addon/components/telematic/tab-empty-state.js +33 -0
  58. package/addon/components/vehicle/details.hbs +6 -1
  59. package/addon/components/vehicle/form.hbs +2 -1
  60. package/addon/components/widget/fuel-providers.hbs +43 -0
  61. package/addon/components/widget/fuel-providers.js +27 -0
  62. package/addon/controllers/connectivity/devices/index/details.js +27 -1
  63. package/addon/controllers/connectivity/devices/index.js +18 -1
  64. package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
  65. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
  66. package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
  67. package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
  68. package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
  69. package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
  70. package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
  71. package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
  72. package/addon/controllers/connectivity/telematics/details/events.js +244 -0
  73. package/addon/controllers/connectivity/telematics/details/index.js +3 -0
  74. package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
  75. package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
  76. package/addon/controllers/connectivity/telematics/details.js +149 -0
  77. package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
  78. package/addon/controllers/connectivity/telematics/index.js +25 -5
  79. package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
  80. package/addon/controllers/maintenance/index.js +100 -0
  81. package/addon/controllers/management/drivers/index/details.js +78 -1
  82. package/addon/controllers/management/drivers/index.js +39 -0
  83. package/addon/controllers/management/fleets/index/details.js +23 -1
  84. package/addon/controllers/management/fleets/index.js +6 -1
  85. package/addon/controllers/management/fuel-reports/index.js +37 -1
  86. package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
  87. package/addon/controllers/management/fuel-transactions/index.js +240 -0
  88. package/addon/controllers/management/index.js +88 -0
  89. package/addon/controllers/management/vehicles/index/details.js +32 -0
  90. package/addon/controllers/management/vehicles/index.js +26 -0
  91. package/addon/controllers/operations/orders/index.js +4 -0
  92. package/addon/controllers/settings/index.js +142 -0
  93. package/addon/controllers/settings/payments/index.js +5 -0
  94. package/addon/extension.js +31 -0
  95. package/addon/routes/analytics/index.js +3 -0
  96. package/addon/routes/connectivity/devices/index.js +3 -0
  97. package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
  98. package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
  99. package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
  100. package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
  101. package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
  102. package/addon/routes/connectivity/fuel-providers/details.js +18 -0
  103. package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
  104. package/addon/routes/connectivity/fuel-providers/index.js +20 -0
  105. package/addon/routes/connectivity/fuel-providers/new.js +3 -0
  106. package/addon/routes/connectivity/fuel-providers.js +3 -0
  107. package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
  108. package/addon/routes/connectivity/telematics/details/devices.js +30 -0
  109. package/addon/routes/connectivity/telematics/details/events.js +33 -0
  110. package/addon/routes/connectivity/telematics/details/index.js +3 -0
  111. package/addon/routes/connectivity/telematics/details/logs.js +17 -0
  112. package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
  113. package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
  114. package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
  115. package/addon/routes/connectivity/telematics/new.js +3 -0
  116. package/addon/routes/maintenance/index.js +3 -0
  117. package/addon/routes/maintenance/work-orders/index.js +2 -0
  118. package/addon/routes/management/drivers/index/details/activity.js +3 -0
  119. package/addon/routes/management/fuel-reports/index.js +2 -0
  120. package/addon/routes/management/fuel-transactions/index/details.js +18 -0
  121. package/addon/routes/management/fuel-transactions/index.js +21 -0
  122. package/addon/routes/management/fuel-transactions.js +3 -0
  123. package/addon/routes/settings/index.js +3 -0
  124. package/addon/routes.js +28 -9
  125. package/addon/services/device-actions.js +64 -1
  126. package/addon/services/device-event-actions.js +12 -1
  127. package/addon/services/driver-actions.js +147 -11
  128. package/addon/services/fleet-actions.js +66 -1
  129. package/addon/services/fuel-integration-actions.js +31 -0
  130. package/addon/services/issue-actions.js +1 -1
  131. package/addon/services/telematic-actions.js +9 -3
  132. package/addon/services/vehicle-actions.js +125 -0
  133. package/addon/styles/fleetops-engine.css +2237 -162
  134. package/addon/templates/analytics/index.hbs +14 -0
  135. package/addon/templates/analytics/reports/index.hbs +19 -1
  136. package/addon/templates/connectivity/devices/index.hbs +19 -1
  137. package/addon/templates/connectivity/events/index.hbs +16 -1
  138. package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
  139. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
  140. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
  141. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
  142. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
  143. package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
  144. package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
  145. package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
  146. package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
  147. package/addon/templates/connectivity/fuel-providers.hbs +1 -0
  148. package/addon/templates/connectivity/sensors/index.hbs +19 -1
  149. package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
  150. package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
  151. package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
  152. package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
  153. package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
  154. package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
  155. package/addon/templates/connectivity/telematics/details.hbs +53 -0
  156. package/addon/templates/connectivity/telematics/edit.hbs +27 -0
  157. package/addon/templates/connectivity/telematics/index.hbs +6 -8
  158. package/addon/templates/connectivity/telematics/new.hbs +24 -0
  159. package/addon/templates/maintenance/equipment/index.hbs +19 -1
  160. package/addon/templates/maintenance/index.hbs +113 -0
  161. package/addon/templates/maintenance/maintenances/index.hbs +15 -1
  162. package/addon/templates/maintenance/parts/index.hbs +19 -1
  163. package/addon/templates/maintenance/schedules/index.hbs +19 -1
  164. package/addon/templates/maintenance/work-orders/index.hbs +19 -1
  165. package/addon/templates/management/contacts/customers.hbs +15 -1
  166. package/addon/templates/management/contacts/index.hbs +19 -1
  167. package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
  168. package/addon/templates/management/drivers/index.hbs +19 -1
  169. package/addon/templates/management/fleets/index.hbs +19 -1
  170. package/addon/templates/management/fuel-reports/index.hbs +19 -1
  171. package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
  172. package/addon/templates/management/fuel-transactions/index.hbs +58 -0
  173. package/addon/templates/management/fuel-transactions.hbs +1 -0
  174. package/addon/templates/management/index.hbs +109 -73
  175. package/addon/templates/management/issues/index.hbs +19 -1
  176. package/addon/templates/management/places/index.hbs +19 -1
  177. package/addon/templates/management/vehicles/index.hbs +19 -1
  178. package/addon/templates/management/vendors/index.hbs +19 -1
  179. package/addon/templates/management/vendors/integrated.hbs +13 -1
  180. package/addon/templates/operations/orders/index.hbs +19 -1
  181. package/addon/templates/operations/service-rates/index.hbs +19 -1
  182. package/addon/templates/settings/index.hbs +83 -0
  183. package/addon/templates/settings/payments/index.hbs +15 -1
  184. package/addon/templates/settings/routing.hbs +2 -2
  185. package/addon/utils/fleet-ops-options.js +3 -0
  186. package/app/components/cell/telematic-provider.js +1 -0
  187. package/app/components/cell/telematic-status.js +1 -0
  188. package/app/components/fuel-integration/form.js +1 -0
  189. package/app/components/fuel-integration/hub.js +1 -0
  190. package/app/components/fuel-integration/matching-priority.js +1 -0
  191. package/app/components/modals/assigned-orders.js +1 -0
  192. package/app/components/modals/attach-telematic-device.js +1 -0
  193. package/app/components/modals/fleet-assign-driver.js +1 -0
  194. package/app/components/modals/fleet-assign-vehicle.js +1 -0
  195. package/app/components/modals/telematic-connection-diagnostics.js +1 -0
  196. package/app/components/order/card.js +1 -0
  197. package/app/components/telematic/hub.js +1 -0
  198. package/app/components/telematic/settings.js +1 -0
  199. package/app/components/telematic/tab-empty-state.js +1 -0
  200. package/app/components/widget/fuel-providers.js +1 -0
  201. package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
  202. package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  203. package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  204. package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  205. package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
  206. package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  207. package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
  208. package/app/controllers/connectivity/telematics/details/devices.js +1 -0
  209. package/app/controllers/connectivity/telematics/details/events.js +1 -0
  210. package/app/controllers/connectivity/telematics/details/index.js +1 -0
  211. package/app/controllers/connectivity/telematics/details/logs.js +1 -0
  212. package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
  213. package/app/controllers/connectivity/telematics/details.js +1 -0
  214. package/app/controllers/connectivity/telematics/edit.js +1 -0
  215. package/app/controllers/connectivity/telematics/new.js +1 -0
  216. package/app/controllers/maintenance/index.js +1 -0
  217. package/app/controllers/management/fuel-transactions/index/details.js +1 -0
  218. package/app/controllers/management/fuel-transactions/index.js +1 -0
  219. package/app/controllers/management/index.js +1 -0
  220. package/app/controllers/settings/index.js +1 -0
  221. package/app/routes/analytics/index.js +1 -0
  222. package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  223. package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  224. package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
  225. package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
  226. package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  227. package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  228. package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  229. package/app/routes/connectivity/fuel-providers/index.js +1 -0
  230. package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  231. package/app/routes/connectivity/fuel-providers.js +1 -0
  232. package/app/routes/connectivity/telematics/details/attachments.js +1 -0
  233. package/app/routes/connectivity/telematics/details/devices.js +1 -0
  234. package/app/routes/connectivity/telematics/details/events.js +1 -0
  235. package/app/routes/connectivity/telematics/details/index.js +1 -0
  236. package/app/routes/connectivity/telematics/details/logs.js +1 -0
  237. package/app/routes/connectivity/telematics/details/sensors.js +1 -0
  238. package/app/routes/connectivity/telematics/details.js +1 -0
  239. package/app/routes/connectivity/telematics/edit.js +1 -0
  240. package/app/routes/connectivity/telematics/new.js +1 -0
  241. package/app/routes/maintenance/index.js +1 -0
  242. package/app/routes/management/drivers/index/details/activity.js +1 -0
  243. package/app/routes/management/fuel-transactions/index/details.js +1 -0
  244. package/app/routes/management/fuel-transactions/index.js +1 -0
  245. package/app/routes/management/fuel-transactions.js +1 -0
  246. package/app/routes/settings/index.js +1 -0
  247. package/app/services/fuel-integration-actions.js +1 -0
  248. package/app/templates/analytics/index.js +1 -0
  249. package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  250. package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  251. package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
  252. package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
  253. package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  254. package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  255. package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  256. package/app/templates/connectivity/fuel-providers/index.js +1 -0
  257. package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  258. package/app/templates/connectivity/fuel-providers.js +1 -0
  259. package/app/templates/connectivity/telematics/details/attachments.js +1 -0
  260. package/app/templates/connectivity/telematics/details/devices.js +1 -0
  261. package/app/templates/connectivity/telematics/details/events.js +1 -0
  262. package/app/templates/connectivity/telematics/details/index.js +1 -0
  263. package/app/templates/connectivity/telematics/details/logs.js +1 -0
  264. package/app/templates/connectivity/telematics/details/sensors.js +1 -0
  265. package/app/templates/connectivity/telematics/details.js +1 -0
  266. package/app/templates/connectivity/telematics/edit.js +1 -0
  267. package/app/templates/connectivity/telematics/new.js +1 -0
  268. package/app/templates/maintenance/index.js +1 -0
  269. package/app/templates/management/drivers/index/details/activity.js +1 -0
  270. package/app/templates/management/fuel-transactions/index/details.js +1 -0
  271. package/app/templates/management/fuel-transactions/index.js +1 -0
  272. package/app/templates/management/fuel-transactions.js +1 -0
  273. package/app/templates/management/index.js +1 -0
  274. package/app/templates/settings/index.js +1 -0
  275. package/assets/images/telematics/providers/afaqy.webp +0 -0
  276. package/assets/images/telematics/providers/default.webp +0 -0
  277. package/assets/images/telematics/providers/flespi.webp +0 -0
  278. package/assets/images/telematics/providers/geotab.webp +0 -0
  279. package/assets/images/telematics/providers/safee.webp +0 -0
  280. package/assets/images/telematics/providers/samsara.webp +0 -0
  281. package/composer.json +1 -1
  282. package/extension.json +1 -1
  283. package/package.json +4 -4
  284. package/server/config/fuel-providers.php +42 -0
  285. package/server/config/telematics.php +139 -130
  286. package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
  287. package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
  288. package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
  289. package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
  290. package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
  291. package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
  292. package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php +30 -0
  293. package/server/src/Console/Commands/FixInvalidPolymorphicRelationTypeNamespaces.php +1 -0
  294. package/server/src/Contracts/FuelProvider.php +30 -0
  295. package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
  296. package/server/src/Events/FuelProviderTransactionImported.php +17 -0
  297. package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
  298. package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
  299. package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
  300. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
  301. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +140 -2
  302. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
  303. package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
  304. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
  305. package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
  306. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
  307. package/server/src/Http/Controllers/Internal/v1/HubController.php +300 -0
  308. package/server/src/Http/Controllers/Internal/v1/SearchController.php +506 -0
  309. package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
  310. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +179 -16
  311. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +249 -0
  312. package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
  313. package/server/src/Http/Filter/DeviceFilter.php +74 -0
  314. package/server/src/Http/Filter/DriverFilter.php +6 -0
  315. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
  316. package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
  317. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
  318. package/server/src/Http/Filter/FuelReportFilter.php +10 -0
  319. package/server/src/Http/Filter/VehicleFilter.php +6 -0
  320. package/server/src/Http/Resources/v1/Driver.php +15 -0
  321. package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
  322. package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
  323. package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
  324. package/server/src/Http/Resources/v1/FuelReport.php +28 -22
  325. package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
  326. package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
  327. package/server/src/Http/Resources/v1/Vehicle.php +17 -0
  328. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
  329. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
  330. package/server/src/Jobs/SyncTelematicDevicesJob.php +105 -17
  331. package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
  332. package/server/src/Models/Asset.php +2 -1
  333. package/server/src/Models/Contact.php +2 -1
  334. package/server/src/Models/Device.php +27 -4
  335. package/server/src/Models/DeviceEvent.php +40 -3
  336. package/server/src/Models/Driver.php +3 -2
  337. package/server/src/Models/Equipment.php +2 -1
  338. package/server/src/Models/Fleet.php +2 -1
  339. package/server/src/Models/FuelProviderConnection.php +60 -0
  340. package/server/src/Models/FuelProviderSyncRun.php +58 -0
  341. package/server/src/Models/FuelProviderTransaction.php +119 -0
  342. package/server/src/Models/FuelReport.php +16 -1
  343. package/server/src/Models/Part.php +2 -1
  344. package/server/src/Models/Sensor.php +21 -4
  345. package/server/src/Models/ServiceRate.php +39 -2
  346. package/server/src/Models/Vehicle.php +14 -2
  347. package/server/src/Models/Vendor.php +2 -1
  348. package/server/src/Providers/FleetOpsServiceProvider.php +20 -0
  349. package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
  350. package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
  351. package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
  352. package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
  353. package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
  354. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
  355. package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
  356. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +105 -38
  357. package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
  358. package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
  359. package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
  360. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
  361. package/server/src/Support/Telematics/TelematicService.php +340 -21
  362. package/server/src/routes.php +50 -4
  363. package/server/tests/FuelProviderRegistryTest.php +416 -0
  364. package/server/tests/HubRoutesTest.php +62 -0
  365. package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
  366. package/server/tests/TelematicsHardeningTest.php +359 -0
  367. package/server/tests/VehicleDriverAssignmentTest.php +51 -0
  368. package/translations/ar-ae.yml +23 -1
  369. package/translations/bg-bg.yaml +72 -0
  370. package/translations/en-us.yaml +83 -0
  371. package/translations/es-pa.yaml +72 -0
  372. package/translations/fr-fr.yaml +72 -0
  373. package/translations/mn-mn.yaml +72 -0
  374. package/translations/pt-br.yaml +72 -0
  375. package/translations/ru-ru.yaml +72 -0
  376. package/translations/vi-vn.yaml +98 -1
  377. package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
  378. package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
  379. package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
  380. package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
  381. package/addon/controllers/connectivity/telematics/index/details.js +0 -24
  382. package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
  383. package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
  384. package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
  385. package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
  386. package/addon/routes/connectivity/telematics/index/new.js +0 -3
  387. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  388. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  389. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  390. package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
  391. package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
  392. package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
  393. package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
  394. package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
  395. package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
  396. package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
@@ -114,7 +114,7 @@ body[data-theme='dark'] .next-table-wrapper.order-view-purchase-rate-table-wrapp
114
114
 
115
115
  nav.next-sidebar {
116
116
  height: 100%;
117
- overflow-y: scroll;
117
+ overflow: hidden;
118
118
  }
119
119
 
120
120
  /** places management css mods */
@@ -161,6 +161,156 @@ body.fleetbase-console .next-content-overlay > .next-content-overlay-panel-conta
161
161
  flex-shrink: 0;
162
162
  }
163
163
 
164
+ .fleetops-connectivity-kpi-tile {
165
+ transition:
166
+ transform 160ms ease-out,
167
+ box-shadow 160ms ease-out,
168
+ border-color 160ms ease-out;
169
+ }
170
+
171
+ .fleetops-connectivity-kpi-tile:hover {
172
+ box-shadow: 0 8px 24px -12px rgb(15 23 42 / 35%);
173
+ }
174
+
175
+ .fleetops-connectivity-kpi-tile .fleetops-connectivity-kpi-icon {
176
+ color: #64748b;
177
+ background-color: rgb(100 116 139 / 12%);
178
+ }
179
+
180
+ .fleetops-connectivity-kpi-accent-blue {
181
+ border-color: rgb(59 130 246 / 28%);
182
+ background-image: linear-gradient(135deg, rgb(59 130 246 / 10%) 0%, rgb(59 130 246 / 0%) 62%);
183
+ }
184
+
185
+ .fleetops-connectivity-kpi-accent-green {
186
+ border-color: rgb(16 185 129 / 28%);
187
+ background-image: linear-gradient(135deg, rgb(16 185 129 / 10%) 0%, rgb(16 185 129 / 0%) 62%);
188
+ }
189
+
190
+ .fleetops-connectivity-kpi-accent-amber {
191
+ border-color: rgb(245 158 11 / 32%);
192
+ background-image: linear-gradient(135deg, rgb(245 158 11 / 12%) 0%, rgb(245 158 11 / 0%) 62%);
193
+ }
194
+
195
+ .fleetops-connectivity-kpi-accent-rose {
196
+ border-color: rgb(244 63 94 / 28%);
197
+ background-image: linear-gradient(135deg, rgb(244 63 94 / 10%) 0%, rgb(244 63 94 / 0%) 62%);
198
+ }
199
+
200
+ .fleetops-connectivity-kpi-accent-blue .fleetops-connectivity-kpi-icon {
201
+ color: rgb(37 99 235);
202
+ background-color: rgb(59 130 246 / 12%);
203
+ }
204
+
205
+ .fleetops-connectivity-kpi-accent-green .fleetops-connectivity-kpi-icon {
206
+ color: rgb(5 150 105);
207
+ background-color: rgb(16 185 129 / 12%);
208
+ }
209
+
210
+ .fleetops-connectivity-kpi-accent-amber .fleetops-connectivity-kpi-icon {
211
+ color: rgb(217 119 6);
212
+ background-color: rgb(245 158 11 / 14%);
213
+ }
214
+
215
+ .fleetops-connectivity-kpi-accent-rose .fleetops-connectivity-kpi-icon {
216
+ color: rgb(225 29 72);
217
+ background-color: rgb(244 63 94 / 12%);
218
+ }
219
+
220
+ body[data-theme='dark'] .fleetops-connectivity-kpi-accent-blue .fleetops-connectivity-kpi-icon {
221
+ color: rgb(147 197 253);
222
+ }
223
+
224
+ body[data-theme='dark'] .fleetops-connectivity-kpi-accent-green .fleetops-connectivity-kpi-icon {
225
+ color: rgb(110 231 183);
226
+ }
227
+
228
+ body[data-theme='dark'] .fleetops-connectivity-kpi-accent-amber .fleetops-connectivity-kpi-icon {
229
+ color: rgb(252 211 77);
230
+ }
231
+
232
+ body[data-theme='dark'] .fleetops-connectivity-kpi-accent-rose .fleetops-connectivity-kpi-icon {
233
+ color: rgb(251 113 133);
234
+ }
235
+
236
+ .fleetops-provider-connections-actions .fleetops-provider-connections-search {
237
+ min-width: 16rem;
238
+ height: 2.25rem;
239
+ min-height: 2.25rem;
240
+ }
241
+
242
+ .fleetops-provider-connections-header {
243
+ display: grid;
244
+ grid-template-columns: minmax(0, 1fr);
245
+ gap: 0.75rem;
246
+ }
247
+
248
+ @media (width >= 1024px) {
249
+ .fleetops-provider-connections-header {
250
+ grid-template-columns: minmax(0, 26rem) minmax(22rem, max-content);
251
+ align-items: start;
252
+ justify-content: space-between;
253
+ }
254
+ }
255
+
256
+ .fleetops-provider-connections-actions .fleetops-provider-connections-action-button,
257
+ .fleetops-provider-connections-actions .fleetops-telematics-action-button,
258
+ .fleetops-provider-connections-actions button {
259
+ flex-shrink: 0;
260
+ height: 2.25rem;
261
+ min-height: 2.25rem;
262
+ white-space: nowrap;
263
+ }
264
+
265
+ .fleetops-provider-connections-actions button span {
266
+ white-space: nowrap;
267
+ }
268
+
269
+ .status-badge.long-offline-status-badge > span,
270
+ .status-badge.long_offline-status-badge > span {
271
+ background-color: #854d0e;
272
+ border-color: #a16207;
273
+ color: #fef9c3;
274
+ }
275
+
276
+ .status-badge.long-offline-status-badge > span svg,
277
+ .status-badge.long_offline-status-badge > span svg {
278
+ color: #fde047;
279
+ }
280
+
281
+ .fleetops-provider-connections-panel .table-wrapper table tbody tr td,
282
+ .fleetops-provider-connections-panel .next-table-wrapper table tbody tr td {
283
+ vertical-align: top;
284
+ }
285
+
286
+ .fleetops-provider-connections-panel .table-wrapper table tbody tr td.fleetops-provider-connections-cell-middle,
287
+ .fleetops-provider-connections-panel .next-table-wrapper table tbody tr td.fleetops-provider-connections-cell-middle {
288
+ vertical-align: middle;
289
+ }
290
+
291
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid,
292
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid table,
293
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid table tbody,
294
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid table tbody tr,
295
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid table tbody tr td,
296
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper,
297
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper table,
298
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper table tbody,
299
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper table tbody tr,
300
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper table tbody tr td {
301
+ background-color: rgb(17 24 39);
302
+ }
303
+
304
+ body[data-theme='dark'] .fleetops-provider-connections-panel .table-wrapper.table-fluid table tbody tr:nth-child(even):not(.is-selected) td,
305
+ body[data-theme='dark'] .fleetops-provider-connections-panel .next-table-wrapper table tbody tr:nth-child(even):not(.is-selected) td {
306
+ background-color: rgb(17 24 39);
307
+ }
308
+
309
+ .fleetops-provider-connections-panel div.has-floating-pagination,
310
+ .fleetops-provider-connections-panel .next-table-wrapper.has-floating-pagination {
311
+ padding-bottom: 0;
312
+ }
313
+
164
314
  /** calendar event css mods */
165
315
 
166
316
  #fleet-ops-scheduler-calendar .fc-h-event .fc-event-main .fc-event-title {
@@ -1764,160 +1914,1957 @@ body[data-theme='dark']
1764
1914
  margin-bottom: 1rem;
1765
1915
  }
1766
1916
 
1767
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1768
- .fleetops-order-list-overlay-inner-wrapper
1769
- .next-content-panel-body
1770
- > .next-content-panel-body-inner
1771
- .order-listings-row-container
1772
- > .order-listing-row
1773
- > .order-listing-row-details
1774
- > .order-listing-row-body
1775
- > .order-listing-row-body-address {
1776
- flex: 1;
1777
- font-size: 0.75rem;
1778
- line-height: 1.1rem;
1917
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1918
+ .fleetops-order-list-overlay-inner-wrapper
1919
+ .next-content-panel-body
1920
+ > .next-content-panel-body-inner
1921
+ .order-listings-row-container
1922
+ > .order-listing-row
1923
+ > .order-listing-row-details
1924
+ > .order-listing-row-body
1925
+ > .order-listing-row-body-address {
1926
+ flex: 1;
1927
+ font-size: 0.75rem;
1928
+ line-height: 1.1rem;
1929
+ }
1930
+
1931
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1932
+ .fleetops-order-list-overlay-inner-wrapper
1933
+ .next-content-panel-body
1934
+ > .next-content-panel-body-inner
1935
+ .order-listings-row-container
1936
+ > .order-listing-row
1937
+ > .order-listing-row-details
1938
+ > .order-listing-row-body
1939
+ > .order-listing-row-body-address
1940
+ .address-text {
1941
+ max-height: 50px;
1942
+ overflow-y: hidden;
1943
+ text-overflow: ellipsis;
1944
+ }
1945
+
1946
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1947
+ .fleetops-order-list-overlay-inner-wrapper
1948
+ .next-content-panel-body
1949
+ > .next-content-panel-body-inner
1950
+ .order-listings-row-container
1951
+ > .order-listing-row
1952
+ > .order-listing-row-details
1953
+ > .order-listing-row-body
1954
+ > .order-listing-row-body-address.start {
1955
+ text-align: left;
1956
+ }
1957
+
1958
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1959
+ .fleetops-order-list-overlay-inner-wrapper
1960
+ .next-content-panel-body
1961
+ > .next-content-panel-body-inner
1962
+ .order-listings-row-container
1963
+ > .order-listing-row
1964
+ > .order-listing-row-details
1965
+ > .order-listing-row-body
1966
+ > .order-listing-row-body-address.end {
1967
+ text-align: right;
1968
+ }
1969
+
1970
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1971
+ .fleetops-order-list-overlay-inner-wrapper
1972
+ .next-content-panel-body
1973
+ > .next-content-panel-body-inner
1974
+ .order-listings-row-container
1975
+ > .order-listing-row
1976
+ > .order-listing-row-details
1977
+ > .order-listing-row-footer
1978
+ .resource-assigned {
1979
+ display: flex;
1980
+ flex-direction: row;
1981
+ }
1982
+
1983
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1984
+ .fleetops-order-list-overlay-inner-wrapper
1985
+ .next-content-panel-body
1986
+ > .next-content-panel-body-inner
1987
+ .order-listings-row-container
1988
+ > .order-listing-row
1989
+ > .order-listing-row-details
1990
+ > .order-listing-row-footer {
1991
+ margin-top: 0.5rem;
1992
+ }
1993
+
1994
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
1995
+ .fleetops-order-list-overlay-inner-wrapper
1996
+ .next-content-panel-body
1997
+ > .next-content-panel-body-inner
1998
+ .order-listings-row-container
1999
+ > .order-listing-row
2000
+ > .order-listing-row-details
2001
+ > .order-listing-row-footer
2002
+ .resource-assigned
2003
+ > .resource-assigned-photo {
2004
+ display: flex;
2005
+ flex-shrink: 0;
2006
+ position: relative;
2007
+ padding-top: 0.2rem;
2008
+ }
2009
+
2010
+ .next-content-overlay-panel-body.fleetops-order-list-overlay
2011
+ .fleetops-order-list-overlay-inner-wrapper
2012
+ .next-content-panel-body
2013
+ > .next-content-panel-body-inner
2014
+ .order-listings-row-container
2015
+ > .order-listing-row
2016
+ > .order-listing-row-details
2017
+ > .order-listing-row-footer
2018
+ .resource-assigned
2019
+ > .resource-assigned-details {
2020
+ display: flex;
2021
+ flex-direction: column;
2022
+ font-size: 0.75rem;
2023
+ line-height: 1.1rem;
2024
+ }
2025
+
2026
+ .order-listing-row-table-details {
2027
+ color: #d1d5db;
2028
+ font-size: 0.75rem;
2029
+ line-height: 1rem;
2030
+ font-weight: normal;
2031
+ text-align: left;
2032
+ padding: 0.5rem;
2033
+ width: 100%;
2034
+ table-layout: fixed;
2035
+ }
2036
+
2037
+ .order-listing-row-table-details > thead > tr > th {
2038
+ background-color: #111827;
2039
+ color: #e5e7eb;
2040
+ font-size: 0.75rem;
2041
+ line-height: 1rem;
2042
+ font-weight: normal;
2043
+ text-align: left;
2044
+ padding: 0.5rem;
2045
+ border: 1px #374151 solid;
2046
+ width: 50%;
2047
+ }
2048
+
2049
+ .order-listing-row-table-details > thead > tr > th:last-child {
2050
+ border-left: 0;
2051
+ }
2052
+
2053
+ .order-listing-row-table-details > tbody > tr > td {
2054
+ font-size: 0.75rem;
2055
+ line-height: 1rem;
2056
+ font-weight: normal;
2057
+ text-align: left;
2058
+ padding: 0.5rem;
2059
+ vertical-align: top;
2060
+ }
2061
+
2062
+ .justify-end-i {
2063
+ justify-content: end !important;
2064
+ }
2065
+
2066
+ button.fleetops-btn-xxs.btn,
2067
+ button.fleetops-btn-xxs,
2068
+ .fleetops-btn-xxs {
2069
+ padding-top: 0.2rem !important;
2070
+ padding-bottom: 0.2rem !important;
2071
+ }
2072
+
2073
+ .next-sidebar-navigator-primary-action.fleet-ops-sidebar-primary-action {
2074
+ --tw-bg-opacity: 1;
2075
+
2076
+ justify-content: flex-start;
2077
+ color: #fff;
2078
+ background-color: rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2079
+ border: 1px solid rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2080
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.12);
2081
+ }
2082
+
2083
+ .next-sidebar-navigator-primary-action.fleet-ops-sidebar-primary-action:hover {
2084
+ background-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2085
+ border-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2086
+ }
2087
+
2088
+ body[data-theme='dark'] .next-sidebar-navigator-primary-action.fleet-ops-sidebar-primary-action {
2089
+ background-color: rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2090
+ border-color: rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2091
+ }
2092
+
2093
+ body[data-theme='dark'] .next-sidebar-navigator-primary-action.fleet-ops-sidebar-primary-action:hover {
2094
+ background-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2095
+ border-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2096
+ }
2097
+
2098
+ .fleet-ops-operations-monitor {
2099
+ position: relative;
2100
+ display: flex;
2101
+ flex-direction: column;
2102
+ flex: 1 1 auto;
2103
+ overflow: hidden;
2104
+ min-height: 0;
2105
+ animation: fleet-ops-operations-monitor-enter 180ms ease-out both;
2106
+ }
2107
+
2108
+ @keyframes fleet-ops-operations-monitor-enter {
2109
+ from {
2110
+ opacity: 0;
2111
+ transform: translateY(4px);
2112
+ }
2113
+
2114
+ to {
2115
+ opacity: 1;
2116
+ transform: translateY(0);
2117
+ }
2118
+ }
2119
+
2120
+ @media (prefers-reduced-motion: reduce) {
2121
+ .fleet-ops-operations-monitor {
2122
+ animation: none;
2123
+ }
2124
+ }
2125
+
2126
+ .fleet-ops-operations-monitor-divider {
2127
+ position: relative;
2128
+ width: auto;
2129
+ height: 1px;
2130
+ margin: 0 0 0.75rem;
2131
+ }
2132
+
2133
+ .fleet-ops-operations-monitor-divider::before {
2134
+ position: absolute;
2135
+ top: 0;
2136
+ left: -1rem;
2137
+ right: -1rem;
2138
+ border-top: 1px solid #e5e7eb;
2139
+ content: '';
2140
+ }
2141
+
2142
+ .fleet-ops-operations-monitor-list {
2143
+ flex: 1 1 auto;
2144
+ height: var(--fleet-ops-operations-monitor-list-height, 14rem);
2145
+ min-height: 8rem;
2146
+ max-height: none;
2147
+ overflow-y: auto;
2148
+ overscroll-behavior: contain;
2149
+ padding-right: 0.125rem;
2150
+ padding-bottom: 0.5rem;
2151
+ }
2152
+
2153
+ .fleet-ops-operations-monitor-row-actions {
2154
+ display: flex;
2155
+ flex: 0 0 2rem;
2156
+ justify-content: flex-end;
2157
+ min-width: 2rem;
2158
+ padding-top: 0.125rem;
2159
+ }
2160
+
2161
+ .fleet-ops-operations-monitor-list .ember-basic-dropdown,
2162
+ .fleet-ops-operations-monitor-list .ember-basic-dropdown-trigger {
2163
+ flex-shrink: 0;
2164
+ }
2165
+
2166
+ .fleet-ops-operations-monitor .fleetops-btn-xxs.btn,
2167
+ .fleet-ops-operations-monitor button.fleetops-btn-xxs.btn,
2168
+ .fleet-ops-operations-monitor button.fleetops-btn-xxs,
2169
+ .fleet-ops-operations-monitor .fleetops-btn-xxs {
2170
+ min-height: 1.25rem !important;
2171
+ padding: 0.15rem 0.75rem !important;
2172
+ font-size: 10px !important;
2173
+ line-height: 0.5 !important;
2174
+ }
2175
+
2176
+ .next-sidebar-navigator:has(.fleet-ops-operations-monitor) {
2177
+ display: flex;
2178
+ flex: 1 1 auto;
2179
+ flex-direction: column;
2180
+ height: 100%;
2181
+ overflow: hidden;
2182
+ min-height: 0;
2183
+ }
2184
+
2185
+ .next-sidebar-navigator:has(.fleet-ops-operations-monitor) > .fleet-ops-operations-monitor {
2186
+ flex: 1 1 auto;
2187
+ min-height: 0;
2188
+ }
2189
+
2190
+ .next-sidebar-navigator:has(.fleet-ops-operations-monitor) > .next-sidebar-navigator-viewport {
2191
+ flex: 0 0 auto;
2192
+ }
2193
+
2194
+ body[data-theme='dark'] .fleet-ops-operations-monitor-divider {
2195
+ border-top-color: transparent;
2196
+ }
2197
+
2198
+ body[data-theme='dark'] .fleet-ops-operations-monitor-divider::before {
2199
+ border-top-color: #374151;
2200
+ }
2201
+
2202
+ .fleet-ops-operations-monitor-dropdown {
2203
+ margin-top: 0;
2204
+ margin-left: 0.5rem;
2205
+ }
2206
+
2207
+ .fleet-ops-operations-monitor-row-depth-1 {
2208
+ padding-left: 1.25rem !important;
2209
+ }
2210
+
2211
+ .fleet-ops-operations-monitor-row-depth-2 {
2212
+ padding-left: 2rem !important;
2213
+ }
2214
+
2215
+ .fleet-ops-operations-monitor-row-depth-3,
2216
+ .fleet-ops-operations-monitor-row-depth-4,
2217
+ .fleet-ops-operations-monitor-row-depth-5 {
2218
+ padding-left: 2.75rem !important;
2219
+ }
2220
+
2221
+ .fleet-ops-operations-monitor-child-row {
2222
+ margin-top: -0.125rem;
2223
+ }
2224
+
2225
+ .fleet-ops-operations-monitor-empty {
2226
+ display: flex;
2227
+ flex-direction: column;
2228
+ align-items: center;
2229
+ justify-content: center;
2230
+ min-height: 7.5rem;
2231
+ padding: 1rem 0.75rem;
2232
+ text-align: center;
2233
+ color: #6b7280;
2234
+ }
2235
+
2236
+ .fleet-ops-operations-monitor-empty-icon {
2237
+ display: flex;
2238
+ align-items: center;
2239
+ justify-content: center;
2240
+ width: 1.75rem;
2241
+ height: 1.75rem;
2242
+ margin-bottom: 0.5rem;
2243
+ color: #6b7280;
2244
+ background-color: #f3f4f6;
2245
+ border: 1px solid #e5e7eb;
2246
+ border-radius: 0.375rem;
2247
+ }
2248
+
2249
+ .fleet-ops-operations-monitor-empty-title {
2250
+ display: block;
2251
+ margin-bottom: 0.25rem;
2252
+ font-size: 0.8125rem;
2253
+ font-weight: 600;
2254
+ line-height: 1.2;
2255
+ color: #374151;
2256
+ }
2257
+
2258
+ .fleet-ops-operations-monitor-empty-description {
2259
+ display: block;
2260
+ max-width: 13rem;
2261
+ margin-bottom: 0.75rem;
2262
+ font-size: 0.75rem;
2263
+ line-height: 1.35;
2264
+ color: #6b7280;
2265
+ }
2266
+
2267
+ .fleet-ops-operations-monitor-empty-action {
2268
+ display: inline-flex;
2269
+ align-items: center;
2270
+ justify-content: center;
2271
+ min-height: 1.5rem;
2272
+ padding: 0.25rem 0.625rem;
2273
+ font-size: 0.75rem;
2274
+ font-weight: 600;
2275
+ line-height: 1;
2276
+ color: #fff;
2277
+ background-color: rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2278
+ border: 1px solid rgba(52, 133, 226, var(--tw-bg-opacity, 1));
2279
+ border-radius: 0.375rem;
2280
+ }
2281
+
2282
+ .fleet-ops-operations-monitor-empty-action:hover {
2283
+ background-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2284
+ border-color: rgba(97, 160, 232, var(--tw-bg-opacity, 1));
2285
+ }
2286
+
2287
+ body[data-theme='dark'] .fleet-ops-operations-monitor-empty {
2288
+ color: #9ca3af;
2289
+ }
2290
+
2291
+ body[data-theme='dark'] .fleet-ops-operations-monitor-empty-icon {
2292
+ color: #d1d5db;
2293
+ background-color: #1f2937;
2294
+ border-color: #374151;
2295
+ }
2296
+
2297
+ body[data-theme='dark'] .fleet-ops-operations-monitor-empty-title {
2298
+ color: #f3f4f6;
2299
+ }
2300
+
2301
+ body[data-theme='dark'] .fleet-ops-operations-monitor-empty-description {
2302
+ color: #9ca3af;
2303
+ }
2304
+
2305
+ .fleet-ops-hub {
2306
+ min-height: 100%;
2307
+ padding: 1.5rem;
2308
+ color: #111827;
2309
+ background: #f9fafb;
2310
+ }
2311
+
2312
+ .fleet-ops-hub-header {
2313
+ position: sticky;
2314
+ top: 0;
2315
+ z-index: 10;
2316
+ display: flex;
2317
+ align-items: flex-start;
2318
+ justify-content: space-between;
2319
+ gap: 1rem;
2320
+ padding: 1rem 1.5rem;
2321
+ margin: -1.5rem -1.5rem 1.25rem;
2322
+ background: #fff;
2323
+ border-bottom: 1px solid #e5e7eb;
2324
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
2325
+ }
2326
+
2327
+ .fleet-ops-hub-title {
2328
+ margin: 0;
2329
+ font-size: 1.25rem;
2330
+ font-weight: 700;
2331
+ line-height: 1.4;
2332
+ color: #111827;
2333
+ }
2334
+
2335
+ .fleet-ops-hub-subtitle {
2336
+ max-width: 48rem;
2337
+ margin: 0.25rem 0 0;
2338
+ font-size: 0.875rem;
2339
+ line-height: 1.45;
2340
+ color: #6b7280;
2341
+ }
2342
+
2343
+ .fleet-ops-hub-header-action {
2344
+ display: inline-flex;
2345
+ align-items: center;
2346
+ gap: 0.5rem;
2347
+ min-height: 2.25rem;
2348
+ padding: 0 0.75rem;
2349
+ font-size: 0.875rem;
2350
+ font-weight: 600;
2351
+ color: #fff;
2352
+ white-space: nowrap;
2353
+ background: rgba(52, 133, 226, 1);
2354
+ border: 1px solid rgba(52, 133, 226, 1);
2355
+ border-radius: 0.375rem;
2356
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.12);
2357
+ }
2358
+
2359
+ .fleet-ops-hub-header-action:hover {
2360
+ color: #fff;
2361
+ background: rgba(97, 160, 232, 1);
2362
+ border-color: rgba(97, 160, 232, 1);
2363
+ }
2364
+
2365
+ .fleet-ops-hub-kpi-grid {
2366
+ display: grid;
2367
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2368
+ gap: 0.75rem;
2369
+ margin-bottom: 1.25rem;
2370
+ }
2371
+
2372
+ .fleet-ops-hub-kpi {
2373
+ position: relative;
2374
+ display: flex;
2375
+ min-height: 7.5rem;
2376
+ padding: 1rem;
2377
+ overflow: hidden;
2378
+ background: #fff;
2379
+ border: 1px solid #e5e7eb;
2380
+ border-radius: 0.375rem;
2381
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);
2382
+ transition:
2383
+ transform 0.18s ease,
2384
+ box-shadow 0.18s ease,
2385
+ border-color 0.18s ease;
2386
+ }
2387
+
2388
+ .fleet-ops-hub-kpi:hover {
2389
+ border-color: #bfdbfe;
2390
+ box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08);
2391
+ transform: translateY(-1px);
2392
+ }
2393
+
2394
+ .fleet-ops-hub-kpi-body {
2395
+ min-width: 0;
2396
+ padding-right: 3.25rem;
2397
+ }
2398
+
2399
+ .fleet-ops-hub-kpi-icon {
2400
+ position: absolute;
2401
+ top: 1rem;
2402
+ right: 1rem;
2403
+ display: flex;
2404
+ align-items: center;
2405
+ justify-content: center;
2406
+ width: 2.5rem;
2407
+ height: 2.5rem;
2408
+ color: #2563eb;
2409
+ background: #dbeafe;
2410
+ border-radius: 0.375rem;
2411
+ }
2412
+
2413
+ .fleet-ops-hub-kpi-accent-green {
2414
+ background: linear-gradient(135deg, #fff 0%, #ecfdf5 100%);
2415
+ border-color: #a7f3d0;
2416
+ }
2417
+
2418
+ .fleet-ops-hub-kpi-accent-green .fleet-ops-hub-kpi-icon {
2419
+ color: #059669;
2420
+ background: #d1fae5;
2421
+ }
2422
+
2423
+ .fleet-ops-hub-kpi-accent-amber {
2424
+ background: linear-gradient(135deg, #fff 0%, #fffbeb 100%);
2425
+ border-color: #fed7aa;
2426
+ }
2427
+
2428
+ .fleet-ops-hub-kpi-accent-amber .fleet-ops-hub-kpi-icon {
2429
+ color: #d97706;
2430
+ background: #ffedd5;
2431
+ }
2432
+
2433
+ .fleet-ops-hub-kpi-accent-rose {
2434
+ background: linear-gradient(135deg, #fff 0%, #fff1f2 100%);
2435
+ border-color: #fecdd3;
2436
+ }
2437
+
2438
+ .fleet-ops-hub-kpi-accent-rose .fleet-ops-hub-kpi-icon {
2439
+ color: #e11d48;
2440
+ background: #ffe4e6;
2441
+ }
2442
+
2443
+ .fleet-ops-hub-kpi-label {
2444
+ font-size: 0.75rem;
2445
+ font-weight: 700;
2446
+ line-height: 1rem;
2447
+ color: #6b7280;
2448
+ text-transform: uppercase;
2449
+ letter-spacing: 0.04em;
2450
+ }
2451
+
2452
+ .fleet-ops-hub-kpi-value {
2453
+ margin-top: 0.5rem;
2454
+ font-size: 2rem;
2455
+ font-weight: 800;
2456
+ line-height: 1.1;
2457
+ color: #111827;
2458
+ }
2459
+
2460
+ .fleet-ops-hub-kpi-caption {
2461
+ margin-top: 0.75rem;
2462
+ overflow: hidden;
2463
+ font-size: 0.8125rem;
2464
+ line-height: 1.25rem;
2465
+ color: #6b7280;
2466
+ text-overflow: ellipsis;
2467
+ }
2468
+
2469
+ .fleet-ops-hub-layout {
2470
+ display: grid;
2471
+ grid-template-columns: minmax(0, 1fr);
2472
+ gap: 1rem;
2473
+ }
2474
+
2475
+ .fleet-ops-hub-main {
2476
+ min-width: 0;
2477
+ }
2478
+
2479
+ .fleet-ops-hub-side {
2480
+ display: flex;
2481
+ flex-direction: column;
2482
+ gap: 1rem;
2483
+ min-width: 0;
2484
+ }
2485
+
2486
+ .fleet-ops-hub-card-grid {
2487
+ display: grid;
2488
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2489
+ gap: 0.75rem;
2490
+ }
2491
+
2492
+ .fleet-ops-hub-card-grid-three {
2493
+ display: grid;
2494
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2495
+ gap: 0.75rem;
2496
+ }
2497
+
2498
+ .fleet-ops-hub-card {
2499
+ display: flex;
2500
+ flex-direction: column;
2501
+ min-height: 9.5rem;
2502
+ padding: 1rem;
2503
+ color: inherit;
2504
+ background: #fff;
2505
+ border: 1px solid #e5e7eb;
2506
+ border-radius: 0.375rem;
2507
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);
2508
+ transition:
2509
+ background-color 0.18s ease,
2510
+ border-color 0.18s ease,
2511
+ box-shadow 0.18s ease,
2512
+ transform 0.18s ease;
2513
+ }
2514
+
2515
+ .fleet-ops-hub-card:hover {
2516
+ color: inherit;
2517
+ background: #f9fafb;
2518
+ border-color: #93c5fd;
2519
+ box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08);
2520
+ transform: translateY(-1px);
2521
+ }
2522
+
2523
+ .fleet-ops-hub-card-heading {
2524
+ display: flex;
2525
+ align-items: center;
2526
+ gap: 0.625rem;
2527
+ margin-bottom: 0.75rem;
2528
+ font-size: 0.875rem;
2529
+ font-weight: 700;
2530
+ line-height: 1.25rem;
2531
+ color: #111827;
2532
+ }
2533
+
2534
+ .fleet-ops-hub-card-icon {
2535
+ display: flex;
2536
+ flex: 0 0 2rem;
2537
+ align-items: center;
2538
+ justify-content: center;
2539
+ width: 2rem;
2540
+ height: 2rem;
2541
+ color: #2563eb;
2542
+ background: #eff6ff;
2543
+ border-radius: 0.375rem;
2544
+ }
2545
+
2546
+ .fleet-ops-hub-card-description {
2547
+ margin: 0;
2548
+ font-size: 0.875rem;
2549
+ line-height: 1.4;
2550
+ color: #6b7280;
2551
+ }
2552
+
2553
+ .fleet-ops-hub-card-action {
2554
+ display: inline-flex;
2555
+ align-items: center;
2556
+ gap: 0.375rem;
2557
+ margin-top: auto;
2558
+ padding-top: 1rem;
2559
+ font-size: 0.8125rem;
2560
+ font-weight: 700;
2561
+ color: #2563eb;
2562
+ }
2563
+
2564
+ .fleet-ops-hub-panel {
2565
+ padding: 1rem;
2566
+ background: #fff;
2567
+ border: 1px solid #e5e7eb;
2568
+ border-radius: 0.375rem;
2569
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);
2570
+ }
2571
+
2572
+ .fleet-ops-hub-panel-prominent {
2573
+ background: linear-gradient(135deg, #fff 0%, #eff6ff 100%);
2574
+ border-color: #bfdbfe;
2575
+ }
2576
+
2577
+ .fleet-ops-hub-panel-title {
2578
+ margin-bottom: 0.75rem;
2579
+ font-size: 0.875rem;
2580
+ font-weight: 700;
2581
+ line-height: 1.25rem;
2582
+ color: #111827;
2583
+ }
2584
+
2585
+ .fleet-ops-hub-guidance-list {
2586
+ display: flex;
2587
+ flex-direction: column;
2588
+ gap: 0.625rem;
2589
+ padding: 0;
2590
+ margin: 0;
2591
+ font-size: 0.875rem;
2592
+ line-height: 1.4;
2593
+ color: #6b7280;
2594
+ list-style: none;
2595
+ }
2596
+
2597
+ .fleet-ops-hub-guidance-list li {
2598
+ display: flex;
2599
+ gap: 0.5rem;
2600
+ }
2601
+
2602
+ .fleet-ops-hub-guidance-list svg {
2603
+ flex-shrink: 0;
2604
+ margin-top: 0.1875rem;
2605
+ color: #3485e2;
2606
+ }
2607
+
2608
+ .fleet-ops-hub-section-title {
2609
+ margin-bottom: 0.75rem;
2610
+ font-size: 0.75rem;
2611
+ font-weight: 700;
2612
+ line-height: 1rem;
2613
+ color: #6b7280;
2614
+ text-transform: uppercase;
2615
+ letter-spacing: 0.04em;
2616
+ }
2617
+
2618
+ .fleet-ops-hub-section-title.mt-5 {
2619
+ margin-top: 1.25rem;
2620
+ }
2621
+
2622
+ .fleet-ops-resources-hub-shell {
2623
+ height: 100%;
2624
+ min-height: 0;
2625
+ overflow-y: auto;
2626
+ color: #111827;
2627
+ background: #f9fafb;
2628
+ }
2629
+
2630
+ .fleet-ops-resources-hub-header {
2631
+ position: sticky;
2632
+ top: 0;
2633
+ z-index: 50;
2634
+ padding: 1rem;
2635
+ background: #fff;
2636
+ border-bottom: 1px solid #e5e7eb;
2637
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
2638
+ }
2639
+
2640
+ .fleet-ops-resources-hub-header-inner,
2641
+ .fleet-ops-resources-hub-content {
2642
+ width: 100%;
2643
+ max-width: 80rem;
2644
+ margin: 0 auto;
2645
+ }
2646
+
2647
+ .fleet-ops-resources-hub-header-inner {
2648
+ display: flex;
2649
+ flex-direction: column;
2650
+ gap: 0.75rem;
2651
+ }
2652
+
2653
+ .fleet-ops-resources-hub-header-copy {
2654
+ min-width: 0;
2655
+ }
2656
+
2657
+ .fleet-ops-resources-hub-header-actions {
2658
+ display: flex;
2659
+ flex-shrink: 0;
2660
+ align-items: center;
2661
+ gap: 0.5rem;
2662
+ white-space: nowrap;
2663
+ }
2664
+
2665
+ .fleet-ops-resources-hub-content {
2666
+ display: flex;
2667
+ flex-direction: column;
2668
+ gap: 0.75rem;
2669
+ padding: 0.875rem 1rem 1rem;
2670
+ }
2671
+
2672
+ .fleet-ops-resources-kpi-grid {
2673
+ display: grid;
2674
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2675
+ gap: 0.75rem;
2676
+ }
2677
+
2678
+ .fleet-ops-resources-kpi {
2679
+ min-height: 7.25rem;
2680
+ color: inherit;
2681
+ text-decoration: none;
2682
+ }
2683
+
2684
+ .fleet-ops-resources-kpi:hover {
2685
+ color: inherit;
2686
+ }
2687
+
2688
+ .fleet-ops-resources-hub-layout {
2689
+ display: block;
2690
+ }
2691
+
2692
+ .fleet-ops-resources-hub-main {
2693
+ display: flex;
2694
+ min-width: 0;
2695
+ flex-direction: column;
2696
+ gap: 0.75rem;
2697
+ }
2698
+
2699
+ .fleet-ops-resources-hub-side {
2700
+ display: flex;
2701
+ min-width: 0;
2702
+ flex-direction: column;
2703
+ gap: 1rem;
2704
+ }
2705
+
2706
+ .fleet-ops-resources-section {
2707
+ padding: 0.75rem;
2708
+ background: #fff;
2709
+ border: 1px solid #e5e7eb;
2710
+ border-radius: 0.375rem;
2711
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
2712
+ }
2713
+
2714
+ .fleet-ops-resources-section-header {
2715
+ display: flex;
2716
+ flex-direction: column;
2717
+ gap: 0.25rem;
2718
+ margin-bottom: 0.5rem;
2719
+ }
2720
+
2721
+ .fleet-ops-resources-section-header p {
2722
+ max-width: 44rem;
2723
+ margin: 0;
2724
+ font-size: 0.8125rem;
2725
+ line-height: 1.35rem;
2726
+ color: #6b7280;
2727
+ }
2728
+
2729
+ .fleet-ops-resources-card-grid {
2730
+ display: grid;
2731
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2732
+ gap: 0.625rem;
2733
+ }
2734
+
2735
+ .fleet-ops-resources-guidance-grid {
2736
+ display: grid;
2737
+ grid-template-columns: repeat(1, minmax(0, 1fr));
2738
+ gap: 0.625rem;
2739
+ }
2740
+
2741
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-kpi {
2742
+ padding: 0.875rem;
2743
+ }
2744
+
2745
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-kpi-value {
2746
+ margin-top: 0.375rem;
2747
+ font-size: 1.75rem;
2748
+ }
2749
+
2750
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-kpi-caption {
2751
+ margin-top: 0.5rem;
2752
+ font-size: 0.75rem;
2753
+ line-height: 1.1rem;
2754
+ }
2755
+
2756
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-card {
2757
+ min-height: 6.75rem;
2758
+ padding: 0.7rem;
2759
+ }
2760
+
2761
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-card-heading {
2762
+ gap: 0.5rem;
2763
+ margin-bottom: 0.375rem;
2764
+ font-size: 0.8125rem;
2765
+ }
2766
+
2767
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-card-icon {
2768
+ flex-basis: 1.65rem;
2769
+ width: 1.65rem;
2770
+ height: 1.65rem;
2771
+ font-size: 0.75rem;
2772
+ }
2773
+
2774
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-card-description {
2775
+ font-size: 0.8125rem;
2776
+ line-height: 1.2rem;
2777
+ display: -webkit-box;
2778
+ overflow: hidden;
2779
+ -webkit-line-clamp: 1;
2780
+ -webkit-box-orient: vertical;
2781
+ }
2782
+
2783
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-card-action {
2784
+ padding-top: 0.5rem;
2785
+ font-size: 0.75rem;
2786
+ }
2787
+
2788
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-panel {
2789
+ padding: 0.75rem;
2790
+ }
2791
+
2792
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-panel-title {
2793
+ margin-bottom: 0.5rem;
2794
+ }
2795
+
2796
+ .fleet-ops-resources-hub-shell .fleet-ops-hub-guidance-list {
2797
+ gap: 0.45rem;
2798
+ font-size: 0.8125rem;
2799
+ line-height: 1.3;
2800
+ }
2801
+
2802
+ .fleet-ops-resources-utility-panel {
2803
+ min-height: 9rem;
2804
+ }
2805
+
2806
+ .fleet-ops-resources-utility-panel-header {
2807
+ display: flex;
2808
+ align-items: center;
2809
+ justify-content: space-between;
2810
+ gap: 0.5rem;
2811
+ margin-bottom: 0.5rem;
2812
+ }
2813
+
2814
+ .fleet-ops-resources-utility-panel-header .fleet-ops-hub-panel-title {
2815
+ margin-bottom: 0;
2816
+ }
2817
+
2818
+ .fleet-ops-resources-utility-panel-header span {
2819
+ flex-shrink: 0;
2820
+ font-size: 0.6875rem;
2821
+ font-weight: 700;
2822
+ color: #3485e2;
2823
+ }
2824
+
2825
+ .fleet-ops-resources-doc-links {
2826
+ display: grid;
2827
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2828
+ gap: 0.375rem;
2829
+ }
2830
+
2831
+ .fleet-ops-resources-doc-link,
2832
+ .fleet-ops-resources-notice,
2833
+ .fleet-ops-resources-checklist-item {
2834
+ display: flex;
2835
+ align-items: center;
2836
+ min-width: 0;
2837
+ color: inherit;
2838
+ text-decoration: none;
2839
+ border-radius: 0.375rem;
2840
+ }
2841
+
2842
+ .fleet-ops-resources-doc-link {
2843
+ gap: 0.375rem;
2844
+ padding: 0.375rem 0.45rem;
2845
+ font-size: 0.75rem;
2846
+ font-weight: 700;
2847
+ text-align: left;
2848
+ background: #f9fafb;
2849
+ border: 1px solid #e5e7eb;
2850
+ }
2851
+
2852
+ .fleet-ops-resources-doc-link:hover {
2853
+ color: #2563eb;
2854
+ background: #eff6ff;
2855
+ border-color: #bfdbfe;
2856
+ }
2857
+
2858
+ .fleet-ops-resources-doc-link svg {
2859
+ flex-shrink: 0;
2860
+ color: #3485e2;
2861
+ }
2862
+
2863
+ .fleet-ops-resources-doc-link span {
2864
+ min-width: 0;
2865
+ overflow: hidden;
2866
+ text-overflow: ellipsis;
2867
+ white-space: nowrap;
2868
+ }
2869
+
2870
+ .fleet-ops-resources-notice-list,
2871
+ .fleet-ops-resources-checklist {
2872
+ display: flex;
2873
+ flex-direction: column;
2874
+ gap: 0.375rem;
2875
+ }
2876
+
2877
+ .fleet-ops-resources-notice {
2878
+ gap: 0.45rem;
2879
+ padding: 0.425rem 0.5rem;
2880
+ font-size: 0.75rem;
2881
+ font-weight: 700;
2882
+ line-height: 1.1rem;
2883
+ background: #f9fafb;
2884
+ border: 1px solid #e5e7eb;
2885
+ }
2886
+
2887
+ .fleet-ops-resources-notice-warning {
2888
+ color: #92400e;
2889
+ background: #fffbeb;
2890
+ border-color: #fde68a;
2891
+ }
2892
+
2893
+ .fleet-ops-resources-notice-info {
2894
+ color: #1d4ed8;
2895
+ background: #eff6ff;
2896
+ border-color: #bfdbfe;
2897
+ }
2898
+
2899
+ .fleet-ops-resources-notice-success {
2900
+ color: #047857;
2901
+ background: #ecfdf5;
2902
+ border-color: #a7f3d0;
2903
+ }
2904
+
2905
+ .fleet-ops-resources-checklist {
2906
+ display: grid;
2907
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2908
+ }
2909
+
2910
+ .fleet-ops-resources-checklist-item {
2911
+ gap: 0.375rem;
2912
+ padding: 0.35rem 0.4rem;
2913
+ font-size: 0.75rem;
2914
+ font-weight: 700;
2915
+ line-height: 1rem;
2916
+ background: #f9fafb;
2917
+ border: 1px solid #e5e7eb;
2918
+ }
2919
+
2920
+ .fleet-ops-resources-checklist-item.is-complete {
2921
+ color: #047857;
2922
+ background: #ecfdf5;
2923
+ border-color: #a7f3d0;
2924
+ }
2925
+
2926
+ .fleet-ops-resources-checklist-item.is-pending:hover {
2927
+ color: #2563eb;
2928
+ background: #eff6ff;
2929
+ border-color: #bfdbfe;
2930
+ }
2931
+
2932
+ .fleet-ops-resources-checklist-icon {
2933
+ display: flex;
2934
+ flex: 0 0 1.15rem;
2935
+ align-items: center;
2936
+ justify-content: center;
2937
+ width: 1.15rem;
2938
+ height: 1.15rem;
2939
+ font-size: 0.625rem;
2940
+ border-radius: 999px;
2941
+ background: rgba(52, 133, 226, 0.12);
2942
+ }
2943
+
2944
+ .fleet-ops-resources-checklist-item.is-complete .fleet-ops-resources-checklist-icon {
2945
+ background: rgba(4, 120, 87, 0.12);
2946
+ }
2947
+
2948
+ body[data-theme='dark'] .fleet-ops-resources-hub-shell {
2949
+ color: #f9fafb;
2950
+ background: #111827;
2951
+ }
2952
+
2953
+ body[data-theme='dark'] .fleet-ops-resources-hub-header,
2954
+ body[data-theme='dark'] .fleet-ops-resources-section {
2955
+ background: #1f2937;
2956
+ border-color: #374151;
2957
+ }
2958
+
2959
+ body[data-theme='dark'] .fleet-ops-resources-section-header p {
2960
+ color: #9ca3af;
2961
+ }
2962
+
2963
+ body[data-theme='dark'] .fleet-ops-resources-doc-link,
2964
+ body[data-theme='dark'] .fleet-ops-resources-notice,
2965
+ body[data-theme='dark'] .fleet-ops-resources-checklist-item {
2966
+ background: #111827;
2967
+ border-color: #374151;
2968
+ }
2969
+
2970
+ body[data-theme='dark'] .fleet-ops-resources-doc-link:hover,
2971
+ body[data-theme='dark'] .fleet-ops-resources-checklist-item.is-pending:hover {
2972
+ color: #93c5fd;
2973
+ background: #1e3a5f;
2974
+ border-color: #2563eb;
2975
+ }
2976
+
2977
+ body[data-theme='dark'] .fleet-ops-resources-notice-warning {
2978
+ color: #fbbf24;
2979
+ background: rgba(146, 64, 14, 0.18);
2980
+ border-color: rgba(251, 191, 36, 0.35);
2981
+ }
2982
+
2983
+ body[data-theme='dark'] .fleet-ops-resources-notice-info {
2984
+ color: #93c5fd;
2985
+ background: rgba(37, 99, 235, 0.18);
2986
+ border-color: rgba(147, 197, 253, 0.3);
2987
+ }
2988
+
2989
+ body[data-theme='dark'] .fleet-ops-resources-notice-success,
2990
+ body[data-theme='dark'] .fleet-ops-resources-checklist-item.is-complete {
2991
+ color: #6ee7b7;
2992
+ background: rgba(4, 120, 87, 0.18);
2993
+ border-color: rgba(110, 231, 183, 0.28);
2994
+ }
2995
+
2996
+ @media (width >= 768px) {
2997
+ .fleet-ops-resources-hub-header {
2998
+ padding-right: 1.5rem;
2999
+ padding-left: 1.5rem;
3000
+ }
3001
+
3002
+ .fleet-ops-resources-hub-header-inner {
3003
+ flex-direction: row;
3004
+ align-items: flex-start;
3005
+ justify-content: space-between;
3006
+ }
3007
+
3008
+ .fleet-ops-resources-hub-content {
3009
+ padding: 1rem 1.5rem;
3010
+ }
3011
+
3012
+ .fleet-ops-resources-kpi-grid,
3013
+ .fleet-ops-resources-card-grid,
3014
+ .fleet-ops-resources-guidance-grid {
3015
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3016
+ }
3017
+ }
3018
+
3019
+ @media (width >= 1024px) {
3020
+ .fleet-ops-resources-kpi-grid {
3021
+ grid-template-columns: repeat(4, minmax(0, 1fr));
3022
+ }
3023
+
3024
+ .fleet-ops-resources-card-grid,
3025
+ .fleet-ops-resources-guidance-grid {
3026
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3027
+ }
3028
+ }
3029
+
3030
+ @media (width >= 1280px) {
3031
+ .fleet-ops-resources-card-grid,
3032
+ .fleet-ops-resources-guidance-grid {
3033
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3034
+ }
3035
+ }
3036
+
3037
+ body[data-theme='dark'] .fleet-ops-hub {
3038
+ color: #f9fafb;
3039
+ background: #111827;
3040
+ }
3041
+
3042
+ body[data-theme='dark'] .fleet-ops-hub-kpi,
3043
+ body[data-theme='dark'] .fleet-ops-hub-card,
3044
+ body[data-theme='dark'] .fleet-ops-hub-panel {
3045
+ background: #1f2937;
3046
+ border-color: #374151;
3047
+ }
3048
+
3049
+ body[data-theme='dark'] .fleet-ops-hub-header {
3050
+ background: #111827;
3051
+ border-bottom-color: #374151;
3052
+ }
3053
+
3054
+ body[data-theme='dark'] .fleet-ops-hub-title,
3055
+ body[data-theme='dark'] .fleet-ops-hub-kpi-value,
3056
+ body[data-theme='dark'] .fleet-ops-hub-card-heading,
3057
+ body[data-theme='dark'] .fleet-ops-hub-panel-title {
3058
+ color: #f9fafb;
3059
+ }
3060
+
3061
+ .fleet-ops-control-hub {
3062
+ height: 100%;
3063
+ min-height: 0;
3064
+ overflow-y: auto;
3065
+ color: #111827;
3066
+ background: #f9fafb;
3067
+ }
3068
+
3069
+ .fleet-ops-control-hub-header {
3070
+ position: sticky;
3071
+ top: 0;
3072
+ z-index: 50;
3073
+ display: flex;
3074
+ flex-direction: column;
3075
+ gap: 0.75rem;
3076
+ padding: 1rem;
3077
+ background: #fff;
3078
+ border-bottom: 1px solid #e5e7eb;
3079
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
3080
+ }
3081
+
3082
+ .fleet-ops-control-hub-header-copy {
3083
+ min-width: 0;
3084
+ }
3085
+
3086
+ .fleet-ops-control-hub-eyebrow {
3087
+ margin-bottom: 0.125rem;
3088
+ font-size: 0.6875rem;
3089
+ font-weight: 800;
3090
+ line-height: 1rem;
3091
+ color: #3485e2;
3092
+ text-transform: uppercase;
3093
+ }
3094
+
3095
+ .fleet-ops-control-hub-title {
3096
+ margin: 0;
3097
+ font-size: 1.125rem;
3098
+ font-weight: 800;
3099
+ line-height: 1.35;
3100
+ color: #111827;
3101
+ }
3102
+
3103
+ .fleet-ops-control-hub-subtitle {
3104
+ max-width: 52rem;
3105
+ margin: 0.25rem 0 0;
3106
+ font-size: 0.8125rem;
3107
+ line-height: 1.35rem;
3108
+ color: #6b7280;
3109
+ }
3110
+
3111
+ .fleet-ops-control-hub-header-actions {
3112
+ display: flex;
3113
+ flex-wrap: wrap;
3114
+ align-items: center;
3115
+ gap: 0.5rem;
3116
+ }
3117
+
3118
+ .fleet-ops-control-hub-primary-action {
3119
+ display: inline-flex;
3120
+ align-items: center;
3121
+ gap: 0.45rem;
3122
+ min-height: 2rem;
3123
+ padding: 0 0.7rem;
3124
+ font-size: 0.75rem;
3125
+ font-weight: 800;
3126
+ color: #fff;
3127
+ white-space: nowrap;
3128
+ background: #2563eb;
3129
+ border: 1px solid #2563eb;
3130
+ border-radius: 0.375rem;
3131
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.12);
3132
+ }
3133
+
3134
+ .fleet-ops-control-hub-primary-action:hover {
3135
+ color: #fff;
3136
+ background: #1d4ed8;
3137
+ border-color: #1d4ed8;
3138
+ }
3139
+
3140
+ .fleet-ops-control-hub-body {
3141
+ display: flex;
3142
+ flex-direction: column;
3143
+ gap: 0.75rem;
3144
+ width: 100%;
3145
+ max-width: 80rem;
3146
+ padding: 0.875rem 1rem 1rem;
3147
+ margin: 0 auto;
3148
+ }
3149
+
3150
+ .fleet-ops-control-hub-kpis {
3151
+ display: grid;
3152
+ grid-template-columns: repeat(1, minmax(0, 1fr));
3153
+ gap: 0.75rem;
3154
+ }
3155
+
3156
+ .fleet-ops-control-hub-kpi,
3157
+ .fleet-ops-control-hub-panel,
3158
+ .fleet-ops-control-hub-link,
3159
+ .fleet-ops-control-hub-action {
3160
+ color: inherit;
3161
+ background: #fff;
3162
+ border: 1px solid #e5e7eb;
3163
+ border-radius: 0.375rem;
3164
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
3165
+ }
3166
+
3167
+ .fleet-ops-control-hub-kpi {
3168
+ position: relative;
3169
+ display: flex;
3170
+ min-height: 7rem;
3171
+ padding: 0.875rem;
3172
+ overflow: hidden;
3173
+ text-decoration: none;
3174
+ background: linear-gradient(135deg, rgba(37, 99, 235, 0.1), rgba(37, 99, 235, 0.02) 50%, #fff 100%), #fff;
3175
+ border-color: #bfdbfe;
3176
+ transition:
3177
+ border-color 0.18s ease,
3178
+ box-shadow 0.18s ease,
3179
+ transform 0.18s ease;
3180
+ }
3181
+
3182
+ .fleet-ops-control-hub-kpi:hover,
3183
+ .fleet-ops-control-hub-link:hover,
3184
+ .fleet-ops-control-hub-action:hover {
3185
+ color: inherit;
3186
+ border-color: #bfdbfe;
3187
+ box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08);
3188
+ transform: translateY(-1px);
3189
+ }
3190
+
3191
+ .fleet-ops-control-hub-kpi-copy {
3192
+ min-width: 0;
3193
+ padding-right: 3rem;
3194
+ }
3195
+
3196
+ .fleet-ops-control-hub-kpi-label {
3197
+ overflow: hidden;
3198
+ font-size: 0.6875rem;
3199
+ font-weight: 800;
3200
+ line-height: 1rem;
3201
+ color: #6b7280;
3202
+ text-overflow: ellipsis;
3203
+ text-transform: uppercase;
3204
+ white-space: nowrap;
3205
+ }
3206
+
3207
+ .fleet-ops-control-hub-kpi-value {
3208
+ margin-top: 0.375rem;
3209
+ font-size: 1.85rem;
3210
+ font-weight: 900;
3211
+ line-height: 1.1;
3212
+ color: #111827;
3213
+ }
3214
+
3215
+ .fleet-ops-control-hub-kpi-caption {
3216
+ display: -webkit-box;
3217
+ margin-top: 0.5rem;
3218
+ overflow: hidden;
3219
+ font-size: 0.75rem;
3220
+ line-height: 1.15rem;
3221
+ color: #6b7280;
3222
+ -webkit-line-clamp: 2;
3223
+ -webkit-box-orient: vertical;
3224
+ }
3225
+
3226
+ .fleet-ops-control-hub-kpi-action {
3227
+ display: inline-flex;
3228
+ align-items: center;
3229
+ gap: 0.35rem;
3230
+ max-width: 100%;
3231
+ min-width: 0;
3232
+ margin-top: 0.625rem;
3233
+ font-size: 0.75rem;
3234
+ font-weight: 800;
3235
+ line-height: 1rem;
3236
+ color: #2563eb;
3237
+ white-space: nowrap;
3238
+ }
3239
+
3240
+ .fleet-ops-control-hub-kpi-action span {
3241
+ min-width: 0;
3242
+ overflow: hidden;
3243
+ text-overflow: ellipsis;
3244
+ white-space: nowrap;
3245
+ }
3246
+
3247
+ .fleet-ops-control-hub-kpi-action svg {
3248
+ flex-shrink: 0;
3249
+ font-size: 0.6875rem;
3250
+ transition: transform 0.18s ease;
3251
+ }
3252
+
3253
+ .fleet-ops-control-hub-kpi:hover .fleet-ops-control-hub-kpi-action svg {
3254
+ transform: translateX(2px);
3255
+ }
3256
+
3257
+ .fleet-ops-control-hub-kpi-icon,
3258
+ .fleet-ops-control-hub-link-icon {
3259
+ display: flex;
3260
+ flex-shrink: 0;
3261
+ align-items: center;
3262
+ justify-content: center;
3263
+ color: #2563eb;
3264
+ background: #eff6ff;
3265
+ border-radius: 0.375rem;
3266
+ }
3267
+
3268
+ .fleet-ops-control-hub-kpi-icon {
3269
+ position: absolute;
3270
+ top: 0.875rem;
3271
+ right: 0.875rem;
3272
+ width: 2.25rem;
3273
+ height: 2.25rem;
3274
+ }
3275
+
3276
+ .fleet-ops-control-hub-grid {
3277
+ display: grid;
3278
+ grid-template-columns: minmax(0, 1fr);
3279
+ gap: 0.75rem;
3280
+ }
3281
+
3282
+ .fleet-ops-control-hub-main,
3283
+ .fleet-ops-control-hub-side,
3284
+ .fleet-ops-control-hub-action-list {
3285
+ display: flex;
3286
+ min-width: 0;
3287
+ flex-direction: column;
3288
+ gap: 0.75rem;
3289
+ }
3290
+
3291
+ .fleet-ops-control-hub-panel {
3292
+ padding: 0.875rem;
3293
+ }
3294
+
3295
+ .fleet-ops-control-hub-panel-header {
3296
+ display: flex;
3297
+ align-items: flex-start;
3298
+ justify-content: space-between;
3299
+ gap: 0.75rem;
3300
+ margin-bottom: 0.75rem;
3301
+ }
3302
+
3303
+ .fleet-ops-control-hub-panel-header h2 {
3304
+ margin: 0;
3305
+ font-size: 0.875rem;
3306
+ font-weight: 800;
3307
+ line-height: 1.25rem;
3308
+ color: #111827;
3309
+ }
3310
+
3311
+ .fleet-ops-control-hub-panel-header p {
3312
+ max-width: 42rem;
3313
+ margin: 0.125rem 0 0;
3314
+ font-size: 0.75rem;
3315
+ line-height: 1.2rem;
3316
+ color: #6b7280;
3317
+ }
3318
+
3319
+ .fleet-ops-control-hub-link-grid,
3320
+ .fleet-ops-control-hub-doc-grid {
3321
+ display: grid;
3322
+ grid-template-columns: repeat(1, minmax(0, 1fr));
3323
+ gap: 0.5rem;
3324
+ }
3325
+
3326
+ .fleet-ops-control-hub-doc-grid {
3327
+ gap: 0;
3328
+ }
3329
+
3330
+ .fleet-ops-control-hub-doc-note {
3331
+ padding: 0.5rem;
3332
+ background: #fffbeb;
3333
+ border: 1px solid #fde68a;
3334
+ border-radius: 0.375rem;
3335
+ }
3336
+
3337
+ .fleet-ops-control-hub-doc-note-heading {
3338
+ display: flex;
3339
+ align-items: center;
3340
+ gap: 0.3rem;
3341
+ margin-bottom: 0.35rem;
3342
+ font-size: 0.6875rem;
3343
+ font-weight: 900;
3344
+ line-height: 1rem;
3345
+ color: #92400e;
3346
+ text-transform: uppercase;
3347
+ }
3348
+
3349
+ .fleet-ops-control-hub-doc-note-heading svg {
3350
+ color: #d97706;
3351
+ }
3352
+
3353
+ .fleet-ops-control-hub-doc-note-copy {
3354
+ margin: -0.2rem 0 0.35rem;
3355
+ font-size: 0.75rem;
3356
+ line-height: 1rem;
3357
+ color: #92400e;
3358
+ }
3359
+
3360
+ .fleet-ops-control-hub-link {
3361
+ display: flex;
3362
+ align-items: center;
3363
+ gap: 0.625rem;
3364
+ min-height: 4.25rem;
3365
+ padding: 0.625rem;
3366
+ text-decoration: none;
3367
+ transition:
3368
+ border-color 0.18s ease,
3369
+ box-shadow 0.18s ease,
3370
+ transform 0.18s ease;
3371
+ }
3372
+
3373
+ .fleet-ops-control-hub-link-icon {
3374
+ width: 2rem;
3375
+ height: 2rem;
3376
+ font-size: 0.8125rem;
3377
+ }
3378
+
3379
+ .fleet-ops-control-hub-link-copy {
3380
+ display: flex;
3381
+ min-width: 0;
3382
+ flex: 1 1 auto;
3383
+ flex-direction: column;
3384
+ gap: 0.125rem;
3385
+ }
3386
+
3387
+ .fleet-ops-control-hub-link-title {
3388
+ overflow: hidden;
3389
+ font-size: 0.8125rem;
3390
+ font-weight: 800;
3391
+ line-height: 1.2rem;
3392
+ color: #111827;
3393
+ text-overflow: ellipsis;
3394
+ white-space: nowrap;
3395
+ }
3396
+
3397
+ .fleet-ops-control-hub-link-description {
3398
+ display: -webkit-box;
3399
+ overflow: hidden;
3400
+ font-size: 0.75rem;
3401
+ line-height: 1.1rem;
3402
+ color: #6b7280;
3403
+ -webkit-line-clamp: 2;
3404
+ -webkit-box-orient: vertical;
3405
+ }
3406
+
3407
+ .fleet-ops-control-hub-link-count {
3408
+ display: inline-flex;
3409
+ flex: 0 0 auto;
3410
+ align-items: center;
3411
+ justify-content: center;
3412
+ min-width: 2rem;
3413
+ height: 1.5rem;
3414
+ padding: 0 0.45rem;
3415
+ font-size: 0.75rem;
3416
+ font-weight: 900;
3417
+ color: #1d4ed8;
3418
+ background: #eff6ff;
3419
+ border-radius: 999px;
3420
+ }
3421
+
3422
+ .fleet-ops-control-hub-link-arrow {
3423
+ flex-shrink: 0;
3424
+ color: #9ca3af;
3425
+ }
3426
+
3427
+ .fleet-ops-control-hub-action {
3428
+ display: flex;
3429
+ gap: 0.625rem;
3430
+ padding: 0.625rem;
3431
+ text-decoration: none;
3432
+ transition:
3433
+ border-color 0.18s ease,
3434
+ box-shadow 0.18s ease,
3435
+ transform 0.18s ease;
3436
+ }
3437
+
3438
+ .fleet-ops-control-hub-action svg {
3439
+ flex-shrink: 0;
3440
+ margin-top: 0.1875rem;
3441
+ color: #2563eb;
3442
+ }
3443
+
3444
+ .fleet-ops-control-hub-action strong,
3445
+ .fleet-ops-control-hub-action small {
3446
+ display: block;
3447
+ }
3448
+
3449
+ .fleet-ops-control-hub-action strong {
3450
+ font-size: 0.8125rem;
3451
+ line-height: 1.15rem;
3452
+ color: #111827;
3453
+ }
3454
+
3455
+ .fleet-ops-control-hub-action small {
3456
+ margin-top: 0.125rem;
3457
+ font-size: 0.75rem;
3458
+ line-height: 1.15rem;
3459
+ color: #6b7280;
3460
+ }
3461
+
3462
+ .fleet-ops-control-hub-doc-link {
3463
+ position: relative;
3464
+ display: flex;
3465
+ align-items: flex-start;
3466
+ gap: 0.4rem;
3467
+ min-width: 0;
3468
+ min-height: 2.15rem;
3469
+ padding: 0.3rem;
3470
+ color: inherit;
3471
+ font-size: 0.6875rem;
3472
+ text-align: left;
3473
+ background: transparent;
3474
+ border: 0;
3475
+ border-radius: 0.25rem;
3476
+ box-shadow: none;
3477
+ transition: background 0.18s ease;
3478
+ }
3479
+
3480
+ .fleet-ops-control-hub-doc-link + .fleet-ops-control-hub-doc-link {
3481
+ margin-top: 0.4rem;
3482
+ }
3483
+
3484
+ .fleet-ops-control-hub-doc-link + .fleet-ops-control-hub-doc-link::before {
3485
+ position: absolute;
3486
+ top: -0.2rem;
3487
+ right: 0.3rem;
3488
+ left: 0.3rem;
3489
+ border-top: 1px dashed rgba(217, 119, 6, 0.35);
3490
+ content: '';
3491
+ pointer-events: none;
3492
+ }
3493
+
3494
+ .fleet-ops-control-hub-doc-link:hover {
3495
+ color: inherit;
3496
+ background: rgba(245, 158, 11, 0.1);
3497
+ box-shadow: none;
3498
+ transform: none;
3499
+ }
3500
+
3501
+ .fleet-ops-control-hub-doc-link svg {
3502
+ flex-shrink: 0;
3503
+ margin-top: 0.125rem;
3504
+ font-size: 0.6875rem;
3505
+ color: #b45309;
3506
+ }
3507
+
3508
+ .fleet-ops-control-hub-doc-copy {
3509
+ display: flex;
3510
+ min-width: 0;
3511
+ flex-direction: column;
3512
+ gap: 0.05rem;
3513
+ }
3514
+
3515
+ .fleet-ops-control-hub-doc-copy strong,
3516
+ .fleet-ops-control-hub-doc-copy small {
3517
+ display: block;
3518
+ }
3519
+
3520
+ .fleet-ops-control-hub-doc-copy strong {
3521
+ overflow: hidden;
3522
+ font-size: 0.75rem;
3523
+ font-weight: 800;
3524
+ line-height: 1rem;
3525
+ color: #111827;
3526
+ text-overflow: ellipsis;
3527
+ white-space: nowrap;
3528
+ }
3529
+
3530
+ .fleet-ops-control-hub-doc-copy small {
3531
+ display: -webkit-box;
3532
+ overflow: hidden;
3533
+ font-size: 0.6875rem;
3534
+ line-height: 0.95rem;
3535
+ color: #6b7280;
3536
+ -webkit-line-clamp: 1;
3537
+ -webkit-box-orient: vertical;
3538
+ }
3539
+
3540
+ .fleet-ops-control-hub-tone-blue {
3541
+ background: linear-gradient(135deg, rgba(37, 99, 235, 0.12), rgba(37, 99, 235, 0.03) 52%, #fff 100%), #fff;
3542
+ border-color: #bfdbfe;
3543
+ }
3544
+
3545
+ .fleet-ops-control-hub-tone-green,
3546
+ .fleet-ops-control-hub-tone-success {
3547
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.14), rgba(16, 185, 129, 0.03) 52%, #fff 100%), #fff;
3548
+ border-color: #a7f3d0;
3549
+ }
3550
+
3551
+ .fleet-ops-control-hub-tone-amber,
3552
+ .fleet-ops-control-hub-tone-warning {
3553
+ background: linear-gradient(135deg, rgba(245, 158, 11, 0.16), rgba(245, 158, 11, 0.04) 52%, #fff 100%), #fff;
3554
+ border-color: #fde68a;
3555
+ }
3556
+
3557
+ .fleet-ops-control-hub-tone-rose {
3558
+ background: linear-gradient(135deg, rgba(225, 29, 72, 0.13), rgba(225, 29, 72, 0.03) 52%, #fff 100%), #fff;
3559
+ border-color: #fecdd3;
3560
+ }
3561
+
3562
+ .fleet-ops-control-hub-tone-green .fleet-ops-control-hub-kpi-icon,
3563
+ .fleet-ops-control-hub-tone-success .fleet-ops-control-hub-kpi-icon,
3564
+ .fleet-ops-control-hub-tone-green .fleet-ops-control-hub-link-icon,
3565
+ .fleet-ops-control-hub-tone-success .fleet-ops-control-hub-link-icon {
3566
+ color: #047857;
3567
+ background: #ecfdf5;
3568
+ }
3569
+
3570
+ .fleet-ops-control-hub-tone-amber .fleet-ops-control-hub-kpi-icon,
3571
+ .fleet-ops-control-hub-tone-warning .fleet-ops-control-hub-kpi-icon,
3572
+ .fleet-ops-control-hub-tone-amber .fleet-ops-control-hub-link-icon,
3573
+ .fleet-ops-control-hub-tone-warning .fleet-ops-control-hub-link-icon {
3574
+ color: #b45309;
3575
+ background: #fffbeb;
3576
+ }
3577
+
3578
+ .fleet-ops-control-hub-tone-rose .fleet-ops-control-hub-kpi-icon {
3579
+ color: #e11d48;
3580
+ background: #fff1f2;
3581
+ }
3582
+
3583
+ .fleet-ops-dashboard-page {
3584
+ display: flex;
3585
+ flex: 0 0 auto;
3586
+ align-items: center;
3587
+ justify-content: space-between;
3588
+ gap: 1rem;
3589
+ width: 100%;
3590
+ padding: 1rem;
3591
+ background-color: #fff;
3592
+ border-bottom: 1px solid #e5e7eb;
3593
+ box-shadow: 0 1px 2px rgb(15 23 42 / 6%);
3594
+ }
3595
+
3596
+ .fleet-ops-dashboard-title h1 {
3597
+ color: #111827;
3598
+ font-size: 1.05rem;
3599
+ font-weight: 800;
3600
+ line-height: 1.2;
3601
+ }
3602
+
3603
+ .fleet-ops-dashboard-actions {
3604
+ justify-content: flex-end;
3605
+ }
3606
+
3607
+ .fleet-ops-dashboard-actions .ember-basic-dropdown-trigger {
3608
+ display: flex;
3609
+ }
3610
+
3611
+ .fleet-ops-dashboard-create-wrapper {
3612
+ padding: 1rem;
3613
+ }
3614
+
3615
+ body[data-theme='dark'] .fleet-ops-control-hub {
3616
+ color: #f9fafb;
3617
+ background: #111827;
3618
+ }
3619
+
3620
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi,
3621
+ body[data-theme='dark'] .fleet-ops-control-hub-panel,
3622
+ body[data-theme='dark'] .fleet-ops-control-hub-link,
3623
+ body[data-theme='dark'] .fleet-ops-control-hub-action {
3624
+ background: #1f2937;
3625
+ border-color: #374151;
3626
+ }
3627
+
3628
+ body[data-theme='dark'] .fleet-ops-control-hub-header {
3629
+ background: #111827;
3630
+ border-color: #374151;
3631
+ }
3632
+
3633
+ body[data-theme='dark'] .fleet-ops-control-hub-title,
3634
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi-value,
3635
+ body[data-theme='dark'] .fleet-ops-control-hub-panel-header h2,
3636
+ body[data-theme='dark'] .fleet-ops-control-hub-link-title,
3637
+ body[data-theme='dark'] .fleet-ops-control-hub-action strong,
3638
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-copy strong {
3639
+ color: #f9fafb;
3640
+ }
3641
+
3642
+ body[data-theme='dark'] .fleet-ops-control-hub-subtitle,
3643
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi-label,
3644
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi-caption,
3645
+ body[data-theme='dark'] .fleet-ops-control-hub-panel-header p,
3646
+ body[data-theme='dark'] .fleet-ops-control-hub-link-description,
3647
+ body[data-theme='dark'] .fleet-ops-control-hub-action small,
3648
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-copy small {
3649
+ color: #9ca3af;
3650
+ }
3651
+
3652
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi-action {
3653
+ color: #93c5fd;
3654
+ }
3655
+
3656
+ body[data-theme='dark'] .fleet-ops-control-hub-action svg {
3657
+ background: transparent;
3658
+ border: 0;
3659
+ border-radius: 0;
3660
+ box-shadow: none;
3661
+ }
3662
+
3663
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-green svg,
3664
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-success svg {
3665
+ color: #34d399;
3666
+ }
3667
+
3668
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-amber svg,
3669
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-warning svg {
3670
+ color: #fbbf24;
3671
+ }
3672
+
3673
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-rose svg {
3674
+ color: #fb7185;
3675
+ }
3676
+
3677
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-blue svg,
3678
+ body[data-theme='dark'] .fleet-ops-control-hub-action.fleet-ops-control-hub-tone-info svg {
3679
+ color: #93c5fd;
3680
+ }
3681
+
3682
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-note {
3683
+ background: rgba(245, 158, 11, 0.12);
3684
+ border-color: rgba(251, 191, 36, 0.35);
3685
+ }
3686
+
3687
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-note-heading,
3688
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-note-heading svg,
3689
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-link svg {
3690
+ color: #fbbf24;
3691
+ }
3692
+
3693
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-note-copy {
3694
+ color: #fcd34d;
3695
+ }
3696
+
3697
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-link:hover {
3698
+ background: rgba(251, 191, 36, 0.12);
3699
+ }
3700
+
3701
+ body[data-theme='dark'] .fleet-ops-control-hub-doc-link + .fleet-ops-control-hub-doc-link::before {
3702
+ border-top-color: rgba(251, 191, 36, 0.28);
3703
+ }
3704
+
3705
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-blue {
3706
+ background: linear-gradient(135deg, rgba(37, 99, 235, 0.2), rgba(37, 99, 235, 0.06) 52%, #1f2937 100%), #1f2937;
3707
+ border-color: rgba(96, 165, 250, 0.45);
3708
+ }
3709
+
3710
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-green,
3711
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-success {
3712
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.2), rgba(16, 185, 129, 0.06) 52%, #1f2937 100%), #1f2937;
3713
+ border-color: rgba(52, 211, 153, 0.45);
3714
+ }
3715
+
3716
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-amber,
3717
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-warning {
3718
+ background: linear-gradient(135deg, rgba(245, 158, 11, 0.22), rgba(245, 158, 11, 0.06) 52%, #1f2937 100%), #1f2937;
3719
+ border-color: rgba(251, 191, 36, 0.45);
3720
+ }
3721
+
3722
+ body[data-theme='dark'] .fleet-ops-control-hub-tone-rose {
3723
+ background: linear-gradient(135deg, rgba(225, 29, 72, 0.2), rgba(225, 29, 72, 0.06) 52%, #1f2937 100%), #1f2937;
3724
+ border-color: rgba(251, 113, 133, 0.45);
1779
3725
  }
1780
3726
 
1781
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1782
- .fleetops-order-list-overlay-inner-wrapper
1783
- .next-content-panel-body
1784
- > .next-content-panel-body-inner
1785
- .order-listings-row-container
1786
- > .order-listing-row
1787
- > .order-listing-row-details
1788
- > .order-listing-row-body
1789
- > .order-listing-row-body-address
1790
- .address-text {
1791
- max-height: 50px;
1792
- overflow-y: hidden;
1793
- text-overflow: ellipsis;
3727
+ body[data-theme='dark'] .fleet-ops-control-hub-kpi-icon,
3728
+ body[data-theme='dark'] .fleet-ops-control-hub-link-icon,
3729
+ body[data-theme='dark'] .fleet-ops-control-hub-link-count {
3730
+ color: #93c5fd;
3731
+ background: rgba(37, 99, 235, 0.2);
1794
3732
  }
1795
3733
 
1796
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1797
- .fleetops-order-list-overlay-inner-wrapper
1798
- .next-content-panel-body
1799
- > .next-content-panel-body-inner
1800
- .order-listings-row-container
1801
- > .order-listing-row
1802
- > .order-listing-row-details
1803
- > .order-listing-row-body
1804
- > .order-listing-row-body-address.start {
1805
- text-align: left;
3734
+ body[data-theme='dark'] .fleet-ops-control-hub-primary-action {
3735
+ color: #fff;
1806
3736
  }
1807
3737
 
1808
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1809
- .fleetops-order-list-overlay-inner-wrapper
1810
- .next-content-panel-body
1811
- > .next-content-panel-body-inner
1812
- .order-listings-row-container
1813
- > .order-listing-row
1814
- > .order-listing-row-details
1815
- > .order-listing-row-body
1816
- > .order-listing-row-body-address.end {
1817
- text-align: right;
3738
+ body[data-theme='dark'] .fleet-ops-dashboard-page {
3739
+ background-color: #111827;
3740
+ border-bottom-color: #1f2937;
3741
+ box-shadow: 0 1px 2px rgb(2 6 23 / 30%);
1818
3742
  }
1819
3743
 
1820
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1821
- .fleetops-order-list-overlay-inner-wrapper
1822
- .next-content-panel-body
1823
- > .next-content-panel-body-inner
1824
- .order-listings-row-container
1825
- > .order-listing-row
1826
- > .order-listing-row-details
1827
- > .order-listing-row-footer
1828
- .resource-assigned {
1829
- display: flex;
1830
- flex-direction: row;
3744
+ body[data-theme='dark'] .fleet-ops-dashboard-title h1 {
3745
+ color: #f9fafb;
1831
3746
  }
1832
3747
 
1833
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1834
- .fleetops-order-list-overlay-inner-wrapper
1835
- .next-content-panel-body
1836
- > .next-content-panel-body-inner
1837
- .order-listings-row-container
1838
- > .order-listing-row
1839
- > .order-listing-row-details
1840
- > .order-listing-row-footer {
1841
- margin-top: 0.5rem;
3748
+ @media (width >= 768px) {
3749
+ .fleet-ops-control-hub-header {
3750
+ flex-direction: row;
3751
+ align-items: flex-start;
3752
+ justify-content: space-between;
3753
+ padding-right: 1.5rem;
3754
+ padding-left: 1.5rem;
3755
+ }
3756
+
3757
+ .fleet-ops-control-hub-header-actions {
3758
+ flex-shrink: 0;
3759
+ justify-content: flex-end;
3760
+ }
3761
+
3762
+ .fleet-ops-control-hub-body {
3763
+ padding: 1rem 1.5rem;
3764
+ }
3765
+
3766
+ .fleet-ops-control-hub-kpis {
3767
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3768
+ }
3769
+
3770
+ .fleet-ops-control-hub-link-grid {
3771
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3772
+ }
3773
+
3774
+ .fleet-ops-control-hub-link-grid-compact {
3775
+ grid-template-columns: repeat(1, minmax(0, 1fr));
3776
+ }
3777
+
3778
+ .fleet-ops-control-hub-doc-grid {
3779
+ grid-template-columns: repeat(1, minmax(0, 1fr));
3780
+ }
1842
3781
  }
1843
3782
 
1844
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1845
- .fleetops-order-list-overlay-inner-wrapper
1846
- .next-content-panel-body
1847
- > .next-content-panel-body-inner
1848
- .order-listings-row-container
1849
- > .order-listing-row
1850
- > .order-listing-row-details
1851
- > .order-listing-row-footer
1852
- .resource-assigned
1853
- > .resource-assigned-photo {
1854
- display: flex;
1855
- flex-shrink: 0;
1856
- position: relative;
1857
- padding-top: 0.2rem;
3783
+ @media (width <= 767px) {
3784
+ .fleet-ops-dashboard-page {
3785
+ flex-direction: column;
3786
+ align-items: flex-start;
3787
+ }
3788
+
3789
+ .fleet-ops-dashboard-actions {
3790
+ justify-content: flex-start;
3791
+ width: 100%;
3792
+ }
1858
3793
  }
1859
3794
 
1860
- .next-content-overlay-panel-body.fleetops-order-list-overlay
1861
- .fleetops-order-list-overlay-inner-wrapper
1862
- .next-content-panel-body
1863
- > .next-content-panel-body-inner
1864
- .order-listings-row-container
1865
- > .order-listing-row
1866
- > .order-listing-row-details
1867
- > .order-listing-row-footer
1868
- .resource-assigned
1869
- > .resource-assigned-details {
1870
- display: flex;
1871
- flex-direction: column;
1872
- font-size: 0.75rem;
1873
- line-height: 1.1rem;
3795
+ @media (width >= 1024px) {
3796
+ .fleet-ops-control-hub-grid {
3797
+ grid-template-columns: minmax(0, 1fr) minmax(18rem, 23rem);
3798
+ align-items: start;
3799
+ }
3800
+
3801
+ .fleet-ops-control-hub-kpis {
3802
+ grid-template-columns: repeat(4, minmax(0, 1fr));
3803
+ }
3804
+
3805
+ .fleet-ops-control-hub-side {
3806
+ position: sticky;
3807
+ top: 5.25rem;
3808
+ }
1874
3809
  }
1875
3810
 
1876
- .order-listing-row-table-details {
1877
- color: #d1d5db;
1878
- font-size: 0.75rem;
1879
- line-height: 1rem;
1880
- font-weight: normal;
1881
- text-align: left;
1882
- padding: 0.5rem;
1883
- width: 100%;
1884
- table-layout: fixed;
3811
+ @media (width >= 1280px) {
3812
+ .fleet-ops-control-hub-link-grid {
3813
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3814
+ }
3815
+
3816
+ .fleet-ops-control-hub-link-grid-compact {
3817
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3818
+ }
1885
3819
  }
1886
3820
 
1887
- .order-listing-row-table-details > thead > tr > th {
1888
- background-color: #111827;
1889
- color: #e5e7eb;
1890
- font-size: 0.75rem;
1891
- line-height: 1rem;
1892
- font-weight: normal;
1893
- text-align: left;
1894
- padding: 0.5rem;
1895
- border: 1px #374151 solid;
1896
- width: 50%;
3821
+ body[data-theme='dark'] .fleet-ops-hub-subtitle,
3822
+ body[data-theme='dark'] .fleet-ops-hub-kpi-label,
3823
+ body[data-theme='dark'] .fleet-ops-hub-kpi-caption,
3824
+ body[data-theme='dark'] .fleet-ops-hub-card-description,
3825
+ body[data-theme='dark'] .fleet-ops-hub-guidance-list,
3826
+ body[data-theme='dark'] .fleet-ops-hub-section-title {
3827
+ color: #9ca3af;
1897
3828
  }
1898
3829
 
1899
- .order-listing-row-table-details > thead > tr > th:last-child {
1900
- border-left: 0;
3830
+ body[data-theme='dark'] .fleet-ops-hub-card:hover {
3831
+ background: #243244;
3832
+ border-color: #2563eb;
1901
3833
  }
1902
3834
 
1903
- .order-listing-row-table-details > tbody > tr > td {
1904
- font-size: 0.75rem;
1905
- line-height: 1rem;
1906
- font-weight: normal;
1907
- text-align: left;
1908
- padding: 0.5rem;
1909
- vertical-align: top;
3835
+ body[data-theme='dark'] .fleet-ops-hub-card-icon,
3836
+ body[data-theme='dark'] .fleet-ops-hub-kpi-icon {
3837
+ color: #93c5fd;
3838
+ background: rgba(37, 99, 235, 0.22);
1910
3839
  }
1911
3840
 
1912
- .justify-end-i {
1913
- justify-content: end !important;
3841
+ body[data-theme='dark'] .fleet-ops-hub-panel-prominent,
3842
+ body[data-theme='dark'] .fleet-ops-hub-kpi-accent-green,
3843
+ body[data-theme='dark'] .fleet-ops-hub-kpi-accent-amber,
3844
+ body[data-theme='dark'] .fleet-ops-hub-kpi-accent-rose {
3845
+ background: #1f2937;
1914
3846
  }
1915
3847
 
1916
- button.fleetops-btn-xxs.btn,
1917
- button.fleetops-btn-xxs,
1918
- .fleetops-btn-xxs {
1919
- padding-top: 0.2rem !important;
1920
- padding-bottom: 0.2rem !important;
3848
+ @media (width >= 768px) {
3849
+ .fleet-ops-hub-kpi-grid,
3850
+ .fleet-ops-hub-card-grid,
3851
+ .fleet-ops-hub-card-grid-three {
3852
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3853
+ }
3854
+ }
3855
+
3856
+ @media (width >= 1280px) {
3857
+ .fleet-ops-hub-kpi-grid {
3858
+ grid-template-columns: repeat(4, minmax(0, 1fr));
3859
+ }
3860
+
3861
+ .fleet-ops-hub-layout {
3862
+ grid-template-columns: minmax(0, 2fr) minmax(18rem, 1fr);
3863
+ }
3864
+
3865
+ .fleet-ops-hub-card-grid-three {
3866
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3867
+ }
1921
3868
  }
1922
3869
 
1923
3870
  /** css fix for operations index/kanban */
@@ -5442,7 +7389,7 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5442
7389
  margin-top: 0.375rem;
5443
7390
  }
5444
7391
 
5445
- .issue-detail-order-card {
7392
+ .order-card {
5446
7393
  display: block;
5447
7394
  width: 100%;
5448
7395
  padding: 0.75rem;
@@ -5458,24 +7405,122 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5458
7405
  border-color 0.15s ease;
5459
7406
  }
5460
7407
 
5461
- .issue-detail-order-card:hover {
7408
+ .order-card.is-interactive {
7409
+ cursor: pointer;
7410
+ }
7411
+
7412
+ .order-card.is-interactive:hover {
5462
7413
  background: #eff6ff;
5463
7414
  border-color: #93c5fd;
5464
7415
  }
5465
7416
 
5466
- .issue-detail-order-topline,
5467
- .issue-detail-order-meta {
7417
+ .order-card-compact,
7418
+ .order-card-list {
7419
+ padding: 0.625rem;
7420
+ margin-top: 0;
7421
+ }
7422
+
7423
+ .order-card-selection {
7424
+ padding: 0;
7425
+ margin-top: 0;
7426
+ background: transparent;
7427
+ border: 0;
7428
+ border-radius: 0.375rem;
7429
+ box-shadow: none;
7430
+ }
7431
+
7432
+ .order-card-selection .order-card-topline {
7433
+ padding: 0.5rem 0.75rem 0;
7434
+ }
7435
+
7436
+ .order-card-selection .order-card-route {
7437
+ gap: 0.375rem;
7438
+ padding: 0.375rem 0.75rem 0;
7439
+ }
7440
+
7441
+ .order-card-selection .order-card-stop {
7442
+ grid-template-columns: 1.25rem minmax(0, 1fr);
7443
+ gap: 0.5rem;
7444
+ }
7445
+
7446
+ .order-card-selection .order-card-stop-marker {
7447
+ width: 1.25rem;
7448
+ height: 1.25rem;
7449
+ font-size: 0.625rem;
7450
+ }
7451
+
7452
+ .order-card-selection .order-card-meta {
7453
+ padding: 0 0.75rem 0.5rem;
7454
+ margin-top: 0.5rem;
7455
+ }
7456
+
7457
+ .order-card-selection .order-card-empty-route {
7458
+ margin: 0.375rem 0.75rem 0.5rem;
7459
+ }
7460
+
7461
+ .ember-power-select-option[aria-selected='true'] .order-card-selection,
7462
+ .ember-power-select-option[aria-current='true'] .order-card-selection,
7463
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection {
7464
+ background: transparent;
7465
+ border-color: transparent;
7466
+ box-shadow: none;
7467
+ }
7468
+
7469
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-title,
7470
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-title,
7471
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-title,
7472
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-stop-address,
7473
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-stop-address,
7474
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-stop-address {
7475
+ color: #fff;
7476
+ }
7477
+
7478
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-subtitle,
7479
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-subtitle,
7480
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-subtitle,
7481
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-route,
7482
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-route,
7483
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-route,
7484
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-meta,
7485
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-meta,
7486
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-meta,
7487
+ .ember-power-select-option[aria-selected='true'] .order-card-selection .order-card-stop-label,
7488
+ .ember-power-select-option[aria-current='true'] .order-card-selection .order-card-stop-label,
7489
+ .ember-power-select-option.ember-power-select-option--highlighted .order-card-selection .order-card-stop-label {
7490
+ color: rgb(255 255 255 / 78%);
7491
+ }
7492
+
7493
+ .order-card.is-selected {
7494
+ border-color: #3485e2;
7495
+ box-shadow: 0 0 0 2px rgb(52 133 226 / 16%);
7496
+ }
7497
+
7498
+ .order-card.is-disabled {
7499
+ opacity: 0.55;
7500
+ pointer-events: none;
7501
+ }
7502
+
7503
+ .order-card.is-selectable {
7504
+ cursor: pointer;
7505
+ }
7506
+
7507
+ .order-card-topline,
7508
+ .order-card-meta {
5468
7509
  display: flex;
5469
7510
  align-items: center;
5470
7511
  justify-content: space-between;
5471
7512
  gap: 0.5rem;
5472
7513
  }
5473
7514
 
5474
- .issue-detail-order-title-block {
7515
+ .order-card-checkbox {
7516
+ flex: 0 0 auto;
7517
+ }
7518
+
7519
+ .order-card-title-block {
5475
7520
  min-width: 0;
5476
7521
  }
5477
7522
 
5478
- .issue-detail-order-title {
7523
+ .order-card-title {
5479
7524
  overflow: hidden;
5480
7525
  color: #111827;
5481
7526
  font-weight: 600;
@@ -5484,15 +7529,19 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5484
7529
  white-space: nowrap;
5485
7530
  }
5486
7531
 
5487
- .issue-detail-order-subtitle,
5488
- .issue-detail-order-meta,
7532
+ .order-card-subtitle,
7533
+ .order-card-meta,
5489
7534
  .issue-detail-timeline-value,
5490
7535
  .issue-detail-coordinate {
5491
7536
  color: #6b7280;
5492
7537
  font-size: 0.75rem;
5493
7538
  }
5494
7539
 
5495
- .issue-detail-order-progress {
7540
+ .order-card-header-actions {
7541
+ flex: 0 0 auto;
7542
+ }
7543
+
7544
+ .order-card-progress {
5496
7545
  position: relative;
5497
7546
  height: 0.25rem;
5498
7547
  margin: 0.625rem 0 0.75rem;
@@ -5501,46 +7550,46 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5501
7550
  border-radius: 9999px;
5502
7551
  }
5503
7552
 
5504
- .issue-detail-order-progress span {
7553
+ .order-card-progress span {
5505
7554
  position: absolute;
5506
7555
  inset: 0 auto 0 0;
5507
7556
  background: #3485e2;
5508
7557
  border-radius: inherit;
5509
7558
  }
5510
7559
 
5511
- .issue-detail-order-progress.is-pending span {
7560
+ .order-card-progress.is-pending span {
5512
7561
  width: 22%;
5513
7562
  background: #94a3b8;
5514
7563
  }
5515
7564
 
5516
- .issue-detail-order-progress.is-active span {
7565
+ .order-card-progress.is-active span {
5517
7566
  width: 58%;
5518
7567
  }
5519
7568
 
5520
- .issue-detail-order-progress.is-complete span {
7569
+ .order-card-progress.is-complete span {
5521
7570
  width: 100%;
5522
7571
  background: #10b981;
5523
7572
  }
5524
7573
 
5525
- .issue-detail-order-route {
7574
+ .order-card-route {
5526
7575
  display: grid;
5527
7576
  gap: 0.5rem;
5528
7577
  color: #64748b;
5529
7578
  font-size: 0.75rem;
5530
7579
  }
5531
7580
 
5532
- .issue-detail-order-stop {
7581
+ .order-card-stop {
5533
7582
  display: grid;
5534
7583
  grid-template-columns: 1.5rem minmax(0, 1fr);
5535
7584
  gap: 0.5rem;
5536
7585
  align-items: start;
5537
7586
  }
5538
7587
 
5539
- .issue-detail-order-stop.compact {
7588
+ .order-card-stop.compact {
5540
7589
  opacity: 0.88;
5541
7590
  }
5542
7591
 
5543
- .issue-detail-order-stop-marker {
7592
+ .order-card-stop-marker {
5544
7593
  display: inline-flex;
5545
7594
  align-items: center;
5546
7595
  justify-content: center;
@@ -5553,27 +7602,27 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5553
7602
  border-radius: 9999px;
5554
7603
  }
5555
7604
 
5556
- .issue-detail-order-stop-marker.pickup {
7605
+ .order-card-stop-marker.pickup {
5557
7606
  background: #3485e2;
5558
7607
  }
5559
7608
 
5560
- .issue-detail-order-stop-marker.dropoff {
7609
+ .order-card-stop-marker.dropoff {
5561
7610
  background: #10b981;
5562
7611
  }
5563
7612
 
5564
- .issue-detail-order-stop-marker.middle {
7613
+ .order-card-stop-marker.middle {
5565
7614
  color: #2563eb;
5566
7615
  background: #dbeafe;
5567
7616
  }
5568
7617
 
5569
- .issue-detail-order-stop-label {
7618
+ .order-card-stop-label {
5570
7619
  color: #94a3b8;
5571
7620
  font-weight: 700;
5572
7621
  font-size: 0.625rem;
5573
7622
  text-transform: uppercase;
5574
7623
  }
5575
7624
 
5576
- .issue-detail-order-stop-address {
7625
+ .order-card-stop-address {
5577
7626
  overflow: hidden;
5578
7627
  color: #334155;
5579
7628
  font-weight: 700;
@@ -5583,19 +7632,33 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
5583
7632
  white-space: nowrap;
5584
7633
  }
5585
7634
 
5586
- .issue-detail-order-meta {
7635
+ .order-card-meta {
5587
7636
  flex-flow: row wrap;
5588
7637
  justify-content: flex-start;
5589
7638
  margin-top: 0.75rem;
5590
7639
  font-size: 0.6875rem;
5591
7640
  }
5592
7641
 
5593
- .issue-detail-order-meta span {
7642
+ .order-card-meta span {
5594
7643
  display: inline-flex;
5595
7644
  align-items: center;
5596
7645
  gap: 0.25rem;
5597
7646
  }
5598
7647
 
7648
+ .order-card-empty-route {
7649
+ display: flex;
7650
+ align-items: center;
7651
+ justify-content: center;
7652
+ gap: 0.5rem;
7653
+ padding: 0.75rem;
7654
+ margin-top: 0.75rem;
7655
+ color: #6b7280;
7656
+ font-size: 0.75rem;
7657
+ background: #fff;
7658
+ border: 1px dashed #d1d5db;
7659
+ border-radius: 0.375rem;
7660
+ }
7661
+
5599
7662
  .issue-detail-empty {
5600
7663
  display: flex;
5601
7664
  align-items: center;
@@ -5820,7 +7883,7 @@ body[data-theme='dark'] .issue-panel-header-icon {
5820
7883
 
5821
7884
  body[data-theme='dark'] .issue-detail-report,
5822
7885
  body[data-theme='dark'] .issue-detail-resolution-state,
5823
- body[data-theme='dark'] .issue-detail-order-card,
7886
+ body[data-theme='dark'] .order-card,
5824
7887
  body[data-theme='dark'] .issue-detail-empty,
5825
7888
  body[data-theme='dark'] .issue-detail-timeline-marker {
5826
7889
  background: #374151;
@@ -5832,8 +7895,8 @@ body[data-theme='dark'] .issue-detail-message-author,
5832
7895
  body[data-theme='dark'] .issue-detail-resolution-title,
5833
7896
  body[data-theme='dark'] .issue-detail-meta-list dd,
5834
7897
  body[data-theme='dark'] .issue-detail-summary-item dd,
5835
- body[data-theme='dark'] .issue-detail-order-title,
5836
- body[data-theme='dark'] .issue-detail-order-stop-address,
7898
+ body[data-theme='dark'] .order-card-title,
7899
+ body[data-theme='dark'] .order-card-stop-address,
5837
7900
  body[data-theme='dark'] .issue-detail-report {
5838
7901
  color: #f9fafb;
5839
7902
  }
@@ -5847,9 +7910,9 @@ body[data-theme='dark'] .issue-detail-meta-list dt,
5847
7910
  body[data-theme='dark'] .issue-detail-summary-item dt,
5848
7911
  body[data-theme='dark'] .issue-detail-resource-label,
5849
7912
  body[data-theme='dark'] .issue-detail-timeline-label,
5850
- body[data-theme='dark'] .issue-detail-order-subtitle,
5851
- body[data-theme='dark'] .issue-detail-order-route,
5852
- body[data-theme='dark'] .issue-detail-order-meta,
7913
+ body[data-theme='dark'] .order-card-subtitle,
7914
+ body[data-theme='dark'] .order-card-route,
7915
+ body[data-theme='dark'] .order-card-meta,
5853
7916
  body[data-theme='dark'] .issue-detail-timeline-value,
5854
7917
  body[data-theme='dark'] .issue-detail-coordinate,
5855
7918
  body[data-theme='dark'] .issue-detail-empty {
@@ -5895,7 +7958,7 @@ body[data-theme='dark'] .issue-detail-meta-list > div {
5895
7958
  border-top-color: #374151;
5896
7959
  }
5897
7960
 
5898
- body[data-theme='dark'] .issue-detail-order-card:hover {
7961
+ body[data-theme='dark'] .order-card.is-interactive:hover {
5899
7962
  background: #374151;
5900
7963
  border-color: #2563eb;
5901
7964
  }
@@ -5905,15 +7968,27 @@ body[data-theme='dark'] .issue-detail-avatar {
5905
7968
  background: #1e3a8a;
5906
7969
  }
5907
7970
 
5908
- body[data-theme='dark'] .issue-detail-order-progress {
7971
+ body[data-theme='dark'] .order-card-progress {
5909
7972
  background: #4b5563;
5910
7973
  }
5911
7974
 
5912
- body[data-theme='dark'] .issue-detail-order-stop-marker.middle {
7975
+ body[data-theme='dark'] .order-card-stop-marker.middle {
5913
7976
  color: #93c5fd;
5914
7977
  background: rgb(37 99 235 / 24%);
5915
7978
  }
5916
7979
 
7980
+ body[data-theme='dark'] .order-card-empty-route {
7981
+ color: #9ca3af;
7982
+ background: #1f2937;
7983
+ border-color: #4b5563;
7984
+ }
7985
+
7986
+ body[data-theme='dark'] .order-card-selection {
7987
+ background: transparent;
7988
+ border-color: transparent;
7989
+ box-shadow: none;
7990
+ }
7991
+
5917
7992
  body[data-theme='dark'] .issue-detail-dropzone {
5918
7993
  color: #d1d5db;
5919
7994
  background: #1f2937;