@fleetbase/fleetops-engine 0.6.65 → 0.6.66

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 (1051) hide show
  1. package/RELEASE.md +11 -6
  2. package/addon/components/ai/create-order-preview.hbs +10 -5
  3. package/addon/components/asset/pill.hbs +24 -0
  4. package/addon/components/asset/summary.hbs +1 -0
  5. package/addon/components/asset-connection/pill.hbs +24 -0
  6. package/addon/components/asset-connection/summary.hbs +1 -0
  7. package/addon/components/attachable/pill.hbs +24 -0
  8. package/addon/components/attachable/summary.hbs +1 -0
  9. package/addon/components/cell/asset-connection-identity.hbs +1 -0
  10. package/addon/components/cell/asset-identity.hbs +1 -0
  11. package/addon/components/cell/attachable-identity.hbs +1 -0
  12. package/addon/components/cell/contact-identity.hbs +1 -0
  13. package/addon/components/cell/customer-identity.hbs +1 -0
  14. package/addon/components/cell/device-event-identity.hbs +1 -0
  15. package/addon/components/cell/device-identity.hbs +1 -24
  16. package/addon/components/cell/driver-identity.hbs +1 -33
  17. package/addon/components/cell/entity-identity.hbs +1 -0
  18. package/addon/components/cell/equipment-identity.hbs +1 -5
  19. package/addon/components/cell/facilitator-identity.hbs +1 -0
  20. package/addon/components/cell/fleet-driver-identity.hbs +1 -0
  21. package/addon/components/cell/fleet-identity.hbs +1 -0
  22. package/addon/components/cell/fuel-provider-connection-identity.hbs +1 -0
  23. package/addon/components/cell/fuel-provider-transaction-identity.hbs +1 -0
  24. package/addon/components/cell/fuel-report-identity.hbs +1 -0
  25. package/addon/components/cell/inspection-form-identity.hbs +1 -0
  26. package/addon/components/cell/inspection-item-result-identity.hbs +1 -0
  27. package/addon/components/cell/inspection-submission-identity.hbs +1 -0
  28. package/addon/components/cell/integrated-vendor-identity.hbs +1 -0
  29. package/addon/components/cell/issue-identity.hbs +1 -0
  30. package/addon/components/cell/maintenance-identity.hbs +1 -0
  31. package/addon/components/cell/maintenance-schedule-identity.hbs +1 -0
  32. package/addon/components/cell/maintenance-subject-identity.hbs +1 -0
  33. package/addon/components/cell/manifest-identity.hbs +1 -0
  34. package/addon/components/cell/manifest-stop-identity.hbs +1 -0
  35. package/addon/components/cell/order-config-identity.hbs +1 -0
  36. package/addon/components/cell/order-identity.hbs +1 -0
  37. package/addon/components/cell/part-identity.hbs +1 -5
  38. package/addon/components/cell/payload-identity.hbs +1 -0
  39. package/addon/components/cell/place-identity.hbs +1 -0
  40. package/addon/components/cell/position-identity.hbs +1 -0
  41. package/addon/components/cell/purchase-rate-identity.hbs +1 -0
  42. package/addon/components/cell/recurring-order-schedule-identity.hbs +1 -0
  43. package/addon/components/cell/resource-list.hbs +10 -0
  44. package/addon/components/cell/resource-list.js +28 -0
  45. package/addon/components/cell/route-identity.hbs +1 -0
  46. package/addon/components/cell/sensor-identity.hbs +1 -0
  47. package/addon/components/cell/service-area-identity.hbs +1 -0
  48. package/addon/components/cell/service-quote-identity.hbs +1 -0
  49. package/addon/components/cell/service-quote-item-identity.hbs +1 -0
  50. package/addon/components/cell/service-rate-fee-identity.hbs +1 -0
  51. package/addon/components/cell/service-rate-identity.hbs +1 -0
  52. package/addon/components/cell/service-rate-parcel-fee-identity.hbs +1 -0
  53. package/addon/components/cell/telematic-identity.hbs +1 -0
  54. package/addon/components/cell/tracking-number-identity.hbs +1 -0
  55. package/addon/components/cell/tracking-status-identity.hbs +1 -0
  56. package/addon/components/cell/trailer-identity.hbs +1 -0
  57. package/addon/components/cell/vehicle-device-identity.hbs +1 -0
  58. package/addon/components/cell/vehicle-identity.hbs +1 -33
  59. package/addon/components/cell/vendor-identity.hbs +1 -0
  60. package/addon/components/cell/warranty-identity.hbs +1 -0
  61. package/addon/components/cell/waypoint-identity.hbs +1 -0
  62. package/addon/components/cell/work-order-identity.hbs +1 -0
  63. package/addon/components/cell/zone-identity.hbs +1 -0
  64. package/addon/components/contact/form.hbs +2 -4
  65. package/addon/components/contact/pill.hbs +24 -0
  66. package/addon/components/contact/summary.hbs +1 -0
  67. package/addon/components/customer/create-order-form.hbs +8 -4
  68. package/addon/components/customer/form.hbs +2 -4
  69. package/addon/components/customer/order-form.hbs +10 -8
  70. package/addon/components/customer/pill.hbs +24 -0
  71. package/addon/components/customer/summary.hbs +1 -0
  72. package/addon/components/device/details.hbs +3 -1
  73. package/addon/components/device/form.hbs +4 -13
  74. package/addon/components/device/panel-header.hbs +3 -2
  75. package/addon/components/device/panel-header.js +1 -5
  76. package/addon/components/device/panel-tabs/vehicle.hbs +2 -2
  77. package/addon/components/device/pill.hbs +24 -16
  78. package/addon/components/device/summary.hbs +1 -0
  79. package/addon/components/device/telemetry.hbs +17 -0
  80. package/addon/components/device/telemetry.js +117 -0
  81. package/addon/components/device-event/details.hbs +6 -24
  82. package/addon/components/device-event/pill.hbs +24 -0
  83. package/addon/components/device-event/summary.hbs +1 -0
  84. package/addon/components/driver/details.hbs +9 -1
  85. package/addon/components/driver/form.hbs +6 -18
  86. package/addon/components/driver/panel-header.hbs +3 -4
  87. package/addon/components/driver/panel-header.js +8 -1
  88. package/addon/components/driver/pill.hbs +16 -8
  89. package/addon/components/driver/summary.hbs +1 -0
  90. package/addon/components/entity/pill.hbs +24 -0
  91. package/addon/components/entity/summary.hbs +1 -0
  92. package/addon/components/equipment/details.hbs +6 -2
  93. package/addon/components/equipment/form.hbs +10 -4
  94. package/addon/components/equipment/pill.hbs +24 -20
  95. package/addon/components/equipment/summary.hbs +1 -0
  96. package/addon/components/facilitator/pill.hbs +24 -0
  97. package/addon/components/facilitator/summary.hbs +1 -0
  98. package/addon/components/fleet/details.hbs +6 -2
  99. package/addon/components/fleet/driver-listing.hbs +3 -12
  100. package/addon/components/fleet/form.hbs +8 -4
  101. package/addon/components/fleet/pill.hbs +24 -0
  102. package/addon/components/fleet/summary.hbs +1 -0
  103. package/addon/components/fleet/vehicle-listing.hbs +3 -12
  104. package/addon/components/fleet-driver/pill.hbs +24 -0
  105. package/addon/components/fleet-driver/summary.hbs +1 -0
  106. package/addon/components/fleet-driver-listing.hbs +2 -1
  107. package/addon/components/fleet-panel/details.hbs +6 -2
  108. package/addon/components/fleet-panel/driver-listing.hbs +2 -1
  109. package/addon/components/fleet-panel/vehicle-listing.hbs +2 -1
  110. package/addon/components/fleet-vehicle-listing.hbs +2 -1
  111. package/addon/components/fuel-integration/form.hbs +125 -25
  112. package/addon/components/fuel-integration/form.js +74 -19
  113. package/addon/components/fuel-integration/hub.hbs +68 -65
  114. package/addon/components/fuel-integration/hub.js +15 -19
  115. package/addon/components/fuel-provider-connection/pill.hbs +24 -0
  116. package/addon/components/fuel-provider-connection/summary.hbs +1 -0
  117. package/addon/components/fuel-provider-transaction/pill.hbs +24 -0
  118. package/addon/components/fuel-provider-transaction/summary.hbs +1 -0
  119. package/addon/components/fuel-report/details.hbs +9 -3
  120. package/addon/components/fuel-report/form.hbs +6 -3
  121. package/addon/components/fuel-report/pill.hbs +24 -0
  122. package/addon/components/fuel-report/summary.hbs +1 -0
  123. package/addon/components/fuel-transaction-status.hbs +1 -0
  124. package/addon/components/fuel-transaction-status.js +8 -0
  125. package/addon/components/geofence-map.hbs +19 -0
  126. package/addon/components/geofence-map.js +83 -0
  127. package/addon/components/inspection-field/form.hbs +103 -0
  128. package/addon/components/inspection-field/form.js +211 -0
  129. package/addon/components/inspection-field/input.hbs +270 -0
  130. package/addon/components/inspection-field/input.js +472 -0
  131. package/addon/components/inspection-field/value.hbs +90 -0
  132. package/addon/components/inspection-field/value.js +158 -0
  133. package/addon/components/inspection-flyout.hbs +34 -0
  134. package/addon/components/inspection-flyout.js +66 -0
  135. package/addon/components/inspection-form/builder.hbs +88 -0
  136. package/addon/components/inspection-form/builder.js +211 -0
  137. package/addon/components/inspection-form/details/submissions.hbs +48 -0
  138. package/addon/components/inspection-form/details/submissions.js +42 -0
  139. package/addon/components/inspection-form/details.hbs +97 -0
  140. package/addon/components/inspection-form/details.js +57 -0
  141. package/addon/components/inspection-form/form.hbs +93 -0
  142. package/addon/components/inspection-form/form.js +79 -0
  143. package/addon/components/inspection-form/pill.hbs +24 -0
  144. package/addon/components/inspection-form/summary.hbs +1 -0
  145. package/addon/components/inspection-item-result/pill.hbs +24 -0
  146. package/addon/components/inspection-item-result/summary.hbs +1 -0
  147. package/addon/components/inspection-link/list.hbs +94 -0
  148. package/addon/components/inspection-link/list.js +129 -0
  149. package/addon/components/inspection-sheet/group.hbs +45 -0
  150. package/addon/components/inspection-sheet/group.js +75 -0
  151. package/addon/components/inspection-sheet.hbs +77 -0
  152. package/addon/components/inspection-sheet.js +152 -0
  153. package/addon/components/inspection-submission/details.hbs +149 -0
  154. package/addon/components/inspection-submission/details.js +130 -0
  155. package/addon/components/inspection-submission/form.hbs +114 -0
  156. package/addon/components/inspection-submission/form.js +129 -0
  157. package/addon/components/inspection-submission/photos.hbs +20 -0
  158. package/addon/components/inspection-submission/photos.js +57 -0
  159. package/addon/components/inspection-submission/pill.hbs +24 -0
  160. package/addon/components/inspection-submission/summary.hbs +1 -0
  161. package/addon/components/integrated-vendor/pill.hbs +24 -0
  162. package/addon/components/integrated-vendor/summary.hbs +1 -0
  163. package/addon/components/issue/details.hbs +12 -0
  164. package/addon/components/issue/details.js +36 -0
  165. package/addon/components/issue/form.hbs +10 -5
  166. package/addon/components/issue/pill.hbs +24 -0
  167. package/addon/components/issue/summary.hbs +1 -0
  168. package/addon/components/layout/fleet-ops-sidebar.js +14 -3
  169. package/addon/components/maintenance/details.hbs +9 -3
  170. package/addon/components/maintenance/form.hbs +22 -3
  171. package/addon/components/maintenance/form.js +4 -4
  172. package/addon/components/maintenance/panel-header.hbs +14 -12
  173. package/addon/components/maintenance/pill.hbs +24 -0
  174. package/addon/components/maintenance/summary.hbs +1 -0
  175. package/addon/components/maintenance-schedule/details.hbs +7 -3
  176. package/addon/components/maintenance-schedule/form.hbs +20 -2
  177. package/addon/components/maintenance-schedule/form.js +6 -6
  178. package/addon/components/maintenance-schedule/pill.hbs +24 -0
  179. package/addon/components/maintenance-schedule/summary.hbs +1 -0
  180. package/addon/components/maintenance-schedule/work-orders.hbs +39 -0
  181. package/addon/components/maintenance-schedule/work-orders.js +37 -0
  182. package/addon/components/maintenance-subject/pill.hbs +24 -0
  183. package/addon/components/maintenance-subject/summary.hbs +1 -0
  184. package/addon/components/manifest/pill.hbs +24 -0
  185. package/addon/components/manifest/summary.hbs +1 -0
  186. package/addon/components/manifest-stop/pill.hbs +24 -0
  187. package/addon/components/manifest-stop/summary.hbs +1 -0
  188. package/addon/components/map/drawer/device-event-listing.hbs +4 -14
  189. package/addon/components/map/drawer/device-event-listing.js +3 -1
  190. package/addon/components/map/drawer/driver-listing.js +6 -2
  191. package/addon/components/map/drawer/position-listing.hbs +2 -16
  192. package/addon/components/map/drawer/vehicle-listing.js +1 -2
  193. package/addon/components/modals/add-driver-shift.hbs +2 -1
  194. package/addon/components/modals/assign-driver.hbs +2 -16
  195. package/addon/components/modals/attach-device.hbs +2 -1
  196. package/addon/components/modals/attach-equipment.hbs +2 -4
  197. package/addon/components/modals/attach-telematic-device.hbs +8 -1
  198. package/addon/components/modals/attach-trailer.hbs +2 -1
  199. package/addon/components/modals/bulk-assign-driver.hbs +2 -9
  200. package/addon/components/modals/bulk-assign-orders.hbs +2 -9
  201. package/addon/components/modals/driver-assign-order.hbs +2 -6
  202. package/addon/components/modals/driver-assign-vehicle.hbs +4 -12
  203. package/addon/components/modals/driver-assign-vehicle.js +30 -0
  204. package/addon/components/modals/driver-assign-vendor.hbs +2 -1
  205. package/addon/components/modals/driver-form.hbs +4 -2
  206. package/addon/components/modals/fleet-assign-driver.hbs +2 -1
  207. package/addon/components/modals/fleet-assign-vehicle.hbs +2 -1
  208. package/addon/components/modals/fleet-form.hbs +4 -2
  209. package/addon/components/modals/fuel-connection-diagnostics.hbs +35 -0
  210. package/addon/components/modals/fuel-connection-diagnostics.js +87 -0
  211. package/addon/components/modals/fuel-report-form.hbs +4 -2
  212. package/addon/components/modals/fuel-transaction-action.hbs +48 -0
  213. package/addon/components/modals/fuel-transaction-action.js +98 -0
  214. package/addon/components/modals/group-form.hbs +2 -1
  215. package/addon/components/modals/inspection-follow-up.hbs +31 -0
  216. package/addon/components/modals/inspection-follow-up.js +39 -0
  217. package/addon/components/modals/inspection-link.hbs +100 -0
  218. package/addon/components/modals/inspection-link.js +83 -0
  219. package/addon/components/modals/issue-assign.hbs +2 -1
  220. package/addon/components/modals/issue-from.hbs +8 -4
  221. package/addon/components/modals/map-layer-form.hbs +2 -1
  222. package/addon/components/modals/order-assign-driver.hbs +2 -16
  223. package/addon/components/modals/order-form.hbs +8 -46
  224. package/addon/components/modals/order-route-form.hbs +8 -4
  225. package/addon/components/modals/place-assign-vendor.hbs +3 -2
  226. package/addon/components/modals/place-details.hbs +1 -1
  227. package/addon/components/modals/point-map.hbs +1 -1
  228. package/addon/components/modals/radar-notice.hbs +24 -0
  229. package/addon/components/modals/radar-notice.js +8 -0
  230. package/addon/components/modals/radar-save-view.hbs +7 -0
  231. package/addon/components/modals/radar-select-resource.hbs +35 -0
  232. package/addon/components/modals/radar-send-pin.hbs +20 -0
  233. package/addon/components/modals/radar-send-pin.js +8 -0
  234. package/addon/components/modals/select-trailer.hbs +2 -4
  235. package/addon/components/modals/vehicle-form.hbs +2 -1
  236. package/addon/components/modals/vendor-form.hbs +2 -3
  237. package/addon/components/order/details/activity.js +9 -0
  238. package/addon/components/order/details/detail.hbs +2 -32
  239. package/addon/components/order/form/details.hbs +10 -48
  240. package/addon/components/order/form/route.hbs +10 -12
  241. package/addon/components/order/form/service-rate.hbs +2 -3
  242. package/addon/components/order/pill.hbs +24 -34
  243. package/addon/components/order/route-editor.hbs +8 -4
  244. package/addon/components/order/schedule-card.hbs +2 -1
  245. package/addon/components/order/summary.hbs +1 -0
  246. package/addon/components/order-config/pill.hbs +24 -0
  247. package/addon/components/order-config/summary.hbs +1 -0
  248. package/addon/components/part/details.hbs +15 -3
  249. package/addon/components/part/details.js +37 -1
  250. package/addon/components/part/form.hbs +12 -5
  251. package/addon/components/part/pill.hbs +24 -0
  252. package/addon/components/part/summary.hbs +1 -0
  253. package/addon/components/payload/pill.hbs +24 -0
  254. package/addon/components/payload/summary.hbs +1 -0
  255. package/addon/components/place/details.hbs +1 -1
  256. package/addon/components/place/pill.hbs +24 -0
  257. package/addon/components/place/summary.hbs +1 -0
  258. package/addon/components/position/pill.hbs +24 -0
  259. package/addon/components/position/summary.hbs +1 -0
  260. package/addon/components/positions-replay.hbs +2 -4
  261. package/addon/components/public-inspection.hbs +174 -0
  262. package/addon/components/public-inspection.js +279 -0
  263. package/addon/components/purchase-rate/pill.hbs +24 -0
  264. package/addon/components/purchase-rate/summary.hbs +1 -0
  265. package/addon/components/radar/agenda/entry.hbs +17 -0
  266. package/addon/components/radar/agenda/entry.js +26 -0
  267. package/addon/components/radar/agenda/lane.hbs +33 -0
  268. package/addon/components/radar/agenda/lane.js +80 -0
  269. package/addon/components/radar/agenda.hbs +69 -0
  270. package/addon/components/radar/agenda.js +29 -0
  271. package/addon/components/radar/briefing.hbs +108 -0
  272. package/addon/components/radar/briefing.js +43 -0
  273. package/addon/components/radar/bulk-bar.hbs +41 -0
  274. package/addon/components/radar/bulk-bar.js +32 -0
  275. package/addon/components/radar/decision-card.hbs +28 -0
  276. package/addon/components/radar/decision-card.js +7 -0
  277. package/addon/components/radar/empty-state.hbs +30 -0
  278. package/addon/components/radar/empty-state.js +27 -0
  279. package/addon/components/radar/filter-pills.hbs +22 -0
  280. package/addon/components/radar/filter-pills.js +3 -0
  281. package/addon/components/radar/handover-card.hbs +62 -0
  282. package/addon/components/radar/handover-card.js +14 -0
  283. package/addon/components/radar/header.hbs +28 -0
  284. package/addon/components/radar/header.js +12 -0
  285. package/addon/components/radar/item-drawer.hbs +92 -0
  286. package/addon/components/radar/item-drawer.js +37 -0
  287. package/addon/components/radar/item-list.hbs +20 -0
  288. package/addon/components/radar/item-list.js +3 -0
  289. package/addon/components/radar/item-row.hbs +90 -0
  290. package/addon/components/radar/item-row.js +43 -0
  291. package/addon/components/radar/keyboard-hints.hbs +8 -0
  292. package/addon/components/radar/keyboard-hints.js +3 -0
  293. package/addon/components/radar/subject.hbs +14 -0
  294. package/addon/components/radar/subject.js +26 -0
  295. package/addon/components/radar/view-bar.hbs +27 -0
  296. package/addon/components/radar/view-bar.js +16 -0
  297. package/addon/components/recurring-order-schedule/pill.hbs +24 -0
  298. package/addon/components/recurring-order-schedule/summary.hbs +1 -0
  299. package/addon/components/resource-activity.hbs +1 -0
  300. package/addon/components/resource-activity.js +4 -0
  301. package/addon/components/route/pill.hbs +24 -0
  302. package/addon/components/route/summary.hbs +1 -0
  303. package/addon/components/select-option/asset-connection.hbs +12 -0
  304. package/addon/components/select-option/asset.hbs +12 -0
  305. package/addon/components/select-option/attachable.hbs +12 -0
  306. package/addon/components/select-option/contact.hbs +12 -0
  307. package/addon/components/select-option/customer.hbs +12 -0
  308. package/addon/components/select-option/device-event.hbs +12 -0
  309. package/addon/components/select-option/device.hbs +12 -0
  310. package/addon/components/select-option/driver.hbs +12 -0
  311. package/addon/components/select-option/entity.hbs +12 -0
  312. package/addon/components/select-option/equipment.hbs +12 -0
  313. package/addon/components/select-option/facilitator.hbs +12 -0
  314. package/addon/components/select-option/fleet-driver.hbs +12 -0
  315. package/addon/components/select-option/fleet.hbs +12 -0
  316. package/addon/components/select-option/fuel-provider-connection.hbs +12 -0
  317. package/addon/components/select-option/fuel-provider-transaction.hbs +12 -0
  318. package/addon/components/select-option/fuel-report.hbs +12 -0
  319. package/addon/components/select-option/inspection-form.hbs +12 -0
  320. package/addon/components/select-option/inspection-item-result.hbs +12 -0
  321. package/addon/components/select-option/inspection-submission.hbs +12 -0
  322. package/addon/components/select-option/integrated-vendor.hbs +12 -0
  323. package/addon/components/select-option/issue.hbs +12 -0
  324. package/addon/components/select-option/maintenance-schedule.hbs +12 -0
  325. package/addon/components/select-option/maintenance-subject.hbs +12 -0
  326. package/addon/components/select-option/maintenance.hbs +12 -0
  327. package/addon/components/select-option/manifest-stop.hbs +12 -0
  328. package/addon/components/select-option/manifest.hbs +12 -0
  329. package/addon/components/select-option/order-config.hbs +12 -0
  330. package/addon/components/select-option/order.hbs +12 -0
  331. package/addon/components/select-option/part.hbs +12 -0
  332. package/addon/components/select-option/payload.hbs +12 -0
  333. package/addon/components/select-option/place.hbs +12 -0
  334. package/addon/components/select-option/position.hbs +12 -0
  335. package/addon/components/select-option/purchase-rate.hbs +12 -0
  336. package/addon/components/select-option/recurring-order-schedule.hbs +12 -0
  337. package/addon/components/select-option/route.hbs +12 -0
  338. package/addon/components/select-option/sensor.hbs +12 -0
  339. package/addon/components/select-option/service-area.hbs +12 -0
  340. package/addon/components/select-option/service-quote-item.hbs +12 -0
  341. package/addon/components/select-option/service-quote.hbs +12 -0
  342. package/addon/components/select-option/service-rate-fee.hbs +12 -0
  343. package/addon/components/select-option/service-rate-parcel-fee.hbs +12 -0
  344. package/addon/components/select-option/service-rate.hbs +12 -0
  345. package/addon/components/select-option/telematic.hbs +12 -0
  346. package/addon/components/select-option/trackable.hbs +8 -0
  347. package/addon/components/select-option/tracking-number.hbs +12 -0
  348. package/addon/components/select-option/tracking-status.hbs +12 -0
  349. package/addon/components/select-option/trailer.hbs +12 -0
  350. package/addon/components/select-option/vehicle-device.hbs +12 -0
  351. package/addon/components/select-option/vehicle.hbs +12 -0
  352. package/addon/components/select-option/vendor.hbs +12 -0
  353. package/addon/components/select-option/warranty.hbs +12 -0
  354. package/addon/components/select-option/waypoint.hbs +12 -0
  355. package/addon/components/select-option/work-order.hbs +12 -0
  356. package/addon/components/select-option/zone.hbs +12 -0
  357. package/addon/components/sensor/details.hbs +6 -2
  358. package/addon/components/sensor/form.hbs +6 -17
  359. package/addon/components/sensor/panel-header.hbs +1 -1
  360. package/addon/components/sensor/pill.hbs +24 -0
  361. package/addon/components/sensor/summary.hbs +1 -0
  362. package/addon/components/service-area/details.hbs +1 -20
  363. package/addon/components/service-area/pill.hbs +24 -0
  364. package/addon/components/service-area/summary.hbs +1 -0
  365. package/addon/components/service-quote/pill.hbs +24 -0
  366. package/addon/components/service-quote/summary.hbs +1 -0
  367. package/addon/components/service-quote-item/pill.hbs +24 -0
  368. package/addon/components/service-quote-item/summary.hbs +1 -0
  369. package/addon/components/service-rate/details.hbs +12 -6
  370. package/addon/components/service-rate/form.hbs +10 -8
  371. package/addon/components/service-rate/pill.hbs +24 -0
  372. package/addon/components/service-rate/summary.hbs +1 -0
  373. package/addon/components/service-rate-fee/pill.hbs +24 -0
  374. package/addon/components/service-rate-fee/summary.hbs +1 -0
  375. package/addon/components/service-rate-parcel-fee/pill.hbs +24 -0
  376. package/addon/components/service-rate-parcel-fee/summary.hbs +1 -0
  377. package/addon/components/table/cell/fleet-ops-option.hbs +20 -0
  378. package/addon/components/telematic/details.hbs +4 -1
  379. package/addon/components/telematic/details.js +1 -0
  380. package/addon/components/telematic/form.hbs +6 -1
  381. package/addon/components/telematic/form.js +1 -0
  382. package/addon/components/telematic/pill.hbs +24 -0
  383. package/addon/components/telematic/settings.hbs +6 -1
  384. package/addon/components/telematic/settings.js +1 -0
  385. package/addon/components/telematic/summary.hbs +1 -0
  386. package/addon/components/telematic/telemetry-status.hbs +43 -0
  387. package/addon/components/telematic/telemetry-status.js +95 -0
  388. package/addon/components/tracking-number/pill.hbs +24 -0
  389. package/addon/components/tracking-number/summary.hbs +1 -0
  390. package/addon/components/tracking-status/pill.hbs +24 -0
  391. package/addon/components/tracking-status/summary.hbs +1 -0
  392. package/addon/components/trailer/card.hbs +2 -5
  393. package/addon/components/trailer/details.hbs +11 -5
  394. package/addon/components/trailer/details.js +4 -0
  395. package/addon/components/trailer/form.hbs +6 -3
  396. package/addon/components/trailer/pill.hbs +24 -21
  397. package/addon/components/trailer/summary.hbs +1 -0
  398. package/addon/components/vehicle/card.hbs +4 -8
  399. package/addon/components/vehicle/details/inspections.hbs +49 -0
  400. package/addon/components/vehicle/details/inspections.js +44 -0
  401. package/addon/components/vehicle/details/maintenance-history.hbs +1 -1
  402. package/addon/components/vehicle/details/schedules.hbs +2 -2
  403. package/addon/components/vehicle/details/work-orders.hbs +1 -1
  404. package/addon/components/vehicle/details.hbs +18 -1
  405. package/addon/components/vehicle/form.hbs +2 -1
  406. package/addon/components/vehicle/panel-header.hbs +3 -4
  407. package/addon/components/vehicle/panel-header.js +8 -1
  408. package/addon/components/vehicle/pill.hbs +15 -24
  409. package/addon/components/vehicle/summary.hbs +1 -0
  410. package/addon/components/vehicle-device/pill.hbs +24 -0
  411. package/addon/components/vehicle-device/summary.hbs +1 -0
  412. package/addon/components/vendor/form.hbs +2 -4
  413. package/addon/components/vendor/personnel-manager.hbs +2 -9
  414. package/addon/components/vendor/personnel-tab.hbs +1 -0
  415. package/addon/components/vendor/personnel-tab.js +4 -0
  416. package/addon/components/vendor/pill.hbs +24 -0
  417. package/addon/components/vendor/summary.hbs +1 -0
  418. package/addon/components/warranty/details.hbs +3 -1
  419. package/addon/components/warranty/form.hbs +2 -1
  420. package/addon/components/warranty/pill.hbs +24 -0
  421. package/addon/components/warranty/summary.hbs +1 -0
  422. package/addon/components/waypoint/pill.hbs +24 -0
  423. package/addon/components/waypoint/summary.hbs +1 -0
  424. package/addon/components/widget/radar.hbs +28 -0
  425. package/addon/components/widget/radar.js +44 -0
  426. package/addon/components/work-order/details.hbs +20 -4
  427. package/addon/components/work-order/details.js +64 -1
  428. package/addon/components/work-order/form.hbs +20 -2
  429. package/addon/components/work-order/form.js +10 -10
  430. package/addon/components/work-order/panel-header.hbs +15 -13
  431. package/addon/components/work-order/pill.hbs +24 -0
  432. package/addon/components/work-order/summary.hbs +1 -0
  433. package/addon/components/zone/details.hbs +2 -21
  434. package/addon/components/zone/pill.hbs +24 -0
  435. package/addon/components/zone/summary.hbs +1 -0
  436. package/addon/controllers/connectivity/devices/index/details/sensors.js +4 -0
  437. package/addon/controllers/connectivity/devices/index/details.js +1 -18
  438. package/addon/controllers/connectivity/events/index.js +1 -4
  439. package/addon/controllers/connectivity/fuel-providers/details/index.js +6 -0
  440. package/addon/controllers/connectivity/fuel-providers/details/matching.js +13 -0
  441. package/addon/controllers/connectivity/fuel-providers/details/sync.js +21 -10
  442. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +5 -16
  443. package/addon/controllers/connectivity/fuel-providers/details.js +76 -13
  444. package/addon/controllers/connectivity/fuel-providers/index.js +22 -17
  445. package/addon/controllers/connectivity/sensors/index.js +1 -3
  446. package/addon/controllers/connectivity/telematics/details/events.js +8 -0
  447. package/addon/controllers/connectivity/telematics/details/sensors.js +3 -2
  448. package/addon/controllers/connectivity/telematics/index.js +3 -1
  449. package/addon/controllers/maintenance/inspection-forms/index/details.js +29 -0
  450. package/addon/controllers/maintenance/inspection-forms/index/edit.js +39 -0
  451. package/addon/controllers/maintenance/inspection-forms/index/new.js +48 -0
  452. package/addon/controllers/maintenance/inspection-forms/index.js +90 -0
  453. package/addon/controllers/maintenance/inspection-submissions/index/details.js +53 -0
  454. package/addon/controllers/maintenance/inspection-submissions/index/edit.js +39 -0
  455. package/addon/controllers/maintenance/inspection-submissions/index/new.js +48 -0
  456. package/addon/controllers/maintenance/inspection-submissions/index.js +142 -0
  457. package/addon/controllers/maintenance/maintenances/index.js +6 -2
  458. package/addon/controllers/maintenance/schedules/index/details.js +4 -86
  459. package/addon/controllers/maintenance/schedules/index.js +15 -0
  460. package/addon/controllers/maintenance/work-orders/index.js +19 -1
  461. package/addon/controllers/management/contacts/customers.js +6 -4
  462. package/addon/controllers/management/contacts/index.js +6 -3
  463. package/addon/controllers/management/drivers/index/details.js +1 -66
  464. package/addon/controllers/management/drivers/index.js +9 -34
  465. package/addon/controllers/management/fleets/index/details.js +2 -15
  466. package/addon/controllers/management/fleets/index.js +12 -20
  467. package/addon/controllers/management/fuel-reports/index.js +9 -59
  468. package/addon/controllers/management/fuel-transactions/index/details.js +51 -48
  469. package/addon/controllers/management/fuel-transactions/index.js +32 -32
  470. package/addon/controllers/management/index.js +1367 -49
  471. package/addon/controllers/management/issues/index/details.js +1 -33
  472. package/addon/controllers/management/issues/index.js +10 -59
  473. package/addon/controllers/management/trailers/index/details.js +4 -78
  474. package/addon/controllers/management/trailers/index.js +20 -22
  475. package/addon/controllers/management/vehicles/index/details.js +9 -77
  476. package/addon/controllers/management/vehicles/index.js +50 -72
  477. package/addon/controllers/management/vendors/index.js +6 -3
  478. package/addon/controllers/operations/orders/index.js +38 -11
  479. package/addon/controllers/operations/service-rates/index.js +10 -2
  480. package/addon/controllers/settings/payments/index.js +11 -2
  481. package/addon/extension.js +36 -0
  482. package/addon/helpers/initials.js +6 -0
  483. package/addon/helpers/leaflet-tile-url.js +6 -1
  484. package/addon/instance-initializers/register-fleetops-resource-descriptors.js +29 -0
  485. package/addon/modifiers/inspection-flyout.js +237 -0
  486. package/addon/modifiers/radar-keyboard.js +78 -0
  487. package/addon/modifiers/sync-value.js +26 -0
  488. package/addon/modifiers/when-changed.js +25 -0
  489. package/addon/routes/connectivity/fuel-providers/details/settings.js +5 -2
  490. package/addon/routes/connectivity/fuel-providers/details/sync.js +6 -13
  491. package/addon/routes/connectivity/fuel-providers/details/transactions.js +8 -7
  492. package/addon/routes/connectivity/fuel-providers/details.js +15 -2
  493. package/addon/routes/connectivity/fuel-providers/edit.js +2 -1
  494. package/addon/routes/connectivity/fuel-providers/index.js +5 -0
  495. package/addon/routes/maintenance/inspection-forms/index/details/index.js +3 -0
  496. package/addon/routes/maintenance/inspection-forms/index/details/submissions.js +3 -0
  497. package/addon/routes/maintenance/inspection-forms/index/details.js +18 -0
  498. package/addon/routes/maintenance/inspection-forms/index/edit.js +18 -0
  499. package/addon/routes/maintenance/inspection-forms/index/new.js +3 -0
  500. package/addon/routes/maintenance/inspection-forms/index.js +22 -0
  501. package/addon/routes/maintenance/inspection-forms.js +3 -0
  502. package/addon/routes/maintenance/inspection-submissions/index/details/audit.js +8 -0
  503. package/addon/routes/maintenance/inspection-submissions/index/details/index.js +3 -0
  504. package/addon/routes/maintenance/inspection-submissions/index/details/photos.js +8 -0
  505. package/addon/routes/maintenance/inspection-submissions/index/details.js +18 -0
  506. package/addon/routes/maintenance/inspection-submissions/index/edit.js +18 -0
  507. package/addon/routes/maintenance/inspection-submissions/index/new.js +3 -0
  508. package/addon/routes/maintenance/inspection-submissions/index.js +25 -0
  509. package/addon/routes/maintenance/inspection-submissions.js +3 -0
  510. package/addon/routes/management/fuel-transactions/index/details.js +12 -2
  511. package/addon/routes/management/fuel-transactions/index.js +6 -0
  512. package/addon/routes/management/index.js +17 -1
  513. package/addon/routes/management/vehicles/index/details/inspections.js +3 -0
  514. package/addon/routes/management/vehicles/index.js +2 -2
  515. package/addon/routes.js +24 -0
  516. package/addon/services/contact-actions.js +22 -4
  517. package/addon/services/customer-actions.js +7 -4
  518. package/addon/services/device-actions.js +28 -0
  519. package/addon/services/driver-actions.js +79 -16
  520. package/addon/services/equipment-actions.js +15 -6
  521. package/addon/services/fleet-actions.js +20 -4
  522. package/addon/services/fuel-report-actions.js +7 -7
  523. package/addon/services/inspection-form-actions.js +236 -0
  524. package/addon/services/inspection-submission-actions.js +273 -0
  525. package/addon/services/issue-actions.js +58 -7
  526. package/addon/services/maintenance-actions.js +22 -3
  527. package/addon/services/maintenance-schedule-actions.js +70 -5
  528. package/addon/services/movement-tracker.js +52 -1
  529. package/addon/services/part-actions.js +13 -7
  530. package/addon/services/place-actions.js +8 -7
  531. package/addon/services/service-area-actions.js +27 -4
  532. package/addon/services/trailer-actions.js +60 -7
  533. package/addon/services/vehicle-actions.js +58 -3
  534. package/addon/services/vendor-actions.js +8 -7
  535. package/addon/services/work-order-actions.js +14 -5
  536. package/addon/services/zone-actions.js +27 -4
  537. package/addon/styles/fleetops-engine.css +3621 -75
  538. package/addon/templates/connectivity/devices/index/details/vehicle.hbs +2 -2
  539. package/addon/templates/connectivity/events/details.hbs +2 -2
  540. package/addon/templates/connectivity/fuel-providers/details/index.hbs +65 -35
  541. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +2 -2
  542. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +54 -43
  543. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +10 -5
  544. package/addon/templates/connectivity/fuel-providers/details.hbs +38 -13
  545. package/addon/templates/connectivity/fuel-providers/edit.hbs +1 -0
  546. package/addon/templates/connectivity/fuel-providers/index.hbs +2 -1
  547. package/addon/templates/connectivity/fuel-providers/new.hbs +1 -1
  548. package/addon/templates/connectivity/telematics/details/attachments.hbs +2 -1
  549. package/addon/templates/maintenance/inspection-forms/index/details/index.hbs +1 -0
  550. package/addon/templates/maintenance/inspection-forms/index/details/submissions.hbs +2 -0
  551. package/addon/templates/maintenance/inspection-forms/index/details.hbs +14 -0
  552. package/addon/templates/maintenance/inspection-forms/index/edit.hbs +11 -0
  553. package/addon/templates/maintenance/inspection-forms/index/new.hbs +11 -0
  554. package/addon/templates/maintenance/inspection-forms/index.hbs +28 -0
  555. package/addon/templates/maintenance/inspection-forms.hbs +1 -0
  556. package/addon/templates/maintenance/inspection-submissions/index/details/audit.hbs +1 -0
  557. package/addon/templates/maintenance/inspection-submissions/index/details/index.hbs +1 -0
  558. package/addon/templates/maintenance/inspection-submissions/index/details/photos.hbs +1 -0
  559. package/addon/templates/maintenance/inspection-submissions/index/details.hbs +14 -0
  560. package/addon/templates/maintenance/inspection-submissions/index/edit.hbs +11 -0
  561. package/addon/templates/maintenance/inspection-submissions/index/new.hbs +11 -0
  562. package/addon/templates/maintenance/inspection-submissions/index.hbs +28 -0
  563. package/addon/templates/maintenance/inspection-submissions.hbs +1 -0
  564. package/addon/templates/management/fuel-transactions/index/details.hbs +64 -62
  565. package/addon/templates/management/fuel-transactions/index.hbs +9 -31
  566. package/addon/templates/management/index.hbs +110 -102
  567. package/addon/templates/management/vehicles/index/details/inspections.hbs +2 -0
  568. package/addon/templates/operations/orders/index.hbs +2 -4
  569. package/addon/utils/context-panel.js +34 -0
  570. package/addon/utils/device-table-columns.js +18 -27
  571. package/addon/utils/fleet-ops-options.js +40 -0
  572. package/addon/utils/fuel-integration-format.js +43 -0
  573. package/addon/utils/fuel-transaction.js +115 -0
  574. package/addon/utils/identity-cell-resource.js +56 -0
  575. package/addon/utils/inspection-answers.js +283 -0
  576. package/addon/utils/inspection-field-types.js +74 -0
  577. package/addon/utils/inspection-form-structure.js +161 -0
  578. package/addon/utils/radar.js +212 -0
  579. package/addon/utils/relation-value.js +37 -0
  580. package/addon/utils/resource-descriptors/assets.js +246 -0
  581. package/addon/utils/resource-descriptors/connectivity.js +146 -0
  582. package/addon/utils/resource-descriptors/fuel.js +75 -0
  583. package/addon/utils/resource-descriptors/helpers.js +191 -0
  584. package/addon/utils/resource-descriptors/index.js +35 -0
  585. package/addon/utils/resource-descriptors/maintenance.js +175 -0
  586. package/addon/utils/resource-descriptors/operations.js +215 -0
  587. package/addon/utils/resource-descriptors/people.js +173 -0
  588. package/addon/utils/resource-descriptors/polymorphic.js +123 -0
  589. package/addon/utils/resource-descriptors/sub-records.js +297 -0
  590. package/addon/utils/telemetry-timestamp.js +6 -0
  591. package/app/components/asset/pill.js +1 -0
  592. package/app/components/asset/summary.js +1 -0
  593. package/app/components/asset-connection/pill.js +1 -0
  594. package/app/components/asset-connection/summary.js +1 -0
  595. package/app/components/attachable/pill.js +1 -0
  596. package/app/components/attachable/summary.js +1 -0
  597. package/app/components/cell/asset-connection-identity.js +1 -0
  598. package/app/components/cell/{attached-vehicle.js → asset-identity.js} +1 -1
  599. package/app/components/cell/attachable-identity.js +1 -0
  600. package/app/components/cell/{telematic-device.js → contact-identity.js} +1 -1
  601. package/app/components/cell/customer-identity.js +1 -0
  602. package/app/components/cell/device-event-identity.js +1 -0
  603. package/app/components/cell/entity-identity.js +1 -0
  604. package/app/components/cell/facilitator-identity.js +1 -0
  605. package/app/components/cell/fleet-driver-identity.js +1 -0
  606. package/app/components/cell/fleet-identity.js +1 -0
  607. package/app/components/cell/fuel-provider-connection-identity.js +1 -0
  608. package/app/components/cell/fuel-provider-transaction-identity.js +1 -0
  609. package/app/components/cell/fuel-report-identity.js +1 -0
  610. package/app/components/cell/inspection-form-identity.js +1 -0
  611. package/app/components/cell/inspection-item-result-identity.js +1 -0
  612. package/app/components/cell/inspection-submission-identity.js +1 -0
  613. package/app/components/cell/integrated-vendor-identity.js +1 -0
  614. package/app/components/cell/issue-identity.js +1 -0
  615. package/app/components/cell/maintenance-identity.js +1 -0
  616. package/app/components/cell/maintenance-schedule-identity.js +1 -0
  617. package/app/components/cell/maintenance-subject-identity.js +1 -0
  618. package/app/components/cell/manifest-identity.js +1 -0
  619. package/app/components/cell/manifest-stop-identity.js +1 -0
  620. package/app/components/cell/order-config-identity.js +1 -0
  621. package/app/components/cell/order-identity.js +1 -0
  622. package/app/components/cell/payload-identity.js +1 -0
  623. package/app/components/cell/place-identity.js +1 -0
  624. package/app/components/cell/position-identity.js +1 -0
  625. package/app/components/cell/purchase-rate-identity.js +1 -0
  626. package/app/components/cell/recurring-order-schedule-identity.js +1 -0
  627. package/app/components/cell/resource-list.js +1 -0
  628. package/app/components/cell/route-identity.js +1 -0
  629. package/app/components/cell/sensor-identity.js +1 -0
  630. package/app/components/cell/service-area-identity.js +1 -0
  631. package/app/components/cell/service-quote-identity.js +1 -0
  632. package/app/components/cell/service-quote-item-identity.js +1 -0
  633. package/app/components/cell/service-rate-fee-identity.js +1 -0
  634. package/app/components/cell/service-rate-identity.js +1 -0
  635. package/app/components/cell/service-rate-parcel-fee-identity.js +1 -0
  636. package/app/components/cell/{telematic-provider.js → telematic-identity.js} +1 -1
  637. package/app/components/cell/tracking-number-identity.js +1 -0
  638. package/app/components/cell/tracking-status-identity.js +1 -0
  639. package/app/components/cell/trailer-identity.js +1 -0
  640. package/app/components/cell/vehicle-device-identity.js +1 -0
  641. package/app/components/cell/vendor-identity.js +1 -0
  642. package/app/components/cell/warranty-identity.js +1 -0
  643. package/app/components/cell/waypoint-identity.js +1 -0
  644. package/app/components/cell/work-order-identity.js +1 -0
  645. package/app/components/cell/zone-identity.js +1 -0
  646. package/app/components/{cell/driver-name.js → contact/pill.js} +1 -1
  647. package/app/components/{cell/vehicle-name.js → contact/summary.js} +1 -1
  648. package/app/components/customer/pill.js +1 -0
  649. package/app/components/customer/summary.js +1 -0
  650. package/app/components/device/summary.js +1 -0
  651. package/app/components/device/telemetry.js +1 -0
  652. package/app/components/device-event/pill.js +1 -0
  653. package/app/components/device-event/summary.js +1 -0
  654. package/app/components/driver/summary.js +1 -0
  655. package/app/components/entity/pill.js +1 -0
  656. package/app/components/entity/summary.js +1 -0
  657. package/app/components/equipment/card.js +1 -0
  658. package/app/components/equipment/panel-header.js +1 -0
  659. package/app/components/equipment/summary.js +1 -0
  660. package/app/components/{filter/multi-model.js → facilitator/pill.js} +1 -1
  661. package/app/components/facilitator/summary.js +1 -0
  662. package/app/components/fleet/pill.js +1 -0
  663. package/app/components/fleet/summary.js +1 -0
  664. package/app/components/fleet-driver/pill.js +1 -0
  665. package/app/components/fleet-driver/summary.js +1 -0
  666. package/app/components/fuel-provider-connection/pill.js +1 -0
  667. package/app/components/fuel-provider-connection/summary.js +1 -0
  668. package/app/components/fuel-provider-transaction/pill.js +1 -0
  669. package/app/components/fuel-provider-transaction/summary.js +1 -0
  670. package/app/components/fuel-report/pill.js +1 -0
  671. package/app/components/fuel-report/summary.js +1 -0
  672. package/app/components/fuel-transaction-status.js +1 -0
  673. package/app/components/geofence-map.js +1 -0
  674. package/app/components/inspection-field/form.js +1 -0
  675. package/app/components/inspection-field/input.js +1 -0
  676. package/app/components/inspection-field/value.js +1 -0
  677. package/app/components/inspection-flyout.js +1 -0
  678. package/app/components/inspection-form/builder.js +1 -0
  679. package/app/components/inspection-form/details/submissions.js +1 -0
  680. package/app/components/inspection-form/details.js +1 -0
  681. package/app/components/inspection-form/form.js +1 -0
  682. package/app/components/inspection-form/pill.js +1 -0
  683. package/app/components/inspection-form/summary.js +1 -0
  684. package/app/components/inspection-item-result/pill.js +1 -0
  685. package/app/components/inspection-item-result/summary.js +1 -0
  686. package/app/components/inspection-link/list.js +1 -0
  687. package/app/components/inspection-sheet/group.js +1 -0
  688. package/app/components/inspection-sheet.js +1 -0
  689. package/app/components/inspection-submission/details.js +1 -0
  690. package/app/components/inspection-submission/form.js +1 -0
  691. package/app/components/inspection-submission/photos.js +1 -0
  692. package/app/components/inspection-submission/pill.js +1 -0
  693. package/app/components/inspection-submission/summary.js +1 -0
  694. package/app/components/integrated-vendor/pill.js +1 -0
  695. package/app/components/integrated-vendor/summary.js +1 -0
  696. package/app/components/issue/pill.js +1 -0
  697. package/app/components/issue/summary.js +1 -0
  698. package/app/components/issue/timeline.js +1 -0
  699. package/app/components/layout/fleet-ops-sidebar/operations-monitor.js +1 -0
  700. package/app/components/maintenance/pill.js +1 -0
  701. package/app/components/maintenance/summary.js +1 -0
  702. package/app/components/maintenance-schedule/pill.js +1 -0
  703. package/app/components/maintenance-schedule/summary.js +1 -0
  704. package/app/components/maintenance-schedule/work-orders.js +1 -0
  705. package/app/components/maintenance-subject/pill.js +1 -0
  706. package/app/components/maintenance-subject/summary.js +1 -0
  707. package/app/components/manifest/pill.js +1 -0
  708. package/app/components/manifest/summary.js +1 -0
  709. package/app/components/manifest-stop/pill.js +1 -0
  710. package/app/components/manifest-stop/summary.js +1 -0
  711. package/app/components/modals/fuel-connection-diagnostics.js +1 -0
  712. package/app/components/modals/fuel-transaction-action.js +1 -0
  713. package/app/components/modals/inspection-follow-up.js +1 -0
  714. package/app/components/modals/inspection-link.js +1 -0
  715. package/app/components/modals/radar-notice.js +1 -0
  716. package/app/components/modals/radar-save-view.js +1 -0
  717. package/app/components/modals/radar-select-resource.js +1 -0
  718. package/app/components/modals/radar-send-pin.js +1 -0
  719. package/app/components/order/summary.js +1 -0
  720. package/app/components/order-config/pill.js +1 -0
  721. package/app/components/order-config/summary.js +1 -0
  722. package/app/components/part/card.js +1 -0
  723. package/app/components/part/panel-header.js +1 -0
  724. package/app/components/part/pill.js +1 -0
  725. package/app/components/part/summary.js +1 -0
  726. package/app/components/payload/pill.js +1 -0
  727. package/app/components/payload/summary.js +1 -0
  728. package/app/components/place/pill.js +1 -0
  729. package/app/components/place/summary.js +1 -0
  730. package/app/components/position/pill.js +1 -0
  731. package/app/components/position/summary.js +1 -0
  732. package/app/components/public-inspection.js +1 -0
  733. package/app/components/purchase-rate/pill.js +1 -0
  734. package/app/components/purchase-rate/summary.js +1 -0
  735. package/app/components/radar/agenda/entry.js +1 -0
  736. package/app/components/radar/agenda/lane.js +1 -0
  737. package/app/components/radar/agenda.js +1 -0
  738. package/app/components/radar/briefing.js +1 -0
  739. package/app/components/radar/bulk-bar.js +1 -0
  740. package/app/components/radar/decision-card.js +1 -0
  741. package/app/components/radar/empty-state.js +1 -0
  742. package/app/components/radar/filter-pills.js +1 -0
  743. package/app/components/radar/handover-card.js +1 -0
  744. package/app/components/radar/header.js +1 -0
  745. package/app/components/radar/item-drawer.js +1 -0
  746. package/app/components/radar/item-list.js +1 -0
  747. package/app/components/radar/item-row.js +1 -0
  748. package/app/components/radar/keyboard-hints.js +1 -0
  749. package/app/components/radar/subject.js +1 -0
  750. package/app/components/radar/view-bar.js +1 -0
  751. package/app/components/recurring-order-schedule/pill.js +1 -0
  752. package/app/components/recurring-order-schedule/summary.js +1 -0
  753. package/app/components/resource-activity.js +1 -0
  754. package/app/components/route/pill.js +1 -0
  755. package/app/components/route/summary.js +1 -0
  756. package/app/components/select-option/asset-connection.js +1 -0
  757. package/app/components/select-option/asset.js +1 -0
  758. package/app/components/select-option/attachable.js +1 -0
  759. package/app/components/select-option/contact.js +1 -0
  760. package/app/components/select-option/customer.js +1 -0
  761. package/app/components/select-option/device-event.js +1 -0
  762. package/app/components/select-option/device.js +1 -0
  763. package/app/components/select-option/driver.js +1 -0
  764. package/app/components/select-option/entity.js +1 -0
  765. package/app/components/select-option/equipment.js +1 -0
  766. package/app/components/select-option/facilitator.js +1 -0
  767. package/app/components/select-option/fleet-driver.js +1 -0
  768. package/app/components/select-option/fleet.js +1 -0
  769. package/app/components/select-option/fuel-provider-connection.js +1 -0
  770. package/app/components/select-option/fuel-provider-transaction.js +1 -0
  771. package/app/components/select-option/fuel-report.js +1 -0
  772. package/app/components/select-option/inspection-form.js +1 -0
  773. package/app/components/select-option/inspection-item-result.js +1 -0
  774. package/app/components/select-option/inspection-submission.js +1 -0
  775. package/app/components/select-option/integrated-vendor.js +1 -0
  776. package/app/components/select-option/issue.js +1 -0
  777. package/app/components/select-option/maintenance-schedule.js +1 -0
  778. package/app/components/select-option/maintenance-subject.js +1 -0
  779. package/app/components/select-option/maintenance.js +1 -0
  780. package/app/components/select-option/manifest-stop.js +1 -0
  781. package/app/components/select-option/manifest.js +1 -0
  782. package/app/components/select-option/order-config.js +1 -0
  783. package/app/components/select-option/order.js +1 -0
  784. package/app/components/select-option/part.js +1 -0
  785. package/app/components/select-option/payload.js +1 -0
  786. package/app/components/select-option/place.js +1 -0
  787. package/app/components/select-option/position.js +1 -0
  788. package/app/components/select-option/purchase-rate.js +1 -0
  789. package/app/components/select-option/recurring-order-schedule.js +1 -0
  790. package/app/components/select-option/route.js +1 -0
  791. package/app/components/select-option/sensor.js +1 -0
  792. package/app/components/select-option/service-area.js +1 -0
  793. package/app/components/select-option/service-quote-item.js +1 -0
  794. package/app/components/select-option/service-quote.js +1 -0
  795. package/app/components/select-option/service-rate-fee.js +1 -0
  796. package/app/components/select-option/service-rate-parcel-fee.js +1 -0
  797. package/app/components/select-option/service-rate.js +1 -0
  798. package/app/components/select-option/telematic.js +1 -0
  799. package/app/components/select-option/trackable.js +1 -0
  800. package/app/components/select-option/tracking-number.js +1 -0
  801. package/app/components/select-option/tracking-status.js +1 -0
  802. package/app/components/select-option/trailer.js +1 -0
  803. package/app/components/select-option/vehicle-device.js +1 -0
  804. package/app/components/select-option/vehicle.js +1 -0
  805. package/app/components/select-option/vendor.js +1 -0
  806. package/app/components/select-option/warranty.js +1 -0
  807. package/app/components/select-option/waypoint.js +1 -0
  808. package/app/components/select-option/work-order.js +1 -0
  809. package/app/components/select-option/zone.js +1 -0
  810. package/app/components/sensor/pill.js +1 -0
  811. package/app/components/sensor/summary.js +1 -0
  812. package/app/components/service-area/pill.js +1 -0
  813. package/app/components/service-area/summary.js +1 -0
  814. package/app/components/service-quote/pill.js +1 -0
  815. package/app/components/service-quote/summary.js +1 -0
  816. package/app/components/service-quote-item/pill.js +1 -0
  817. package/app/components/service-quote-item/summary.js +1 -0
  818. package/app/components/service-rate/pill.js +1 -0
  819. package/app/components/service-rate/summary.js +1 -0
  820. package/app/components/service-rate-fee/pill.js +1 -0
  821. package/app/components/service-rate-fee/summary.js +1 -0
  822. package/app/components/service-rate-parcel-fee/pill.js +1 -0
  823. package/app/components/service-rate-parcel-fee/summary.js +1 -0
  824. package/app/components/table/cell/fleet-ops-option.js +1 -0
  825. package/app/components/telematic/pill.js +1 -0
  826. package/app/components/telematic/summary.js +1 -0
  827. package/app/components/telematic/telemetry-status.js +1 -0
  828. package/app/components/tracking-number/pill.js +1 -0
  829. package/app/components/tracking-number/summary.js +1 -0
  830. package/app/components/tracking-status/pill.js +1 -0
  831. package/app/components/tracking-status/summary.js +1 -0
  832. package/app/components/trailer/summary.js +1 -0
  833. package/app/components/vehicle/details/inspections.js +1 -0
  834. package/app/components/vehicle/summary.js +1 -0
  835. package/app/components/vehicle-device/pill.js +1 -0
  836. package/app/components/vehicle-device/summary.js +1 -0
  837. package/app/components/vendor/personnel-tab.js +1 -0
  838. package/app/components/vendor/pill.js +1 -0
  839. package/app/components/vendor/summary.js +1 -0
  840. package/app/components/warranty/pill.js +1 -0
  841. package/app/components/warranty/summary.js +1 -0
  842. package/app/components/waypoint/pill.js +1 -0
  843. package/app/components/waypoint/summary.js +1 -0
  844. package/app/components/widget/radar.js +1 -0
  845. package/app/components/work-order/panel-header.js +1 -0
  846. package/app/components/work-order/pill.js +1 -0
  847. package/app/components/work-order/summary.js +1 -0
  848. package/app/components/zone/pill.js +1 -0
  849. package/app/components/zone/summary.js +1 -0
  850. package/app/controllers/maintenance/inspection-forms/index/details.js +1 -0
  851. package/app/controllers/maintenance/inspection-forms/index/edit.js +1 -0
  852. package/app/controllers/maintenance/inspection-forms/index/new.js +1 -0
  853. package/app/controllers/maintenance/inspection-forms/index.js +1 -0
  854. package/app/controllers/maintenance/inspection-submissions/index/details.js +1 -0
  855. package/app/controllers/maintenance/inspection-submissions/index/edit.js +1 -0
  856. package/app/controllers/maintenance/inspection-submissions/index/new.js +1 -0
  857. package/app/controllers/maintenance/inspection-submissions/index.js +1 -0
  858. package/app/helpers/initials.js +1 -0
  859. package/app/modifiers/inspection-flyout.js +1 -0
  860. package/app/modifiers/radar-keyboard.js +1 -0
  861. package/app/modifiers/sync-value.js +1 -0
  862. package/app/modifiers/when-changed.js +1 -0
  863. package/app/routes/maintenance/inspection-forms/index/details/index.js +1 -0
  864. package/app/routes/maintenance/inspection-forms/index/details/submissions.js +1 -0
  865. package/app/routes/maintenance/inspection-forms/index/details.js +1 -0
  866. package/app/routes/maintenance/inspection-forms/index/edit.js +1 -0
  867. package/app/routes/maintenance/inspection-forms/index/new.js +1 -0
  868. package/app/routes/maintenance/inspection-forms/index.js +1 -0
  869. package/app/routes/maintenance/inspection-forms.js +1 -0
  870. package/app/routes/maintenance/inspection-submissions/index/details/audit.js +1 -0
  871. package/app/routes/maintenance/inspection-submissions/index/details/index.js +1 -0
  872. package/app/routes/maintenance/inspection-submissions/index/details/photos.js +1 -0
  873. package/app/routes/maintenance/inspection-submissions/index/details.js +1 -0
  874. package/app/routes/maintenance/inspection-submissions/index/edit.js +1 -0
  875. package/app/routes/maintenance/inspection-submissions/index/new.js +1 -0
  876. package/app/routes/maintenance/inspection-submissions/index.js +1 -0
  877. package/app/routes/maintenance/inspection-submissions.js +1 -0
  878. package/app/routes/management/vehicles/index/details/inspections.js +1 -0
  879. package/app/services/inspection-form-actions.js +1 -0
  880. package/app/services/inspection-submission-actions.js +1 -0
  881. package/app/templates/maintenance/inspection-forms/index/details/index.js +1 -0
  882. package/app/templates/maintenance/inspection-forms/index/details/submissions.js +1 -0
  883. package/app/templates/maintenance/inspection-forms/index/details.js +1 -0
  884. package/app/templates/maintenance/inspection-forms/index/edit.js +1 -0
  885. package/app/templates/maintenance/inspection-forms/index/new.js +1 -0
  886. package/app/templates/maintenance/inspection-forms/index.js +1 -0
  887. package/app/templates/maintenance/inspection-forms.js +1 -0
  888. package/app/templates/maintenance/inspection-submissions/index/details/audit.js +1 -0
  889. package/app/templates/maintenance/inspection-submissions/index/details/index.js +1 -0
  890. package/app/templates/maintenance/inspection-submissions/index/details/photos.js +1 -0
  891. package/app/templates/maintenance/inspection-submissions/index/details.js +1 -0
  892. package/app/templates/maintenance/inspection-submissions/index/edit.js +1 -0
  893. package/app/templates/maintenance/inspection-submissions/index/new.js +1 -0
  894. package/app/templates/maintenance/inspection-submissions/index.js +1 -0
  895. package/app/templates/maintenance/inspection-submissions.js +1 -0
  896. package/app/templates/management/vehicles/index/details/inspections.js +1 -0
  897. package/app/utils/inspection-field-types.js +2 -0
  898. package/app/utils/inspection-form-structure.js +1 -0
  899. package/app/utils/radar.js +1 -0
  900. package/composer.json +1 -1
  901. package/docs/AFAQY.md +91 -0
  902. package/docs/TELEMETRY_ARCHITECTURE.md +115 -0
  903. package/extension.json +1 -1
  904. package/package.json +3 -3
  905. package/scripts/coverage-summary.php +11 -0
  906. package/scripts/pest-bootstrap.php +1 -1
  907. package/server/config/afaqy.php +8 -0
  908. package/server/config/fuel-providers.php +28 -7
  909. package/server/config/telematics.php +8 -1
  910. package/server/config/telemetry.php +17 -0
  911. package/server/migrations/2026_09_09_000001_create_inspection_tables.php +152 -0
  912. package/server/migrations/2026_09_10_000001_convert_inspection_form_items_to_field_groups.php +44 -0
  913. package/server/migrations/2026_09_10_000002_add_token_to_inspection_links.php +39 -0
  914. package/server/migrations/2026_09_11_000001_add_assignee_and_pin_to_inspection_links.php +39 -0
  915. package/server/migrations/2026_09_15_000001_create_telematic_telemetry_tables.php +62 -0
  916. package/server/migrations/2026_09_15_000002_scope_fuel_transactions_to_connection.php +25 -0
  917. package/server/migrations/2026_09_16_000001_add_public_id_to_alerts_table.php +45 -0
  918. package/server/resources/views/mail/inspection-link-pin.blade.php +34 -0
  919. package/server/src/Auth/Schemas/FleetOps.php +12 -0
  920. package/server/src/Console/Commands/DrainTelematicInbox.php +82 -0
  921. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +4 -1
  922. package/server/src/Console/Commands/SyncTelematics.php +32 -2
  923. package/server/src/Contracts/TelemetryProviderInterface.php +27 -0
  924. package/server/src/Events/DeviceTelemetryUpdated.php +37 -0
  925. package/server/src/Events/VehicleLocationChanged.php +8 -4
  926. package/server/src/Exports/InspectionExport.php +125 -0
  927. package/server/src/Http/Controllers/Api/v1/GeofenceController.php +1 -1
  928. package/server/src/Http/Controllers/Api/v1/InspectionController.php +300 -0
  929. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +40 -8
  930. package/server/src/Http/Controllers/Internal/v1/HubController.php +36 -11
  931. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +326 -0
  932. package/server/src/Http/Controllers/Internal/v1/InspectionSubmissionController.php +229 -0
  933. package/server/src/Http/Controllers/Internal/v1/RadarController.php +1117 -0
  934. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +67 -0
  935. package/server/src/Http/Controllers/Public/PublicInspectionController.php +243 -0
  936. package/server/src/Http/Controllers/TelematicPositionWebhookController.php +60 -0
  937. package/server/src/Http/Controllers/TelematicWebhookController.php +3 -0
  938. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +1 -1
  939. package/server/src/Http/Middleware/ForceJsonResponse.php +25 -0
  940. package/server/src/Http/Resources/v1/InspectionForm.php +153 -0
  941. package/server/src/Http/Resources/v1/InspectionItemResult.php +77 -0
  942. package/server/src/Http/Resources/v1/InspectionLink.php +84 -0
  943. package/server/src/Http/Resources/v1/InspectionSubmission.php +173 -0
  944. package/server/src/Jobs/PollTelematicTelemetry.php +118 -0
  945. package/server/src/Jobs/ProcessTelematicDelivery.php +122 -0
  946. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +21 -4
  947. package/server/src/Mail/InspectionLinkPinMail.php +57 -0
  948. package/server/src/Models/Driver.php +8 -2
  949. package/server/src/Models/FuelProviderTransaction.php +1 -0
  950. package/server/src/Models/InspectionForm.php +240 -0
  951. package/server/src/Models/InspectionItemResult.php +90 -0
  952. package/server/src/Models/InspectionLink.php +284 -0
  953. package/server/src/Models/InspectionSubmission.php +440 -0
  954. package/server/src/Models/Part.php +9 -2
  955. package/server/src/Models/WorkOrder.php +3 -0
  956. package/server/src/Observers/WorkOrderObserver.php +1 -1
  957. package/server/src/Providers/FleetOpsServiceProvider.php +9 -0
  958. package/server/src/Rules/Base64OrUrl.php +54 -0
  959. package/server/src/Support/FuelProviders/FuelProviderService.php +64 -27
  960. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +81 -15
  961. package/server/src/Support/InspectionFileStore.php +268 -0
  962. package/server/src/Support/InspectionFormSync.php +231 -0
  963. package/server/src/Support/InspectionLinkPin.php +150 -0
  964. package/server/src/Support/InspectionSubmitter.php +297 -0
  965. package/server/src/Support/Radar/RadarAgenda.php +375 -0
  966. package/server/src/Support/Radar/RadarBriefing.php +504 -0
  967. package/server/src/Support/Radar/RadarItemState.php +435 -0
  968. package/server/src/Support/Radar/RadarRules.php +1424 -0
  969. package/server/src/Support/Reporting/FleetOpsReportSchema.php +178 -0
  970. package/server/src/Support/Telematics/Afaqy/Payload.php +49 -0
  971. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +179 -61
  972. package/server/src/Support/Telematics/TelematicService.php +37 -6
  973. package/server/src/Support/Telematics/Telemetry/Configuration.php +30 -0
  974. package/server/src/Support/Telematics/Telemetry/Inbox.php +61 -0
  975. package/server/src/Support/Telematics/Telemetry/Ingestor.php +112 -0
  976. package/server/src/Support/Telematics/Telemetry/Queue.php +28 -0
  977. package/server/src/Support/Telematics/Telemetry/Sample.php +54 -0
  978. package/server/src/routes.php +76 -0
  979. package/server/tests/ApiManifestControllerContractsTest.php +9 -9
  980. package/server/tests/ControllerFilterContractsTest.php +1 -1
  981. package/server/tests/EventContractsTest.php +2 -1
  982. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +792 -0
  983. package/server/tests/Feature/Http/Api/GeofenceControllerContractsTest.php +4 -4
  984. package/server/tests/Feature/Http/Api/TrailerControllerLifecycleTest.php +1 -1
  985. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +1 -1
  986. package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +1 -1
  987. package/server/tests/Feature/Http/Internal/HubControllerTest.php +28 -2
  988. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +1 -1
  989. package/server/tests/Feature/Http/Internal/RadarControllerDatabaseTest.php +415 -0
  990. package/server/tests/Feature/Http/Internal/RadarControllerTest.php +594 -0
  991. package/server/tests/FuelProviderConnectionControllerContractsTest.php +83 -3
  992. package/server/tests/FuelProviderImplementationTest.php +10 -2
  993. package/server/tests/HubAndGettingStartedContractsTest.php +26 -3
  994. package/server/tests/InspectionControllerContractsTest.php +1329 -0
  995. package/server/tests/InspectionFieldContractsTest.php +1019 -0
  996. package/server/tests/InspectionModelContractsTest.php +728 -0
  997. package/server/tests/InspectionSubmitterRulesTest.php +47 -0
  998. package/server/tests/ObserverContractsTest.php +1 -1
  999. package/server/tests/QueueJobContractsTest.php +3 -4
  1000. package/server/tests/RadarRoutesTest.php +35 -0
  1001. package/server/tests/ReportSchemaContractsTest.php +15 -1
  1002. package/server/tests/RouteRegistrationExecutionTest.php +109 -18
  1003. package/server/tests/Support/AfaqyTestCrypto.php +27 -0
  1004. package/server/tests/Support/ExampleTelemetryProvider.php +82 -0
  1005. package/server/tests/Support/TelemetryTestEnvironment.php +53 -0
  1006. package/server/tests/TelematicsHardeningTest.php +17 -17
  1007. package/server/tests/TrailerSupportCoverageTest.php +1 -1
  1008. package/server/tests/Unit/Http/Resources/ManifestResourceTest.php +3 -3
  1009. package/server/tests/Unit/Support/FuelProviderServiceMatchingTest.php +127 -0
  1010. package/server/tests/Unit/Support/PetroAppFuelProviderTest.php +126 -1
  1011. package/server/tests/Unit/Support/RadarAgendaTest.php +200 -0
  1012. package/server/tests/Unit/Support/RadarBriefingTest.php +214 -0
  1013. package/server/tests/Unit/Support/RadarItemStateTest.php +260 -0
  1014. package/server/tests/Unit/Support/RadarRulesTest.php +523 -0
  1015. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTest.php +9 -1
  1016. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTransportTest.php +8 -0
  1017. package/server/tests/Unit/Support/Telematics/Providers/AfaqyRealtimeContractTest.php +188 -0
  1018. package/server/tests/Unit/Support/Telematics/TelematicServiceTelemetryTest.php +1 -0
  1019. package/translations/ar-ae.yml +3 -1
  1020. package/translations/bg-bg.yaml +3 -1
  1021. package/translations/en-us.yaml +738 -15
  1022. package/translations/es-pa.yaml +3 -1
  1023. package/translations/fr-fr.yaml +3 -1
  1024. package/translations/mn-mn.yaml +3 -1
  1025. package/translations/pt-br.yaml +3 -1
  1026. package/translations/ru-ru.yaml +3 -1
  1027. package/translations/vi-vn.yaml +3 -1
  1028. package/addon/components/cell/attached-vehicle.hbs +0 -10
  1029. package/addon/components/cell/attached-vehicle.js +0 -58
  1030. package/addon/components/cell/device-identity.js +0 -129
  1031. package/addon/components/cell/driver-identity.js +0 -143
  1032. package/addon/components/cell/driver-name.hbs +0 -26
  1033. package/addon/components/cell/driver-name.js +0 -30
  1034. package/addon/components/cell/equipment-identity.js +0 -48
  1035. package/addon/components/cell/part-identity.js +0 -63
  1036. package/addon/components/cell/telematic-device.hbs +0 -38
  1037. package/addon/components/cell/telematic-device.js +0 -44
  1038. package/addon/components/cell/telematic-provider.hbs +0 -33
  1039. package/addon/components/cell/telematic-provider.js +0 -78
  1040. package/addon/components/cell/vehicle-identity.js +0 -138
  1041. package/addon/components/cell/vehicle-name.hbs +0 -23
  1042. package/addon/components/cell/vehicle-name.js +0 -3
  1043. package/addon/components/device/pill.js +0 -3
  1044. package/addon/components/driver/pill.js +0 -7
  1045. package/addon/components/equipment/pill.js +0 -3
  1046. package/addon/components/filter/multi-model.hbs +0 -19
  1047. package/addon/components/filter/multi-model.js +0 -90
  1048. package/addon/components/order/pill.js +0 -3
  1049. package/addon/components/trailer/pill.js +0 -3
  1050. package/addon/components/vehicle/pill.js +0 -7
  1051. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +0 -11
@@ -280,18 +280,6 @@ body[data-theme='dark'] .fleetops-connectivity-kpi-accent-rose .fleetops-connect
280
280
  right: 0.65rem;
281
281
  }
282
282
 
283
- .status-badge.long-offline-status-badge > span,
284
- .status-badge.long_offline-status-badge > span {
285
- background-color: #854d0e;
286
- border-color: #a16207;
287
- color: #fef9c3;
288
- }
289
-
290
- .status-badge.long-offline-status-badge > span svg,
291
- .status-badge.long_offline-status-badge > span svg {
292
- color: #fde047;
293
- }
294
-
295
283
  .fleetops-device-status-badge.status-badge > span {
296
284
  padding: 0 0.25rem !important;
297
285
  border-radius: 0.125rem !important;
@@ -4780,7 +4768,9 @@ body[data-theme='dark'] .order-pool-card.selected,
4780
4768
  background: #263040 !important;
4781
4769
  }
4782
4770
 
4783
- /* ── Driver card ── */
4771
+ /* ── Driver card ──
4772
+ The hover colours were written for the dark orchestrator workbench; the
4773
+ drivers index card shares the class, so light mode gets its own pair. */
4784
4774
  .driver-card {
4785
4775
  cursor: pointer;
4786
4776
  transition:
@@ -4789,6 +4779,12 @@ body[data-theme='dark'] .order-pool-card.selected,
4789
4779
  }
4790
4780
 
4791
4781
  .driver-card:hover {
4782
+ background: #f3f4f6; /* gray-100 */
4783
+ border-color: #d1d5db; /* gray-300 */
4784
+ }
4785
+
4786
+ body[data-theme='dark'] .driver-card:hover,
4787
+ .dark .driver-card:hover {
4792
4788
  background: #263040;
4793
4789
  border-color: #4b5563;
4794
4790
  }
@@ -8535,41 +8531,272 @@ body[data-theme='dark'] .fleetbase-ai-create-order-preview__cancelled {
8535
8531
  }
8536
8532
  }
8537
8533
 
8538
- /* ── Trailer lifecycle, attachment & towing badges ──
8539
- ember-ui's badge palette has no entries for these values, so they would
8540
- otherwise render as unstyled `x-status-badge` elements. Colors follow the
8541
- ember-ui badge.css convention (800 background / 700 border / 100 text). */
8542
- .status-badge.attached-status-badge > span,
8543
- .status-badge.in-use-status-badge > span {
8544
- background-color: #1e40af;
8545
- border-color: #1d4ed8;
8546
- color: #dbeafe;
8534
+ /* ── The follow-up an inspection raises ──
8535
+ What an action will do, previewed before it happens, and what it made,
8536
+ shown afterwards as something you can open rather than a bare id. */
8537
+ .inspection-follow-up__heading {
8538
+ font-size: 0.75rem;
8539
+ font-weight: 600;
8540
+ text-transform: uppercase;
8541
+ letter-spacing: 0.06em;
8542
+ color: #6b7280;
8543
+ margin-bottom: 0.375rem;
8547
8544
  }
8548
8545
 
8549
- .status-badge.attached-status-badge > span svg,
8550
- .status-badge.in-use-status-badge > span svg {
8551
- color: #93c5fd;
8546
+ .inspection-follow-up__list {
8547
+ display: flex;
8548
+ flex-direction: column;
8549
+ gap: 0.25rem;
8550
+ margin: 0;
8551
+ padding: 0;
8552
+ list-style: none;
8553
+ }
8554
+
8555
+ .inspection-follow-up__item {
8556
+ display: flex;
8557
+ align-items: center;
8558
+ gap: 0.5rem;
8559
+ border: 1px solid #e5e7eb;
8560
+ border-radius: 0.375rem;
8561
+ background-color: #f9fafb;
8562
+ padding: 0.375rem 0.5rem;
8563
+ }
8564
+
8565
+ .inspection-follow-up__label {
8566
+ flex: 1 1 auto;
8567
+ min-width: 0;
8568
+ font-size: 0.8125rem;
8569
+ font-weight: 500;
8570
+ }
8571
+
8572
+ .inspection-follow-up__note,
8573
+ .inspection-follow-up__empty {
8574
+ font-size: 0.75rem;
8575
+ color: #6b7280;
8552
8576
  }
8553
8577
 
8554
- .status-badge.detached-status-badge > span,
8555
- .status-badge.retired-status-badge > span {
8578
+ .inspection-follow-up__empty {
8579
+ border: 1px dashed #e5e7eb;
8580
+ border-radius: 0.375rem;
8581
+ padding: 0.625rem 0.75rem;
8582
+ }
8583
+
8584
+ body[data-theme='dark'] .inspection-follow-up__item {
8585
+ border-color: #374151;
8556
8586
  background-color: #1f2937;
8587
+ }
8588
+
8589
+ body[data-theme='dark'] .inspection-follow-up__empty {
8557
8590
  border-color: #374151;
8558
- color: #f3f4f6;
8559
8591
  }
8560
8592
 
8561
- .status-badge.detached-status-badge > span svg,
8562
- .status-badge.retired-status-badge > span svg {
8563
- color: #d1d5db;
8593
+ body[data-theme='dark'] .inspection-follow-up__heading,
8594
+ body[data-theme='dark'] .inspection-follow-up__note,
8595
+ body[data-theme='dark'] .inspection-follow-up__empty {
8596
+ color: #9ca3af;
8597
+ }
8598
+
8599
+ /* The record's own follow-ups: a row that opens what it names. */
8600
+ .inspection-followup {
8601
+ display: flex;
8602
+ flex-direction: column;
8603
+ gap: 0.25rem;
8604
+ width: 100%;
8605
+ border: 1px solid #e5e7eb;
8606
+ border-radius: 0.5rem;
8607
+ background-color: #f9fafb;
8608
+ padding: 0.625rem 0.75rem;
8609
+ text-align: left;
8610
+ cursor: pointer;
8611
+ }
8612
+
8613
+ .inspection-followup:hover {
8614
+ border-color: #9ca3af;
8615
+ }
8616
+
8617
+ .inspection-followup__head {
8618
+ display: flex;
8619
+ align-items: center;
8620
+ gap: 0.5rem;
8621
+ }
8622
+
8623
+ .inspection-followup__kind {
8624
+ font-size: 0.625rem;
8625
+ font-weight: 700;
8626
+ text-transform: uppercase;
8627
+ letter-spacing: 0.06em;
8628
+ color: #6b7280;
8629
+ }
8630
+
8631
+ .inspection-followup__id {
8632
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
8633
+ font-size: 0.6875rem;
8634
+ color: #6b7280;
8635
+ }
8636
+
8637
+ .inspection-followup__open {
8638
+ margin-left: auto;
8639
+ font-size: 0.6875rem;
8640
+ color: #9ca3af;
8641
+ }
8642
+
8643
+ .inspection-followup__title {
8644
+ font-size: 0.8125rem;
8645
+ font-weight: 600;
8646
+ color: #111827;
8647
+ }
8648
+
8649
+ .inspection-followup__meta {
8650
+ display: flex;
8651
+ flex-wrap: wrap;
8652
+ align-items: center;
8653
+ gap: 0.375rem;
8654
+ }
8655
+
8656
+ .inspection-followup__type {
8657
+ font-size: 0.6875rem;
8658
+ color: #6b7280;
8659
+ }
8660
+
8661
+ body[data-theme='dark'] .inspection-followup {
8662
+ border-color: #374151;
8663
+ background-color: #1f2937;
8664
+ }
8665
+
8666
+ body[data-theme='dark'] .inspection-followup:hover {
8667
+ border-color: #6b7280;
8668
+ }
8669
+
8670
+ body[data-theme='dark'] .inspection-followup__title {
8671
+ color: #f9fafb;
8672
+ }
8673
+
8674
+ /* ── A link out of a details panel to the record it names ──
8675
+ The form name was a bare button with no styling and a full-size icon
8676
+ sitting apart from it; it did not read as a link at all. */
8677
+ .field-info-container > .inspection-record__link,
8678
+ .inspection-record__link {
8679
+ display: inline-flex;
8680
+ align-items: center;
8681
+ gap: 0.375rem;
8682
+ color: #3b82f6;
8683
+ cursor: pointer;
8684
+ text-align: left;
8685
+ background: none;
8686
+ border: 0;
8687
+ padding: 0;
8688
+ }
8689
+
8690
+ .field-info-container > .inspection-record__link:hover,
8691
+ .inspection-record__link:hover {
8692
+ color: #2563eb;
8693
+ text-decoration: underline;
8694
+ }
8695
+
8696
+ .inspection-record__link-icon {
8697
+ flex-shrink: 0;
8698
+ opacity: 0.75;
8699
+ }
8700
+
8701
+ body[data-theme='dark'] .field-info-container > .inspection-record__link,
8702
+ body[data-theme='dark'] .inspection-record__link {
8703
+ color: #60a5fa;
8704
+ }
8705
+
8706
+ body[data-theme='dark'] .field-info-container > .inspection-record__link:hover,
8707
+ body[data-theme='dark'] .inspection-record__link:hover {
8708
+ color: #93c5fd;
8709
+ }
8710
+
8711
+ /* ── A vehicle's inspection history ──
8712
+ A table could not survive the overlay's width: six columns squeezed into
8713
+ a 580px panel wrapped the form name onto three lines and pushed the date
8714
+ off the edge behind a scrollbar. One block per inspection instead. */
8715
+ .inspection-history {
8716
+ display: flex;
8717
+ flex-direction: column;
8718
+ gap: 0.5rem;
8719
+ }
8720
+
8721
+ .inspection-history__card {
8722
+ display: flex;
8723
+ flex-direction: column;
8724
+ gap: 0.375rem;
8725
+ width: 100%;
8726
+ border: 1px solid #e5e7eb;
8727
+ border-radius: 0.5rem;
8728
+ background-color: #f9fafb;
8729
+ padding: 0.75rem;
8730
+ text-align: left;
8731
+ cursor: pointer;
8732
+ }
8733
+
8734
+ .inspection-history__card:hover {
8735
+ border-color: #9ca3af;
8736
+ }
8737
+
8738
+ .inspection-history__head {
8739
+ display: flex;
8740
+ flex-wrap: wrap;
8741
+ align-items: center;
8742
+ gap: 0.375rem;
8743
+ }
8744
+
8745
+ .inspection-history__form {
8746
+ flex: 1 1 auto;
8747
+ min-width: 0;
8748
+ font-size: 0.8125rem;
8749
+ font-weight: 600;
8750
+ color: #111827;
8751
+ }
8752
+
8753
+ .inspection-history__meta {
8754
+ display: flex;
8755
+ flex-wrap: wrap;
8756
+ align-items: center;
8757
+ gap: 0.75rem;
8758
+ font-size: 0.6875rem;
8759
+ color: #6b7280;
8760
+ }
8761
+
8762
+ .inspection-history__meta > span {
8763
+ display: inline-flex;
8764
+ align-items: center;
8765
+ gap: 0.25rem;
8766
+ }
8767
+
8768
+ .inspection-history__meta-icon {
8769
+ opacity: 0.7;
8770
+ }
8771
+
8772
+ .inspection-history__failed {
8773
+ color: #b91c1c;
8774
+ font-weight: 500;
8775
+ }
8776
+
8777
+ .inspection-history__id {
8778
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
8779
+ font-size: 0.625rem;
8780
+ color: #9ca3af;
8781
+ overflow: hidden;
8782
+ text-overflow: ellipsis;
8783
+ white-space: nowrap;
8784
+ }
8785
+
8786
+ body[data-theme='dark'] .inspection-history__card {
8787
+ border-color: #374151;
8788
+ background-color: #1f2937;
8564
8789
  }
8565
8790
 
8566
- .status-badge.out-of-service-status-badge > span {
8567
- background-color: #991b1b;
8568
- border-color: #b91c1c;
8569
- color: #fee2e2;
8791
+ body[data-theme='dark'] .inspection-history__card:hover {
8792
+ border-color: #6b7280;
8570
8793
  }
8571
8794
 
8572
- .status-badge.out-of-service-status-badge > span svg {
8795
+ body[data-theme='dark'] .inspection-history__form {
8796
+ color: #f9fafb;
8797
+ }
8798
+
8799
+ body[data-theme='dark'] .inspection-history__failed {
8573
8800
  color: #fca5a5;
8574
8801
  }
8575
8802
 
@@ -8821,65 +9048,3384 @@ body[data-theme='dark'] .fleetops-card-meta-link {
8821
9048
  color: #60a5fa;
8822
9049
  }
8823
9050
 
8824
- /* ── Multi-model table filter (mirrors ember-ui's .filter-multi-input clear button) ── */
8825
- .filter-multi-model {
9051
+ /* ==========================================================================
9052
+ Inspection sheet — "Promotion"
9053
+ --------------------------------------------------------------------------
9054
+ The author's grid survives, but only for fields that stay compact. The
9055
+ moment a field needs room — a pass-fail that failed and now owes a
9056
+ severity, a comment and photos, or a note, upload or signature that never
9057
+ fitted a column — it is promoted out of the grid into a full-width band at
9058
+ the end of its group. Nothing stretches its neighbour, because after
9059
+ promotion it has no neighbour.
9060
+
9061
+ Each group header carries one dot per field, so an inspector can see at a
9062
+ glance what is still open without reading a label.
9063
+
9064
+ Rendered identically by the console's submission form, the read-only
9065
+ record, and the public link a driver opens on a phone.
9066
+ ========================================================================== */
9067
+
9068
+ .inspection-sheet,
9069
+ .inspection-flyout {
9070
+ --ins-bg: #fff;
9071
+ --ins-bg-sunken: #f9fafb;
9072
+ --ins-border: #e5e7eb;
9073
+ --ins-border-strong: #d1d5db;
9074
+ --ins-text: #111827;
9075
+ --ins-text-soft: #374151;
9076
+ --ins-text-muted: #6b7280;
9077
+ --ins-text-faint: #9ca3af;
9078
+ --ins-pass: #16a34a;
9079
+ --ins-pass-text: #15803d;
9080
+ --ins-pass-edge: #bbf7d0;
9081
+ --ins-pass-fill: #f0fdf4;
9082
+ --ins-fail: #dc2626;
9083
+ --ins-fail-text: #b91c1c;
9084
+ --ins-fail-edge: #fecaca;
9085
+ --ins-fail-fill: #fef2f2;
9086
+ --ins-fail-fill-strong: #fee2e2;
9087
+ --ins-fail-field: #fff;
9088
+ --ins-fail-placeholder: #f87171;
9089
+ --ins-fail-ring: rgb(220 38 38 / 22%);
9090
+ --ins-fail-hatch-a: #fecaca;
9091
+ --ins-fail-hatch-b: #fee2e2;
9092
+ --ins-na: #6b7280;
9093
+ --ins-warn: #d97706;
9094
+ --ins-warn-text: #92400e;
9095
+ --ins-warn-strong: #b45309;
9096
+ --ins-hatch-a: #e5e7eb;
9097
+ --ins-hatch-b: #f3f4f6;
9098
+ --ins-mono: ui-monospace, 'IBM Plex Mono', sfmono-regular, menlo, monaco, consolas, monospace;
9099
+ }
9100
+
9101
+ .inspection-sheet {
9102
+ /* The floating flyouts are positioned against the sheet. */
8826
9103
  position: relative;
9104
+ display: flex;
9105
+ flex-direction: column;
9106
+
9107
+ /*
9108
+ * The sheet is measured, not the window. It renders in a ~600px overlay
9109
+ * panel on a wide screen and full width on a phone, so a viewport media
9110
+ * query would collapse the author's columns in exactly the wrong places.
9111
+ */
9112
+ container-type: inline-size;
9113
+ }
9114
+
9115
+ body[data-theme='dark'] .inspection-sheet,
9116
+ body[data-theme='dark'] .inspection-flyout {
9117
+ --ins-bg: #1f2937;
9118
+ --ins-bg-sunken: #1f2937;
9119
+ --ins-border: #374151;
9120
+ --ins-border-strong: #4b5563;
9121
+ --ins-text: #f9fafb;
9122
+ --ins-text-soft: #e5e7eb;
9123
+ --ins-text-muted: #9ca3af;
9124
+ --ins-text-faint: #6b7280;
9125
+ --ins-pass: #16a34a;
9126
+ --ins-pass-text: #86efac;
9127
+ --ins-pass-edge: #2f5a3c;
9128
+ --ins-pass-fill: #1c2e22;
9129
+ --ins-fail: #dc2626;
9130
+ --ins-fail-text: #fca5a5;
9131
+ --ins-fail-edge: #4c2326;
9132
+ --ins-fail-fill: #241b1e;
9133
+ --ins-fail-fill-strong: #3f1d1d;
9134
+ --ins-fail-field: #1b1416;
9135
+ --ins-fail-placeholder: #a86b6e;
9136
+ --ins-fail-ring: rgb(239 68 68 / 28%);
9137
+ --ins-fail-hatch-a: #3b2326;
9138
+ --ins-fail-hatch-b: #2c1b1e;
9139
+ --ins-na: #9ca3af;
9140
+ --ins-warn: #b45309;
9141
+ --ins-warn-text: #fcd34d;
9142
+ --ins-warn-strong: #fbbf24;
9143
+ --ins-hatch-a: #374151;
9144
+ --ins-hatch-b: #2b3644;
9145
+ }
9146
+
9147
+ /* The sheet is one card, not one card per group. */
9148
+ .inspection-sheet__body {
9149
+ border: 1px solid var(--ins-border);
9150
+ border-radius: 0.5rem;
9151
+ background-color: var(--ins-bg);
9152
+ box-shadow: 0 1px 2px rgb(0 0 0 / 6%);
9153
+ overflow: hidden;
8827
9154
  }
8828
9155
 
8829
- .filter-multi-model > .clear-button {
8830
- position: absolute;
8831
- top: 0;
8832
- right: 0;
8833
- padding: 0.5rem 0.75rem 0 0;
8834
- color: #374151;
9156
+ body[data-theme='dark'] .inspection-sheet__body {
9157
+ box-shadow: 0 1px 3px rgb(0 0 0 / 35%);
8835
9158
  }
8836
9159
 
8837
- .filter-multi-model > .clear-button:hover {
8838
- opacity: 0.5;
9160
+ .inspection-sheet__groups {
9161
+ padding: 1rem;
8839
9162
  }
8840
9163
 
8841
- .filter-multi-model > .clear-button:disabled {
8842
- opacity: 0.3;
8843
- cursor: default;
9164
+ /* --- group header ------------------------------------------------------- */
9165
+
9166
+ .inspection-group__header {
9167
+ display: flex;
9168
+ align-items: center;
9169
+ gap: 0.625rem;
9170
+ padding-bottom: 0.5625rem;
9171
+ border-bottom: 1px solid var(--ins-border);
8844
9172
  }
8845
9173
 
8846
- body[data-theme='dark'] .filter-multi-model > .clear-button {
8847
- color: #6b7280;
9174
+ .inspection-group + .inspection-group {
9175
+ margin-top: 1.75rem;
8848
9176
  }
8849
9177
 
8850
- .filter-multi-model > .fleetbase-model-select,
8851
- .filter-multi-model > .fleetbase-model-select > .ember-basic-dropdown,
8852
- .filter-multi-model .ember-power-select-multiple-trigger {
8853
- flex: 1 1 auto;
8854
- width: 100%;
9178
+ .inspection-group__name {
9179
+ font-size: 0.75rem;
9180
+ font-weight: 600;
9181
+ line-height: 1;
9182
+ letter-spacing: 0.08em;
9183
+ text-transform: uppercase;
9184
+ color: var(--ins-text-soft);
8855
9185
  min-width: 0;
8856
9186
  }
8857
9187
 
8858
- /* The small form-input height clips the multiple trigger and turns it into a scroller
8859
- before anything is selected; let it start at the input height and grow with chips. */
8860
- .filter-multi-model .ember-power-select-multiple-trigger {
9188
+ /* One dot per field: what is answered, what failed, what is still open. */
9189
+ .inspection-group__dots {
8861
9190
  display: flex;
8862
9191
  align-items: center;
8863
- height: auto !important;
8864
- min-height: 2.125rem;
8865
- max-height: none !important;
8866
- overflow: visible !important;
8867
- padding-top: 0.125rem;
8868
- padding-bottom: 0.125rem;
8869
- padding-right: 2.5rem;
9192
+ gap: 0.25rem;
9193
+ flex-shrink: 0;
8870
9194
  }
8871
9195
 
8872
- .filter-multi-model .ember-power-select-multiple-options {
8873
- flex: 1 1 auto;
8874
- min-width: 0;
8875
- gap: 0.125rem;
9196
+ .inspection-dot {
9197
+ width: 7px;
9198
+ height: 7px;
9199
+ border-radius: 50%;
9200
+ box-sizing: border-box;
9201
+ background-color: var(--ins-text-faint);
8876
9202
  }
8877
9203
 
8878
- .filter-multi-model .ember-power-select-multiple-option {
8879
- margin: 0.125rem 0.125rem 0.125rem 0;
9204
+ .inspection-dot[data-marker='pass'] {
9205
+ background-color: var(--ins-pass);
8880
9206
  }
8881
9207
 
8882
- .filter-multi-model .ember-power-select-trigger-multiple-input {
8883
- height: 1.625rem;
8884
- min-width: 4rem;
9208
+ .inspection-dot[data-marker='fail'] {
9209
+ background-color: var(--ins-fail);
9210
+ }
9211
+
9212
+ .inspection-dot[data-marker='na'] {
9213
+ background-color: var(--ins-na);
9214
+ }
9215
+
9216
+ .inspection-dot[data-marker='outstanding'] {
9217
+ background-color: var(--ins-warn-strong);
9218
+ }
9219
+
9220
+ .inspection-dot[data-marker='empty'] {
9221
+ background-color: transparent;
9222
+ border: 1px solid var(--ins-text-faint);
9223
+ }
9224
+
9225
+ .inspection-group__meta {
9226
+ margin-left: auto;
9227
+ flex-shrink: 0;
9228
+ font-family: var(--ins-mono);
9229
+ font-size: 0.6875rem;
9230
+ line-height: 1;
9231
+ letter-spacing: 0.02em;
9232
+ text-transform: uppercase;
9233
+ color: var(--ins-text-faint);
9234
+ white-space: nowrap;
9235
+ }
9236
+
9237
+ .inspection-group__meta[data-outstanding='true'] {
9238
+ color: var(--ins-warn-strong);
9239
+ }
9240
+
9241
+ .inspection-group__description {
9242
+ margin: 0.5rem 0 0;
9243
+ font-size: 0.75rem;
9244
+ line-height: 1.45;
9245
+ color: var(--ins-text-muted);
9246
+ }
9247
+
9248
+ .inspection-group__empty {
9249
+ padding: 0.75rem 0;
9250
+ font-size: 0.75rem;
9251
+ color: var(--ins-text-muted);
9252
+ }
9253
+
9254
+ /* --- the author's grid, for fields that stay compact -------------------- */
9255
+
9256
+ .inspection-group__grid {
9257
+ display: grid;
9258
+ gap: 1rem 0.875rem;
9259
+ align-items: start;
9260
+ padding-top: 0.875rem;
9261
+ }
9262
+
9263
+ .inspection-group__grid > .inspection-band {
9264
+ grid-column: 1 / -1;
9265
+ }
9266
+
9267
+ .inspection-group__grid[data-columns='1'] {
9268
+ grid-template-columns: minmax(0, 1fr);
9269
+ }
9270
+
9271
+ .inspection-group__grid[data-columns='2'] {
9272
+ grid-template-columns: repeat(2, minmax(0, 1fr));
9273
+ }
9274
+
9275
+ .inspection-group__grid[data-columns='3'] {
9276
+ grid-template-columns: repeat(3, minmax(0, 1fr));
9277
+ }
9278
+
9279
+ .inspection-group__grid[data-columns='4'] {
9280
+ grid-template-columns: repeat(4, minmax(0, 1fr));
9281
+ }
9282
+
9283
+ /* A narrow sheet cannot hold the wider authored grids. */
9284
+ @container (width <= 660px) {
9285
+ .inspection-group__grid[data-columns='3'],
9286
+ .inspection-group__grid[data-columns='4'] {
9287
+ grid-template-columns: repeat(2, minmax(0, 1fr));
9288
+ }
9289
+ }
9290
+
9291
+ /*
9292
+ * A phone-width sheet stacks every grid. Matched to the `[data-columns]`
9293
+ * rules' specificity: as a bare class it lost to them, and an authored two- or
9294
+ * three-column group stayed in two 160px columns on a phone.
9295
+ */
9296
+ @container (width <= 420px) {
9297
+ .inspection-group__grid[data-columns] {
9298
+ grid-template-columns: minmax(0, 1fr);
9299
+ }
9300
+ }
9301
+
9302
+ /* --- a compact field --------------------------------------------------- */
9303
+
9304
+ .inspection-cell {
9305
+ display: flex;
9306
+ flex-direction: column;
9307
+ gap: 0.5rem;
9308
+ min-width: 0;
9309
+ }
9310
+
9311
+ .inspection-cell__label {
9312
+ font-size: 0.8125rem;
9313
+ font-weight: 600;
9314
+ line-height: 1.3;
9315
+ color: var(--ins-text);
9316
+ }
9317
+
9318
+ .inspection-required {
9319
+ color: var(--ins-fail);
9320
+ margin-left: 0.125rem;
9321
+ }
9322
+
9323
+ .inspection-cell__hint {
9324
+ font-size: 0.75rem;
9325
+ line-height: 1.4;
9326
+ color: var(--ins-text-muted);
9327
+ white-space: pre-wrap;
9328
+ }
9329
+
9330
+ .inspection-cell__control {
9331
+ display: flex;
9332
+ align-items: center;
9333
+ gap: 0.5rem;
9334
+ min-width: 0;
9335
+ width: 100%;
9336
+ }
9337
+
9338
+ .inspection-cell__control > .fleetbase-model-select,
9339
+ .inspection-cell__control > .ember-basic-dropdown {
9340
+ flex: 1 1 auto;
9341
+ min-width: 0;
9342
+ }
9343
+
9344
+ .inspection-unit {
9345
+ flex-shrink: 0;
9346
+ font-family: var(--ins-mono);
9347
+ font-size: 0.75rem;
9348
+ color: var(--ins-text-muted);
9349
+ }
9350
+
9351
+ .inspection-note {
9352
+ font-size: 0.75rem;
9353
+ color: var(--ins-text-faint);
9354
+ }
9355
+
9356
+ /* A required answer that is still missing says so on its own edge. */
9357
+ .inspection-input--outstanding.form-input,
9358
+ .inspection-input--outstanding .ember-power-select-trigger {
9359
+ border-color: var(--ins-warn);
9360
+ }
9361
+
9362
+ /* --- the pass / fail / n-a and severity segmented controls -------------- */
9363
+
9364
+ .inspection-choice {
9365
+ display: flex;
9366
+ align-items: stretch;
9367
+ min-height: 2.25rem;
9368
+ border: 1px solid var(--ins-border);
9369
+ border-radius: 0.375rem;
9370
+ overflow: hidden;
9371
+ flex: 1 1 auto;
9372
+ min-width: 0;
9373
+ }
9374
+
9375
+ /* On a promoted band the control is pushed to the right at its natural size. */
9376
+ .inspection-choice--auto {
9377
+ flex: 0 0 auto;
9378
+ margin-left: auto;
9379
+ }
9380
+
9381
+ .inspection-choice__option {
9382
+ appearance: none;
9383
+ border: 0;
9384
+ background: transparent;
9385
+ flex: 1 1 0;
9386
+ min-width: 0;
9387
+ display: flex;
9388
+ align-items: center;
9389
+ justify-content: center;
9390
+ padding: 0.375rem 0.5rem;
9391
+ font-size: 0.8125rem;
9392
+ font-weight: 500;
9393
+ line-height: 1;
9394
+ color: var(--ins-text-muted);
9395
+ cursor: pointer;
9396
+ white-space: nowrap;
9397
+ transition:
9398
+ background-color 0.12s ease,
9399
+ color 0.12s ease;
9400
+ }
9401
+
9402
+ .inspection-choice--auto .inspection-choice__option {
9403
+ flex: 0 0 auto;
9404
+ padding: 0 0.75rem;
9405
+ }
9406
+
9407
+ .inspection-choice__option + .inspection-choice__option {
9408
+ border-left: 1px solid var(--ins-border);
9409
+ }
9410
+
9411
+ .inspection-choice__option:hover:not(:disabled) {
9412
+ color: var(--ins-text);
9413
+ }
9414
+
9415
+ .inspection-choice__option:focus-visible {
9416
+ outline: 2px solid #2563eb;
9417
+ outline-offset: -2px;
9418
+ }
9419
+
9420
+ .inspection-choice__option:disabled {
9421
+ cursor: not-allowed;
9422
+ opacity: 0.55;
9423
+ }
9424
+
9425
+ .inspection-choice__option[aria-pressed='true'] {
9426
+ font-weight: 600;
9427
+ color: #fff;
9428
+ background-color: var(--ins-na);
9429
+ }
9430
+
9431
+ .inspection-choice__option[aria-pressed='true'][data-answer='pass'] {
9432
+ background-color: var(--ins-pass);
9433
+ }
9434
+
9435
+ .inspection-choice__option[aria-pressed='true'][data-answer='fail'],
9436
+ .inspection-choice__option[aria-pressed='true'][data-answer='severity'] {
9437
+ background-color: var(--ins-fail);
9438
+ }
9439
+
9440
+ /* --- a promoted band ---------------------------------------------------- */
9441
+
9442
+ .inspection-band {
9443
+ border: 1px solid var(--ins-border);
9444
+ border-radius: 0.375rem;
9445
+ overflow: hidden;
9446
+ }
9447
+
9448
+ .inspection-band__head {
9449
+ display: flex;
9450
+ align-items: center;
9451
+ gap: 0.625rem;
9452
+ padding: 0.6875rem 0.75rem;
9453
+ }
9454
+
9455
+ .inspection-band__label {
9456
+ font-size: 0.8125rem;
9457
+ font-weight: 600;
9458
+ line-height: 1.3;
9459
+ color: var(--ins-text);
9460
+ min-width: 0;
9461
+ }
9462
+
9463
+ .inspection-band__aside {
9464
+ margin-left: auto;
9465
+ display: flex;
9466
+ align-items: center;
9467
+ gap: 0.5625rem;
9468
+ flex-shrink: 0;
9469
+ }
9470
+
9471
+ .inspection-band__body {
9472
+ padding: 0.75rem;
9473
+ display: flex;
9474
+ flex-direction: column;
9475
+ gap: 0.625rem;
9476
+ }
9477
+
9478
+ .inspection-band--stacked .inspection-band__body {
9479
+ padding-top: 0;
9480
+ }
9481
+
9482
+ /* A failure keeps the same band, in red, with its own detail below. */
9483
+ .inspection-band--defect {
9484
+ border-color: var(--ins-fail);
9485
+ background-color: var(--ins-fail-fill);
9486
+ }
9487
+
9488
+ .inspection-band--defect .inspection-band__head {
9489
+ border-bottom: 1px solid var(--ins-fail-edge);
9490
+ padding-right: 0.75rem;
9491
+ }
9492
+
9493
+ .inspection-chip {
9494
+ flex-shrink: 0;
9495
+ font-family: var(--ins-mono);
9496
+ font-size: 0.625rem;
9497
+ font-weight: 700;
9498
+ line-height: 1;
9499
+ letter-spacing: 0.06em;
9500
+ text-transform: uppercase;
9501
+ color: var(--ins-fail-text);
9502
+ border: 1px solid var(--ins-fail-edge);
9503
+ border-radius: 0.1875rem;
9504
+ padding: 0.25rem 0.3125rem;
9505
+ }
9506
+
9507
+ .inspection-band--defect .form-input {
9508
+ border-color: var(--ins-fail-edge);
9509
+ background-color: transparent;
9510
+ }
9511
+
9512
+ .inspection-band--defect .form-input:focus {
9513
+ border-color: var(--ins-fail);
9514
+ }
9515
+
9516
+ .inspection-band--defect .inspection-choice,
9517
+ .inspection-band--defect .inspection-slot {
9518
+ border-color: var(--ins-fail-edge);
9519
+ }
9520
+
9521
+ .inspection-defect__row {
9522
+ display: grid;
9523
+ grid-template-columns: minmax(0, 1fr) auto;
9524
+ gap: 0.625rem;
9525
+ align-items: center;
9526
+ }
9527
+
9528
+ @container (width <= 560px) {
9529
+ .inspection-defect__row {
9530
+ grid-template-columns: minmax(0, 1fr);
9531
+ }
9532
+ }
9533
+
9534
+ /* The unsafe switch is a pill, not a bare toggle: it is the gravest thing here. */
9535
+ .inspection-unsafe {
9536
+ display: flex;
9537
+ align-items: center;
9538
+ gap: 0.4375rem;
9539
+ min-height: 2.25rem;
9540
+ padding: 0 0.625rem;
9541
+ border: 1px solid var(--ins-fail);
9542
+ border-radius: 0.375rem;
9543
+ font-size: 0.75rem;
9544
+ font-weight: 600;
9545
+ color: var(--ins-fail-text);
9546
+ white-space: nowrap;
9547
+ }
9548
+
9549
+ .inspection-unsafe[data-on='true'] {
9550
+ background-color: var(--ins-fail-fill-strong);
9551
+ }
9552
+
9553
+ /* --- photo slots -------------------------------------------------------- */
9554
+
9555
+ .inspection-slots {
9556
+ display: flex;
9557
+ flex-wrap: wrap;
9558
+ align-items: center;
9559
+ gap: 0.5rem;
9560
+ }
9561
+
9562
+ .inspection-slot {
9563
+ display: block;
9564
+ position: relative;
9565
+ width: 60px;
9566
+ height: 44px;
9567
+ border-radius: 0.3125rem;
9568
+ border: 1px solid var(--ins-border);
9569
+ overflow: hidden;
9570
+ flex-shrink: 0;
9571
+ background: repeating-linear-gradient(45deg, var(--ins-hatch-a) 0 6px, var(--ins-hatch-b) 6px 12px);
9572
+ }
9573
+
9574
+ .inspection-slot img {
9575
+ display: block;
9576
+ width: 100%;
9577
+ height: 100%;
9578
+ object-fit: cover;
9579
+ }
9580
+
9581
+ .inspection-slot__icon {
9582
+ display: flex;
9583
+ width: 100%;
9584
+ height: 100%;
9585
+ align-items: center;
9586
+ justify-content: center;
9587
+ color: var(--ins-text-faint);
9588
+ }
9589
+
9590
+ .inspection-slot__remove {
9591
+ position: absolute;
9592
+ top: 0;
9593
+ right: 0;
9594
+ }
9595
+
9596
+ /* The empty slot invites the next photo rather than sitting as a button. */
9597
+ .inspection-slot--add {
9598
+ display: flex;
9599
+ align-items: center;
9600
+ justify-content: center;
9601
+ border: 1px dashed var(--ins-border-strong);
9602
+ background: none;
9603
+ cursor: pointer;
9604
+ font-size: 1.125rem;
9605
+ line-height: 1;
9606
+ color: var(--ins-text-faint);
9607
+ padding: 0;
9608
+ text-decoration: none;
9609
+ }
9610
+
9611
+ .inspection-slot--add:hover {
9612
+ color: var(--ins-text);
9613
+ border-color: var(--ins-text-faint);
9614
+ }
9615
+
9616
+ .inspection-slots__note {
9617
+ margin-left: auto;
9618
+ text-align: right;
9619
+ font-family: var(--ins-mono);
9620
+ font-size: 0.6875rem;
9621
+ line-height: 1.4;
9622
+ text-transform: uppercase;
9623
+ color: var(--ins-text-faint);
9624
+ }
9625
+
9626
+ /* --- the foot ----------------------------------------------------------- */
9627
+
9628
+ .inspection-foot {
9629
+ border-top: 1px solid var(--ins-border);
9630
+ background-color: var(--ins-bg-sunken);
9631
+ padding: 1rem;
9632
+ display: flex;
9633
+ flex-direction: column;
9634
+ gap: 0.625rem;
9635
+ }
9636
+
9637
+ .inspection-tallies {
9638
+ display: flex;
9639
+ align-items: stretch;
9640
+ gap: 0.5rem;
9641
+ }
9642
+
9643
+ .inspection-tally {
9644
+ flex: 1 1 0;
9645
+ min-width: 0;
9646
+ background-color: var(--ins-bg);
9647
+ border: 1px solid var(--ins-border);
9648
+ border-left: 3px solid var(--ins-na);
9649
+ border-radius: 0.375rem;
9650
+ padding: 0.625rem 0.75rem;
9651
+ display: flex;
9652
+ flex-direction: column;
9653
+ gap: 0.3125rem;
9654
+ }
9655
+
9656
+ .inspection-tally[data-kind='passed'] {
9657
+ border-left-color: var(--ins-pass);
9658
+ }
9659
+
9660
+ .inspection-tally[data-kind='failed'] {
9661
+ border-left-color: var(--ins-fail);
9662
+ }
9663
+
9664
+ .inspection-tally[data-kind='outstanding'] {
9665
+ border-left-color: var(--ins-warn);
9666
+ }
9667
+
9668
+ .inspection-tally[data-kind='outstanding'][data-any='true'] {
9669
+ border-color: var(--ins-warn);
9670
+ border-left-color: var(--ins-warn);
9671
+ }
9672
+
9673
+ .inspection-tally__value {
9674
+ font-size: 1.25rem;
9675
+ font-weight: 700;
9676
+ line-height: 1;
9677
+ font-variant-numeric: tabular-nums;
9678
+ color: var(--ins-text);
9679
+ }
9680
+
9681
+ .inspection-tally[data-kind='outstanding'][data-any='true'] .inspection-tally__value {
9682
+ color: var(--ins-warn-text);
9683
+ }
9684
+
9685
+ .inspection-tally__label {
9686
+ font-size: 0.6875rem;
9687
+ font-weight: 500;
9688
+ line-height: 1;
9689
+ letter-spacing: 0.06em;
9690
+ text-transform: uppercase;
9691
+ color: var(--ins-text-muted);
9692
+ }
9693
+
9694
+ /*
9695
+ * On a phone, four tallies in a row leave "Outstanding" no room: two by two.
9696
+ * A grid rather than wrapping flex items at half width, which only pairs up
9697
+ * under border-box sizing; with padding added to the basis they stack one high.
9698
+ */
9699
+ @container (width <= 420px) {
9700
+ .inspection-tallies {
9701
+ display: grid;
9702
+ grid-template-columns: repeat(2, minmax(0, 1fr));
9703
+ }
9704
+ }
9705
+
9706
+ .inspection-tally[data-kind='outstanding'][data-any='true'] .inspection-tally__label {
9707
+ color: var(--ins-warn-strong);
9708
+ }
9709
+
9710
+ .inspection-banner {
9711
+ display: flex;
9712
+ align-items: center;
9713
+ gap: 0.625rem;
9714
+ padding: 0.6875rem 0.75rem;
9715
+ border: 1px solid var(--ins-warn);
9716
+ border-radius: 0.375rem;
9717
+ background-color: var(--ins-bg);
9718
+ font-size: 0.75rem;
9719
+ line-height: 1.4;
9720
+ color: var(--ins-warn-text);
9721
+ }
9722
+
9723
+ .inspection-banner--unsafe {
9724
+ border-color: var(--ins-fail);
9725
+ background-color: var(--ins-fail-fill);
9726
+ color: var(--ins-fail-text);
9727
+ }
9728
+
9729
+ body[data-theme='dark'] .inspection-banner--unsafe {
9730
+ background-color: #3f1d1d;
9731
+ }
9732
+
9733
+ .inspection-banner__chip {
9734
+ flex-shrink: 0;
9735
+ font-family: var(--ins-mono);
9736
+ font-size: 0.6875rem;
9737
+ font-weight: 700;
9738
+ line-height: 1;
9739
+ letter-spacing: 0.05em;
9740
+ text-transform: uppercase;
9741
+ color: #fff;
9742
+ background-color: var(--ins-fail);
9743
+ border-radius: 0.25rem;
9744
+ padding: 0.3125rem 0.4375rem;
9745
+ }
9746
+
9747
+ .inspection-banner__jump {
9748
+ appearance: none;
9749
+ border: 0;
9750
+ background: none;
9751
+ margin-left: auto;
9752
+ flex-shrink: 0;
9753
+ padding: 0;
9754
+ font-size: 0.75rem;
9755
+ font-weight: 600;
9756
+ color: inherit;
9757
+ cursor: pointer;
9758
+ white-space: nowrap;
9759
+ }
9760
+
9761
+ .inspection-banner__jump:hover {
9762
+ text-decoration: underline;
9763
+ }
9764
+
9765
+ /* A jumped-to field is held for a moment so the eye can find it. */
9766
+ .inspection-cell--targeted,
9767
+ .inspection-band--targeted {
9768
+ animation: inspection-target 1.6s ease-out;
9769
+ }
9770
+
9771
+ @keyframes inspection-target {
9772
+ 0%,
9773
+ 60% {
9774
+ box-shadow: 0 0 0 2px var(--ins-warn);
9775
+ }
9776
+
9777
+ 100% {
9778
+ box-shadow: 0 0 0 2px transparent;
9779
+ }
9780
+ }
9781
+
9782
+ @media (prefers-reduced-motion: reduce) {
9783
+ .inspection-cell--targeted,
9784
+ .inspection-band--targeted {
9785
+ animation: none;
9786
+ box-shadow: 0 0 0 2px var(--ins-warn);
9787
+ }
9788
+ }
9789
+
9790
+ /*
9791
+ * The sheet sits inside an overlay panel that has its own edge. Without an
9792
+ * inset its borders land on that edge and read as a double rule.
9793
+ */
9794
+ .inspection-sheet-inset {
9795
+ padding: 0.75rem;
9796
+ }
9797
+
9798
+ /* ==========================================================================
9799
+ Inspection links
9800
+ --------------------------------------------------------------------------
9801
+ A generated link used to exist only as a toast. These are the rows that
9802
+ replaced it: one per link, with the link itself, who and what it was for,
9803
+ and whether it still works.
9804
+ ========================================================================== */
9805
+
9806
+ .inspection-link-list {
9807
+ --inspection-border: #e5e7eb;
9808
+ --inspection-surface: #fff;
9809
+ --inspection-surface-sunken: #f9fafb;
9810
+ --inspection-text: #111827;
9811
+ --inspection-text-muted: #6b7280;
9812
+ }
9813
+
9814
+ body[data-theme='dark'] .inspection-link-list {
9815
+ --inspection-border: #374151;
9816
+ --inspection-surface: #1f2937;
9817
+ --inspection-surface-sunken: #1f2937;
9818
+ --inspection-text: #f9fafb;
9819
+ --inspection-text-muted: #9ca3af;
9820
+ }
9821
+
9822
+ .inspection-link-list__empty {
9823
+ padding: 0.75rem;
9824
+ font-size: 0.75rem;
9825
+ color: var(--inspection-text-muted);
9826
+ }
9827
+
9828
+ /* The modal shows the list inside its own bordered block. */
9829
+ .inspection-link-panel {
9830
+ border: 1px solid var(--inspection-border, #e5e7eb);
9831
+ border-radius: 0.5rem;
9832
+ overflow: hidden;
9833
+ }
9834
+
9835
+ body[data-theme='dark'] .inspection-link-panel {
9836
+ border-color: #374151;
9837
+ }
9838
+
9839
+ .inspection-link-panel__header {
9840
+ padding: 0.5rem 0.625rem;
9841
+ border-bottom: 1px solid var(--inspection-border, #e5e7eb);
9842
+ font-size: 0.75rem;
9843
+ font-weight: 600;
9844
+ letter-spacing: 0.08em;
9845
+ text-transform: uppercase;
9846
+ color: #374151;
9847
+ }
9848
+
9849
+ body[data-theme='dark'] .inspection-link-panel__header {
9850
+ border-bottom-color: #374151;
9851
+ color: #e5e7eb;
9852
+ }
9853
+
9854
+ .inspection-link {
9855
+ display: flex;
9856
+ flex-direction: column;
9857
+ gap: 0.375rem;
9858
+ padding: 0.5rem 0.625rem;
9859
+ }
9860
+
9861
+ .inspection-link + .inspection-link {
9862
+ border-top: 1px solid var(--inspection-border);
9863
+ }
9864
+
9865
+ /* A link that can no longer be used recedes rather than disappearing. */
9866
+ .inspection-link:not([data-state='active']) {
9867
+ opacity: 0.6;
9868
+ }
9869
+
9870
+ .inspection-link__head {
9871
+ display: flex;
9872
+ flex-wrap: wrap;
9873
+ align-items: center;
9874
+ gap: 0.5rem;
9875
+ }
9876
+
9877
+ .inspection-link__state {
9878
+ flex-shrink: 0;
9879
+ border-radius: 9999px;
9880
+ padding: 0.125rem 0.5rem;
9881
+ font-size: 0.625rem;
9882
+ font-weight: 700;
9883
+ text-transform: uppercase;
9884
+ letter-spacing: 0.04em;
9885
+ background-color: #e5e7eb;
9886
+ color: #374151;
9887
+ }
9888
+
9889
+ .inspection-link__state[data-state='active'] {
9890
+ background-color: #16a34a;
9891
+ color: #fff;
9892
+ }
9893
+
9894
+ .inspection-link__state[data-state='expired'],
9895
+ .inspection-link__state[data-state='revoked'] {
9896
+ background-color: #dc2626;
9897
+ color: #fff;
9898
+ }
9899
+
9900
+ .inspection-link__state[data-state='used'] {
9901
+ background-color: #2563eb;
9902
+ color: #fff;
9903
+ }
9904
+
9905
+ /* Locked after too many wrong PINs: stopped, but by a guesser, not by anyone here. */
9906
+ .inspection-link__state[data-state='locked'] {
9907
+ background-color: #d97706;
9908
+ color: #fff;
9909
+ }
9910
+
9911
+ .inspection-link__for {
9912
+ font-size: 0.8125rem;
9913
+ font-weight: 600;
9914
+ color: var(--inspection-text);
9915
+ min-width: 0;
9916
+ }
9917
+
9918
+ .inspection-link__when {
9919
+ margin-left: auto;
9920
+ flex-shrink: 0;
9921
+ font-size: 0.6875rem;
9922
+ color: var(--inspection-text-muted);
9923
+ }
9924
+
9925
+ .inspection-link__url {
9926
+ display: flex;
9927
+ align-items: center;
9928
+ gap: 0.375rem;
9929
+ border: 1px solid var(--inspection-border);
9930
+ border-radius: 0.375rem;
9931
+ background-color: var(--inspection-surface);
9932
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 6%);
9933
+ padding: 0.25rem 0.375rem;
9934
+ }
9935
+
9936
+ body[data-theme='dark'] .inspection-link__url {
9937
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 25%);
9938
+ }
9939
+
9940
+ .inspection-link__code {
9941
+ flex: 1 1 auto;
9942
+ min-width: 0;
9943
+ overflow-x: auto;
9944
+ white-space: nowrap;
9945
+ font-size: 0.6875rem;
9946
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
9947
+ color: var(--inspection-text-muted);
9948
+ }
9949
+
9950
+ .inspection-link__note {
9951
+ font-size: 0.6875rem;
9952
+ font-style: italic;
9953
+ color: var(--inspection-text-muted);
9954
+ }
9955
+
9956
+ .inspection-link__foot {
9957
+ display: flex;
9958
+ flex-wrap: wrap;
9959
+ align-items: center;
9960
+ gap: 0.375rem;
9961
+ font-size: 0.6875rem;
9962
+ color: var(--inspection-text-muted);
9963
+ }
9964
+
9965
+ .inspection-link__sep {
9966
+ padding: 0 0.125rem;
9967
+ color: var(--inspection-text-muted);
9968
+ }
9969
+
9970
+ .inspection-link__warn {
9971
+ color: #b45309;
9972
+ }
9973
+
9974
+ body[data-theme='dark'] .inspection-link__warn {
9975
+ color: #fbbf24;
9976
+ }
9977
+
9978
+ /* The PIN that goes with a link, with ways to copy it or send it again. */
9979
+ .inspection-link__pin {
9980
+ display: flex;
9981
+ flex-wrap: wrap;
9982
+ align-items: center;
9983
+ gap: 0.375rem;
9984
+ font-size: 0.6875rem;
9985
+ color: var(--inspection-text-muted);
9986
+ }
9987
+
9988
+ .inspection-link__pin-label {
9989
+ font-size: 0.625rem;
9990
+ font-weight: 700;
9991
+ letter-spacing: 0.06em;
9992
+ text-transform: uppercase;
9993
+ }
9994
+
9995
+ .inspection-link__pin-code {
9996
+ margin-right: 0.25rem;
9997
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
9998
+ font-size: 0.875rem;
9999
+ font-weight: 700;
10000
+ letter-spacing: 0.2em;
10001
+ color: var(--inspection-text, #111827);
10002
+ }
10003
+
10004
+ body[data-theme='dark'] .inspection-link__pin-code {
10005
+ color: #f9fafb;
10006
+ }
10007
+
10008
+ /* The PIN asked for before a public link shows its form: large, spaced, easy to type on a phone. */
10009
+ .public-inspection-pin input.public-inspection-pin__input.form-input {
10010
+ height: auto;
10011
+ padding: 0.625rem 0.75rem;
10012
+ text-align: center;
10013
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
10014
+ font-size: 1.5rem;
10015
+ letter-spacing: 0.5em;
10016
+ text-indent: 0.5em;
10017
+ }
10018
+
10019
+ /* On a phone the submit button spans the page, where a thumb can reach it. */
10020
+ @media (width <= 639px) {
10021
+ .public-inspection-submit__button,
10022
+ .public-inspection-submit__button > button {
10023
+ width: 100%;
10024
+ justify-content: center;
10025
+ }
10026
+ }
10027
+
10028
+ /* A link just generated, shown above the form until the modal closes. */
10029
+ .inspection-link-generated {
10030
+ display: flex;
10031
+ flex-direction: column;
10032
+ gap: 0.5rem;
10033
+ border: 1px solid #bbf7d0;
10034
+ border-radius: 0.5rem;
10035
+ background-color: #f0fdf4;
10036
+ padding: 0.625rem;
10037
+ }
10038
+
10039
+ body[data-theme='dark'] .inspection-link-generated {
10040
+ border-color: #166534;
10041
+ background-color: rgb(22 101 52 / 20%);
10042
+ }
10043
+
10044
+ .inspection-link-generated__title {
10045
+ display: flex;
10046
+ align-items: center;
10047
+ gap: 0.375rem;
10048
+ font-size: 0.8125rem;
10049
+ font-weight: 600;
10050
+ color: #14532d;
10051
+ }
10052
+
10053
+ body[data-theme='dark'] .inspection-link-generated__title {
10054
+ color: #bbf7d0;
10055
+ }
10056
+
10057
+ .inspection-link-generated__help {
10058
+ margin: 0;
10059
+ font-size: 0.6875rem;
10060
+ color: #166534;
10061
+ }
10062
+
10063
+ body[data-theme='dark'] .inspection-link-generated__help {
10064
+ color: #86efac;
10065
+ }
10066
+
10067
+ .inspection-link-generated .inspection-link__url {
10068
+ background-color: #fff;
10069
+ }
10070
+
10071
+ body[data-theme='dark'] .inspection-link-generated .inspection-link__url {
10072
+ background-color: #1f2937;
10073
+ border-color: #374151;
10074
+ }
10075
+
10076
+ /* A stored answer, read back: the same row, with the value where the control was. */
10077
+ .inspection-row__answer {
10078
+ font-size: 0.8125rem;
10079
+ color: var(--inspection-text);
10080
+ }
10081
+
10082
+ /* A stored answer, read back: the value sits where the control was. */
10083
+ .inspection-answer {
10084
+ margin: 0;
10085
+ font-size: 0.8125rem;
10086
+ line-height: 1.5;
10087
+ color: var(--ins-text-soft);
10088
+ white-space: pre-wrap;
10089
+ min-width: 0;
10090
+ }
10091
+
10092
+ /*
10093
+ * A read-back answer keeps the shape of the field it was given in. A cell had
10094
+ * no container at all — a bare label with a value loose beneath it — while a
10095
+ * note or an upload drew a bordered card, so one row read as a card and the
10096
+ * next as stray text. Cells take the same card, quieter than a defect's.
10097
+ */
10098
+ .inspection-cell--readonly {
10099
+ gap: 0.375rem;
10100
+
10101
+ /* Each card is as tall as its own answer: stretched to the row's tallest,
10102
+ a lone chip sat in half a card of empty space. */
10103
+ align-self: start;
10104
+ border: 1px solid var(--ins-border);
10105
+ border-radius: 0.375rem;
10106
+ background-color: var(--ins-bg-sunken);
10107
+ padding: 0.625rem 0.75rem;
10108
+ }
10109
+
10110
+ /*
10111
+ * A pass and a fail are the same card, coloured by the answer. The fail used
10112
+ * to be a band, and a band spans the grid — so one answer ran the full width
10113
+ * while its neighbours sat in columns. It keeps its detail; it just keeps it
10114
+ * in the column the form gave it.
10115
+ */
10116
+ .inspection-cell--result {
10117
+ gap: 0;
10118
+ padding: 0;
10119
+ overflow: hidden;
10120
+ }
10121
+
10122
+ .inspection-cell--result .inspection-cell__head {
10123
+ display: flex;
10124
+ align-items: center;
10125
+ gap: 0.5rem;
10126
+ min-width: 0;
10127
+ padding: 0.5rem 0.625rem;
10128
+ }
10129
+
10130
+ .inspection-cell--result .inspection-cell__label {
10131
+ min-width: 0;
10132
+ overflow-wrap: anywhere;
10133
+ }
10134
+
10135
+ .inspection-cell--result .inspection-cell__body {
10136
+ display: flex;
10137
+ flex-direction: column;
10138
+ gap: 0.5rem;
10139
+ padding: 0 0.625rem 0.5rem;
10140
+ }
10141
+
10142
+ .inspection-cell--result .inspection-cell__meta {
10143
+ display: flex;
10144
+ flex-wrap: wrap;
10145
+ gap: 0.375rem;
10146
+ }
10147
+
10148
+ .inspection-cell--readonly[data-answer='pass'] {
10149
+ border-color: var(--ins-pass-edge);
10150
+ background-color: var(--ins-pass-fill);
10151
+ }
10152
+
10153
+ .inspection-cell--readonly[data-answer='pass'] .inspection-cell__head {
10154
+ border-bottom: 0;
10155
+ }
10156
+
10157
+ .inspection-cell--readonly[data-answer='fail'] {
10158
+ border-color: var(--ins-fail);
10159
+ background-color: var(--ins-fail-fill);
10160
+ }
10161
+
10162
+ .inspection-cell--readonly[data-answer='fail'] .inspection-cell__body {
10163
+ border-top: 1px solid var(--ins-fail-edge);
10164
+ padding-top: 0.5rem;
10165
+ }
10166
+
10167
+ /* The chip takes the answer's colour: red is not the only state. */
10168
+ .inspection-cell--readonly[data-answer='pass'] .inspection-chip {
10169
+ color: var(--ins-pass-text);
10170
+ border-color: var(--ins-pass-edge);
10171
+ }
10172
+
10173
+ .inspection-cell--readonly[data-answer='na'] .inspection-chip {
10174
+ color: var(--ins-text-muted);
10175
+ border-color: var(--ins-border);
10176
+ }
10177
+
10178
+ .inspection-cell--readonly .inspection-cell__label {
10179
+ font-size: 0.75rem;
10180
+ font-weight: 500;
10181
+ letter-spacing: 0.02em;
10182
+ color: var(--ins-text-muted);
10183
+ }
10184
+
10185
+ /* The answer itself is what the eye should land on. */
10186
+ .inspection-cell--readonly .inspection-answer {
10187
+ font-size: 0.875rem;
10188
+ font-weight: 600;
10189
+ color: var(--ins-text);
10190
+ }
10191
+
10192
+ /* ==========================================================================
10193
+ Defect flyout
10194
+ --------------------------------------------------------------------------
10195
+ A failed check keeps its cell. Its severity, unsafe flag, comment and
10196
+ photos open in a panel anchored to that cell, so failing a check can never
10197
+ change the layout of the sheet. Closing it leaves a chip in the cell, and
10198
+ the defects tray at the foot keeps the record.
10199
+ ========================================================================== */
10200
+
10201
+ /* The open field is ringed with an outline, which takes no space: opening a
10202
+ flyout must not move anything either. */
10203
+ .inspection-cell--flyout-open {
10204
+ outline: 2px solid var(--ins-fail);
10205
+ outline-offset: 6px;
10206
+ border-radius: 0.375rem;
10207
+ }
10208
+
10209
+ /* --- the chip a closed failure leaves in its cell ----------------------- */
10210
+
10211
+ .inspection-defect-chip {
10212
+ appearance: none;
10213
+ display: flex;
10214
+ flex-wrap: wrap;
10215
+ align-items: center;
10216
+ gap: 0.375rem 0.5rem;
10217
+ width: 100%;
10218
+ padding: 0.4375rem 0.625rem;
10219
+ border: 1px solid var(--ins-fail-edge);
10220
+ border-left: 3px solid var(--ins-fail);
10221
+ border-radius: 0.375rem;
10222
+ background-color: var(--ins-fail-fill);
10223
+ color: var(--ins-fail-text);
10224
+ font-size: 0.75rem;
10225
+ line-height: 1.3;
10226
+ text-align: left;
10227
+ cursor: pointer;
10228
+ }
10229
+
10230
+ .inspection-defect-chip:hover:not(:disabled) {
10231
+ border-color: var(--ins-fail);
10232
+ }
10233
+
10234
+ .inspection-defect-chip:focus-visible {
10235
+ outline: 2px solid #2563eb;
10236
+ outline-offset: 2px;
10237
+ }
10238
+
10239
+ .inspection-defect-chip:disabled {
10240
+ cursor: default;
10241
+ }
10242
+
10243
+ .inspection-defect-chip.is-incomplete {
10244
+ border-left-color: var(--ins-warn);
10245
+ }
10246
+
10247
+ .inspection-defect-chip__severity {
10248
+ font-size: 0.6875rem;
10249
+ font-weight: 700;
10250
+ letter-spacing: 0.04em;
10251
+ text-transform: uppercase;
10252
+ }
10253
+
10254
+ .inspection-defect-chip__unsafe {
10255
+ font-family: var(--ins-mono);
10256
+ font-size: 0.625rem;
10257
+ font-weight: 700;
10258
+ letter-spacing: 0.05em;
10259
+ text-transform: uppercase;
10260
+ color: #fff;
10261
+ background-color: var(--ins-fail);
10262
+ border-radius: 0.1875rem;
10263
+ padding: 0.1875rem 0.3125rem;
10264
+ }
10265
+
10266
+ .inspection-defect-chip__meta {
10267
+ display: inline-flex;
10268
+ align-items: center;
10269
+ gap: 0.25rem;
10270
+ color: var(--ins-text-muted);
10271
+ }
10272
+
10273
+ .inspection-defect-chip__status {
10274
+ font-weight: 600;
10275
+ color: var(--ins-warn-strong);
10276
+ }
10277
+
10278
+ .inspection-defect-chip__edit {
10279
+ margin-left: auto;
10280
+ color: var(--ins-text-muted);
10281
+ }
10282
+
10283
+ /* --- the flyout -------------------------------------------------------- */
10284
+
10285
+ .inspection-flyout {
10286
+ display: flex;
10287
+ flex-direction: column;
10288
+ background-color: var(--ins-fail-fill);
10289
+ color: var(--ins-text);
10290
+ border: 1px solid var(--ins-fail);
10291
+ border-radius: 0.5rem;
10292
+ box-shadow:
10293
+ 0 12px 32px rgb(0 0 0 / 18%),
10294
+ 0 2px 6px rgb(0 0 0 / 8%);
10295
+ outline: none;
10296
+ }
10297
+
10298
+ body[data-theme='dark'] .inspection-flyout {
10299
+ box-shadow:
10300
+ 0 16px 40px rgb(0 0 0 / 55%),
10301
+ 0 2px 6px rgb(0 0 0 / 30%);
10302
+ }
10303
+
10304
+ .inspection-flyout--floating {
10305
+ position: absolute;
10306
+ z-index: 40;
10307
+ width: min(30rem, calc(100% - 1rem));
10308
+ animation: inspection-flyout-in 0.14s ease-out;
10309
+ }
10310
+
10311
+ .inspection-flyout--floating[data-placement='top'] {
10312
+ animation-name: inspection-flyout-in-above;
10313
+ }
10314
+
10315
+ /*
10316
+ * Room for the reveal's margin at the very end of the page. An absolutely
10317
+ * placed box extends the scroll area, but its margin does not, so without this
10318
+ * a flyout opened below the last field could only ever sit flush against the
10319
+ * bottom edge of the panel.
10320
+ */
10321
+ .inspection-flyout--floating::after {
10322
+ content: '';
10323
+ position: absolute;
10324
+ left: 0;
10325
+ right: 0;
10326
+ bottom: -0.5rem;
10327
+ height: 0.5rem;
10328
+ pointer-events: none;
10329
+ }
10330
+
10331
+ /* A caret points at the Fail button of the field it belongs to. */
10332
+ .inspection-flyout__caret {
10333
+ position: absolute;
10334
+ left: var(--flyout-caret-x, 1.5rem);
10335
+ width: 12px;
10336
+ height: 12px;
10337
+ background-color: var(--ins-fail-fill);
10338
+ border: 1px solid var(--ins-fail);
10339
+ transform: translateX(-50%) rotate(45deg);
10340
+ pointer-events: none;
10341
+ }
10342
+
10343
+ .inspection-flyout[data-placement='bottom'] .inspection-flyout__caret {
10344
+ top: -7px;
10345
+ border-right: 0;
10346
+ border-bottom: 0;
10347
+ }
10348
+
10349
+ .inspection-flyout[data-placement='top'] .inspection-flyout__caret {
10350
+ bottom: -7px;
10351
+ border-top: 0;
10352
+ border-left: 0;
10353
+ }
10354
+
10355
+ .inspection-flyout__head {
10356
+ display: flex;
10357
+ align-items: center;
10358
+ gap: 0.5rem;
10359
+ padding: 0.625rem 0.75rem;
10360
+ border-bottom: 1px solid var(--ins-fail-edge);
10361
+ }
10362
+
10363
+ .inspection-flyout__title {
10364
+ min-width: 0;
10365
+ font-size: 0.8125rem;
10366
+ font-weight: 600;
10367
+ line-height: 1.3;
10368
+ }
10369
+
10370
+ .inspection-flyout__close {
10371
+ appearance: none;
10372
+ border: 0;
10373
+ background: none;
10374
+ margin-left: auto;
10375
+ padding: 0.25rem 0.375rem;
10376
+ border-radius: 0.25rem;
10377
+ color: var(--ins-text-muted);
10378
+ cursor: pointer;
10379
+ }
10380
+
10381
+ .inspection-flyout__close:hover {
10382
+ color: var(--ins-text);
10383
+ }
10384
+
10385
+ .inspection-flyout__close:focus-visible {
10386
+ outline: 2px solid #2563eb;
10387
+ }
10388
+
10389
+ .inspection-flyout__body {
10390
+ display: flex;
10391
+ flex-direction: column;
10392
+ gap: 0.625rem;
10393
+ padding: 0.75rem;
10394
+ overflow-y: auto;
10395
+ }
10396
+
10397
+ .inspection-flyout__foot {
10398
+ display: flex;
10399
+ align-items: center;
10400
+ justify-content: flex-end;
10401
+ gap: 0.75rem;
10402
+ padding: 0.625rem 0.75rem;
10403
+ border-top: 1px solid var(--ins-fail-edge);
10404
+ }
10405
+
10406
+ .inspection-flyout__note {
10407
+ margin-right: auto;
10408
+ font-family: var(--ins-mono);
10409
+ font-size: 0.6875rem;
10410
+ line-height: 1.4;
10411
+ text-transform: uppercase;
10412
+ color: var(--ins-warn-strong);
10413
+ }
10414
+
10415
+ /* Inside a failure, every control takes the failure's colours. */
10416
+ .inspection-flyout .inspection-choice {
10417
+ border-color: var(--ins-fail-edge);
10418
+ }
10419
+
10420
+ .inspection-flyout .inspection-choice__option + .inspection-choice__option {
10421
+ border-left-color: var(--ins-fail-edge);
10422
+ }
10423
+
10424
+ .inspection-flyout .inspection-choice__option:hover:not(:disabled) {
10425
+ background-color: var(--ins-fail-fill-strong);
10426
+ }
10427
+
10428
+ /*
10429
+ * The comment box belongs to the failure. ember-ui styles every console
10430
+ * input with `body[data-theme='dark'] .fleetbase-console .form-input`, which
10431
+ * outranks a plain `.inspection-flyout .form-input` — so an earlier attempt
10432
+ * at this left a grey box inside a red panel. This selector is deliberately
10433
+ * heavier than that rule, and takes its colours from the theme tokens.
10434
+ */
10435
+ html body .inspection-flyout textarea.inspection-defect-comment.form-input {
10436
+ background-color: var(--ins-fail-field);
10437
+ border-color: var(--ins-fail-edge);
10438
+ color: var(--ins-text);
10439
+ box-shadow: none;
10440
+ }
10441
+
10442
+ html body .inspection-flyout textarea.inspection-defect-comment.form-input::placeholder {
10443
+ color: var(--ins-fail-placeholder);
10444
+ }
10445
+
10446
+ html body .inspection-flyout textarea.inspection-defect-comment.form-input:focus {
10447
+ border-color: var(--ins-fail);
10448
+ box-shadow: 0 0 0 3px var(--ins-fail-ring);
10449
+ outline: none;
10450
+ }
10451
+
10452
+ /* Photos sit in the failure too: red hatching, a red-edged slot for the next. */
10453
+ .inspection-flyout .inspection-slot:not(.inspection-slot--add) {
10454
+ border-color: var(--ins-fail-edge);
10455
+ background: repeating-linear-gradient(45deg, var(--ins-fail-hatch-a) 0 6px, var(--ins-fail-hatch-b) 6px 12px);
10456
+ }
10457
+
10458
+ .inspection-flyout .inspection-slot--add {
10459
+ border-color: var(--ins-fail-edge);
10460
+ color: var(--ins-fail-text);
10461
+ }
10462
+
10463
+ .inspection-flyout .inspection-slot--add:hover {
10464
+ border-color: var(--ins-fail);
10465
+ color: var(--ins-fail);
10466
+ }
10467
+
10468
+ /* --- on a phone, the same content as a bottom sheet --------------------- */
10469
+
10470
+ .inspection-flyout--sheet {
10471
+ position: fixed;
10472
+ left: 0;
10473
+ right: 0;
10474
+ bottom: 0;
10475
+ z-index: 1100;
10476
+ max-height: 85vh;
10477
+ border-bottom: 0;
10478
+ border-radius: 0.875rem 0.875rem 0 0;
10479
+ padding-bottom: env(safe-area-inset-bottom);
10480
+ animation: inspection-sheet-in 0.2s ease-out;
10481
+ }
10482
+
10483
+ /* A grab handle, so it reads as something that came up and will go down. */
10484
+ .inspection-flyout--sheet::before {
10485
+ content: '';
10486
+ display: block;
10487
+ width: 2.5rem;
10488
+ height: 0.25rem;
10489
+ margin: 0.5rem auto 0;
10490
+ border-radius: 9999px;
10491
+ background-color: var(--ins-border-strong);
10492
+ }
10493
+
10494
+ .inspection-flyout-backdrop {
10495
+ position: fixed;
10496
+ inset: 0;
10497
+ z-index: 1099;
10498
+ background-color: rgb(0 0 0 / 40%);
10499
+ animation: inspection-fade-in 0.2s ease-out;
10500
+ }
10501
+
10502
+ @keyframes inspection-flyout-in {
10503
+ from {
10504
+ opacity: 0;
10505
+ transform: translateY(-4px);
10506
+ }
10507
+
10508
+ to {
10509
+ opacity: 1;
10510
+ transform: none;
10511
+ }
10512
+ }
10513
+
10514
+ @keyframes inspection-flyout-in-above {
10515
+ from {
10516
+ opacity: 0;
10517
+ transform: translateY(4px);
10518
+ }
10519
+
10520
+ to {
10521
+ opacity: 1;
10522
+ transform: none;
10523
+ }
10524
+ }
10525
+
10526
+ @keyframes inspection-sheet-in {
10527
+ from {
10528
+ transform: translateY(100%);
10529
+ }
10530
+
10531
+ to {
10532
+ transform: none;
10533
+ }
10534
+ }
10535
+
10536
+ @keyframes inspection-fade-in {
10537
+ from {
10538
+ opacity: 0;
10539
+ }
10540
+
10541
+ to {
10542
+ opacity: 1;
10543
+ }
10544
+ }
10545
+
10546
+ @media (prefers-reduced-motion: reduce) {
10547
+ .inspection-flyout,
10548
+ .inspection-flyout-backdrop {
10549
+ animation: none;
10550
+ }
10551
+ }
10552
+
10553
+ /* --- the defects tray -------------------------------------------------- */
10554
+
10555
+ .inspection-tray {
10556
+ border: 1px solid var(--ins-border);
10557
+ border-radius: 0.375rem;
10558
+ background-color: var(--ins-bg);
10559
+ overflow: hidden;
10560
+ }
10561
+
10562
+ .inspection-tray__head {
10563
+ display: flex;
10564
+ align-items: center;
10565
+ gap: 0.5rem;
10566
+ padding: 0.5rem 0.75rem;
10567
+ border-bottom: 1px solid var(--ins-border);
10568
+ font-size: 0.6875rem;
10569
+ font-weight: 700;
10570
+ letter-spacing: 0.08em;
10571
+ text-transform: uppercase;
10572
+ color: var(--ins-text-soft);
10573
+ }
10574
+
10575
+ .inspection-tray__count {
10576
+ min-width: 1.25rem;
10577
+ padding: 0.125rem 0.375rem;
10578
+ border-radius: 9999px;
10579
+ background-color: var(--ins-fail);
10580
+ color: #fff;
10581
+ font-size: 0.625rem;
10582
+ text-align: center;
10583
+ letter-spacing: 0;
10584
+ }
10585
+
10586
+ .inspection-tray__row {
10587
+ appearance: none;
10588
+ border: 0;
10589
+ background: none;
10590
+ width: 100%;
10591
+ display: flex;
10592
+ align-items: center;
10593
+ gap: 0.625rem;
10594
+ padding: 0.625rem 0.75rem;
10595
+ text-align: left;
10596
+ cursor: pointer;
10597
+ color: var(--ins-text);
10598
+ font-size: 0.8125rem;
10599
+ }
10600
+
10601
+ .inspection-tray__row + .inspection-tray__row {
10602
+ border-top: 1px solid var(--ins-border);
10603
+ }
10604
+
10605
+ .inspection-tray__row:hover {
10606
+ background-color: rgb(127 127 127 / 8%);
10607
+ }
10608
+
10609
+ .inspection-tray__row:focus-visible {
10610
+ outline: 2px solid #2563eb;
10611
+ outline-offset: -2px;
10612
+ }
10613
+
10614
+ .inspection-tray__severity {
10615
+ flex-shrink: 0;
10616
+ min-width: 4.25rem;
10617
+ padding: 0.25rem 0.375rem;
10618
+ border: 1px solid var(--ins-fail-edge);
10619
+ border-radius: 0.25rem;
10620
+ font-size: 0.625rem;
10621
+ font-weight: 700;
10622
+ letter-spacing: 0.06em;
10623
+ text-align: center;
10624
+ text-transform: uppercase;
10625
+ color: var(--ins-fail-text);
10626
+ }
10627
+
10628
+ .inspection-tray__severity[data-severity='high'],
10629
+ .inspection-tray__severity[data-severity='critical'] {
10630
+ border-color: var(--ins-fail);
10631
+ background-color: var(--ins-fail);
10632
+ color: #fff;
10633
+ }
10634
+
10635
+ .inspection-tray__label {
10636
+ flex: 1 1 auto;
10637
+ min-width: 0;
10638
+ font-weight: 600;
10639
+ }
10640
+
10641
+ .inspection-tray__evidence {
10642
+ flex-shrink: 0;
10643
+ font-size: 0.75rem;
10644
+ color: var(--ins-text-muted);
10645
+ }
10646
+
10647
+ .inspection-tray__evidence[data-incomplete='true'] {
10648
+ font-weight: 600;
10649
+ color: var(--ins-warn-strong);
10650
+ }
10651
+
10652
+ .inspection-tray__action {
10653
+ flex-shrink: 0;
10654
+ font-size: 0.75rem;
10655
+ font-weight: 600;
10656
+ color: var(--ins-fail-text);
10657
+ }
10658
+
10659
+ @container (width <= 480px) {
10660
+ .inspection-tray__row {
10661
+ flex-wrap: wrap;
10662
+ }
10663
+
10664
+ .inspection-tray__evidence {
10665
+ flex-basis: 100%;
10666
+ order: 5;
10667
+ }
10668
+ }
10669
+
10670
+ /* ==========================================================================
10671
+ Radar — the triage list that replaced the Resources Hub. Sits on the
10672
+ control-hub shell (header band, body width) and adds the pills, tabs,
10673
+ rows and drawer. Light rules first, dark overrides at the end.
10674
+ ========================================================================== */
10675
+
10676
+ .fleet-ops-radar-body {
10677
+ max-width: 88rem;
10678
+ gap: 0.625rem;
10679
+ padding-bottom: 1.25rem;
10680
+ }
10681
+
10682
+ .fleet-ops-radar-header-row {
10683
+ display: flex;
10684
+ flex-wrap: wrap;
10685
+ align-items: center;
10686
+ gap: 0.75rem 1rem;
10687
+ width: 100%;
10688
+ min-width: 0;
10689
+ }
10690
+
10691
+ .fleet-ops-radar-header-summary {
10692
+ font-size: 0.75rem;
10693
+ color: #6b7280;
10694
+ align-self: flex-end;
10695
+ padding-bottom: 0.2rem;
10696
+ }
10697
+
10698
+ .fleet-ops-radar-header-actions {
10699
+ margin-left: auto;
10700
+ display: flex;
10701
+ flex-wrap: wrap;
10702
+ align-items: center;
10703
+ justify-content: flex-end;
10704
+ gap: 0.5rem;
10705
+ }
10706
+
10707
+ /* Every control in the header shares one height. */
10708
+ .fleet-ops-radar-header-actions .btn-wrapper,
10709
+ .fleet-ops-radar-header-actions .btn-wrapper > .btn {
10710
+ height: 2rem;
10711
+ }
10712
+
10713
+ .fleet-ops-radar-header-actions .btn-wrapper > .btn {
10714
+ display: inline-flex;
10715
+ align-items: center;
10716
+ padding-top: 0;
10717
+ padding-bottom: 0;
10718
+ }
10719
+
10720
+ .fleet-ops-radar-search {
10721
+ position: relative;
10722
+ width: 12rem;
10723
+ height: 2rem;
10724
+ }
10725
+
10726
+ .fleet-ops-radar-search svg {
10727
+ position: absolute;
10728
+ left: 0.6rem;
10729
+ top: 50%;
10730
+ transform: translateY(-50%);
10731
+ font-size: 0.7rem;
10732
+ color: #9ca3af;
10733
+ pointer-events: none;
10734
+ }
10735
+
10736
+ /* Beats ember-ui's `input.form-input.form-input-sm` padding so the text clears the icon. */
10737
+ .fleet-ops-radar-search input.form-input.form-input-sm {
10738
+ height: 2rem;
10739
+ padding-left: 1.85rem;
10740
+ padding-right: 1.85rem;
10741
+ }
10742
+
10743
+ .fleet-ops-radar-search kbd {
10744
+ position: absolute;
10745
+ right: 0.45rem;
10746
+ top: 50%;
10747
+ transform: translateY(-50%);
10748
+ }
10749
+
10750
+ .fleet-ops-radar-view-toggle {
10751
+ display: inline-flex;
10752
+ align-items: stretch;
10753
+ box-sizing: border-box;
10754
+ height: 2rem;
10755
+ border: 1px solid #e5e7eb;
10756
+ border-radius: 0.375rem;
10757
+ background: #fff;
10758
+ padding: 2px;
10759
+ gap: 2px;
10760
+ }
10761
+
10762
+ .fleet-ops-radar-view-toggle-button {
10763
+ border: 0;
10764
+ background: transparent;
10765
+ border-radius: 0.25rem;
10766
+ padding: 0 0.6rem;
10767
+ font-size: 0.75rem;
10768
+ font-weight: 600;
10769
+ color: #6b7280;
10770
+ display: inline-flex;
10771
+ align-items: center;
10772
+ gap: 0.35rem;
10773
+ cursor: pointer;
10774
+ }
10775
+
10776
+ .fleet-ops-radar-view-toggle-button.is-active {
10777
+ background: #3485e2;
10778
+ color: #fff;
10779
+ }
10780
+
10781
+ .fleet-ops-radar-sources-warning {
10782
+ display: flex;
10783
+ align-items: center;
10784
+ gap: 0.5rem;
10785
+ border: 1px solid #fde68a;
10786
+ background: #fffbeb;
10787
+ color: #b45309;
10788
+ border-radius: 0.375rem;
10789
+ padding: 0.5rem 0.75rem;
10790
+ font-size: 0.75rem;
10791
+ }
10792
+
10793
+ /* Morning brief: score, category rows, prose, decision cards. */
10794
+ .fleet-ops-radar-briefing {
10795
+ background: #fff;
10796
+ border: 1px solid #e5e7eb;
10797
+ border-radius: 0.5rem;
10798
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
10799
+ padding: 0.75rem 1rem;
10800
+ display: flex;
10801
+ flex-direction: column;
10802
+ gap: 0.75rem;
10803
+ }
10804
+
10805
+ .fleet-ops-radar-briefing-bar {
10806
+ display: flex;
10807
+ flex-wrap: wrap;
10808
+ align-items: center;
10809
+ gap: 0.75rem;
10810
+ }
10811
+
10812
+ .fleet-ops-radar-briefing-toggle {
10813
+ margin-left: auto;
10814
+ border: 0;
10815
+ background: transparent;
10816
+ color: #6b7280;
10817
+ font-size: 0.72rem;
10818
+ font-weight: 600;
10819
+ cursor: pointer;
10820
+ display: inline-flex;
10821
+ align-items: center;
10822
+ gap: 0.35rem;
10823
+ }
10824
+
10825
+ .fleet-ops-radar-briefing-loading {
10826
+ display: flex;
10827
+ justify-content: center;
10828
+ padding: 1rem;
10829
+ }
10830
+
10831
+ .fleet-ops-radar-briefing-grid {
10832
+ display: grid;
10833
+ grid-template-columns: 1fr;
10834
+ gap: 1rem;
10835
+ }
10836
+
10837
+ @media (width >= 1024px) {
10838
+ .fleet-ops-radar-briefing-grid {
10839
+ grid-template-columns: 11rem minmax(0, 1fr);
10840
+ grid-template-areas:
10841
+ 'score categories'
10842
+ 'prose prose'
10843
+ 'decisions decisions';
10844
+ }
10845
+
10846
+ .fleet-ops-radar-briefing-score {
10847
+ grid-area: score;
10848
+ }
10849
+
10850
+ .fleet-ops-radar-briefing-categories {
10851
+ grid-area: categories;
10852
+ }
10853
+
10854
+ .fleet-ops-radar-briefing-prose {
10855
+ grid-area: prose;
10856
+ }
10857
+
10858
+ .fleet-ops-radar-briefing-decisions {
10859
+ grid-area: decisions;
10860
+ }
10861
+ }
10862
+
10863
+ @media (width >= 1280px) {
10864
+ .fleet-ops-radar-briefing-grid {
10865
+ grid-template-columns: 11rem minmax(0, 1fr) minmax(20rem, 26rem);
10866
+ grid-template-areas:
10867
+ 'score categories decisions'
10868
+ 'prose prose decisions';
10869
+ }
10870
+ }
10871
+
10872
+ .fleet-ops-radar-briefing-score-value {
10873
+ display: flex;
10874
+ align-items: baseline;
10875
+ gap: 0.25rem;
10876
+ }
10877
+
10878
+ .fleet-ops-radar-briefing-score-number {
10879
+ font-size: 2.25rem;
10880
+ font-weight: 900;
10881
+ line-height: 1;
10882
+ color: #111827;
10883
+ }
10884
+
10885
+ .fleet-ops-radar-briefing-score-of {
10886
+ font-size: 0.8rem;
10887
+ color: #6b7280;
10888
+ }
10889
+
10890
+ .fleet-ops-radar-briefing-score-delta {
10891
+ margin-top: 0.4rem;
10892
+ }
10893
+
10894
+ .fleet-ops-radar-briefing-categories {
10895
+ display: grid;
10896
+ grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
10897
+ gap: 0.5rem 0.9rem;
10898
+ }
10899
+
10900
+ .fleet-ops-radar-briefing-category {
10901
+ display: flex;
10902
+ flex-direction: column;
10903
+ gap: 0.25rem;
10904
+ font-size: 0.72rem;
10905
+ }
10906
+
10907
+ .fleet-ops-radar-briefing-category-head {
10908
+ display: flex;
10909
+ justify-content: space-between;
10910
+ font-weight: 700;
10911
+ color: #111827;
10912
+ }
10913
+
10914
+ .fleet-ops-radar-briefing-category-score {
10915
+ font-weight: 900;
10916
+ }
10917
+
10918
+ .fleet-ops-radar-briefing-category-bar {
10919
+ height: 6px;
10920
+ border-radius: 3px;
10921
+ background: #f3f4f6;
10922
+ overflow: hidden;
10923
+ }
10924
+
10925
+ .fleet-ops-radar-briefing-category-bar > span {
10926
+ display: block;
10927
+ height: 100%;
10928
+ border-radius: 3px;
10929
+ background: #059669;
10930
+ transition: width 0.3s ease;
10931
+ }
10932
+
10933
+ .fleet-ops-radar-briefing-category-bar > span.is-warn {
10934
+ background: #d97706;
10935
+ }
10936
+
10937
+ .fleet-ops-radar-briefing-category-bar > span.is-bad {
10938
+ background: #e11d48;
10939
+ }
10940
+
10941
+ .fleet-ops-radar-briefing-category-gaps {
10942
+ display: flex;
10943
+ justify-content: space-between;
10944
+ gap: 0.5rem;
10945
+ color: #6b7280;
10946
+ }
10947
+
10948
+ .fleet-ops-radar-briefing-link {
10949
+ border: 0;
10950
+ background: transparent;
10951
+ padding: 0;
10952
+ font: inherit;
10953
+ font-weight: 600;
10954
+ color: #1c6cc7;
10955
+ cursor: pointer;
10956
+ display: inline;
10957
+ }
10958
+
10959
+ .fleet-ops-radar-briefing-link:hover {
10960
+ text-decoration: underline;
10961
+ }
10962
+
10963
+ .fleet-ops-radar-briefing-link:disabled {
10964
+ opacity: 0.5;
10965
+ cursor: default;
10966
+ }
10967
+
10968
+ .fleet-ops-radar-briefing-prose p {
10969
+ margin: 0;
10970
+ font-size: 0.8125rem;
10971
+ line-height: 1.65;
10972
+ color: #374151;
10973
+ text-wrap: pretty;
10974
+ }
10975
+
10976
+ .fleet-ops-radar-briefing-decisions {
10977
+ display: flex;
10978
+ flex-direction: column;
10979
+ gap: 0.5rem;
10980
+ }
10981
+
10982
+ .fleet-ops-radar-briefing-decisions-head {
10983
+ display: flex;
10984
+ justify-content: space-between;
10985
+ align-items: center;
10986
+ }
10987
+
10988
+ .fleet-ops-radar-decision {
10989
+ border: 1px solid #e5e7eb;
10990
+ border-left-width: 3px;
10991
+ border-radius: 0.375rem;
10992
+ padding: 0.6rem 0.75rem;
10993
+ display: flex;
10994
+ flex-direction: column;
10995
+ gap: 0.4rem;
10996
+ background: #fff;
10997
+ }
10998
+
10999
+ .fleet-ops-radar-decision.is-critical {
11000
+ border-left-color: #e11d48;
11001
+ }
11002
+
11003
+ .fleet-ops-radar-decision.is-warning {
11004
+ border-left-color: #d97706;
11005
+ }
11006
+
11007
+ .fleet-ops-radar-decision.is-info {
11008
+ border-left-color: #3485e2;
11009
+ }
11010
+
11011
+ .fleet-ops-radar-decision-head {
11012
+ display: flex;
11013
+ flex-wrap: wrap;
11014
+ align-items: center;
11015
+ gap: 0.4rem;
11016
+ }
11017
+
11018
+ .fleet-ops-radar-decision-title {
11019
+ font-size: 0.8125rem;
11020
+ font-weight: 700;
11021
+ color: #111827;
11022
+ }
11023
+
11024
+ .fleet-ops-radar-decision-reasoning {
11025
+ margin: 0;
11026
+ font-size: 0.75rem;
11027
+ line-height: 1.55;
11028
+ color: #4b5563;
11029
+ }
11030
+
11031
+ .fleet-ops-radar-decision-actions {
11032
+ display: flex;
11033
+ flex-wrap: wrap;
11034
+ align-items: center;
11035
+ gap: 0.4rem;
11036
+ font-size: 0.72rem;
11037
+ }
11038
+
11039
+ .fleet-ops-radar-briefing-strip {
11040
+ display: flex;
11041
+ flex-wrap: wrap;
11042
+ align-items: center;
11043
+ gap: 0.5rem;
11044
+ border: 1px solid #e5e7eb;
11045
+ border-radius: 0.375rem;
11046
+ padding: 0.4rem 0.75rem;
11047
+ font-size: 0.72rem;
11048
+ color: #374151;
11049
+ background: #f9fafb;
11050
+ }
11051
+
11052
+ .fleet-ops-radar-briefing-strip.is-confirmed svg {
11053
+ color: #059669;
11054
+ }
11055
+
11056
+ .fleet-ops-radar-briefing-strip.is-snoozed svg {
11057
+ color: #d97706;
11058
+ }
11059
+
11060
+ .fleet-ops-radar-briefing-strip-label {
11061
+ font-weight: 700;
11062
+ }
11063
+
11064
+ .fleet-ops-radar-briefing-strip-title {
11065
+ color: #6b7280;
11066
+ flex: 1 1 auto;
11067
+ }
11068
+
11069
+ body[data-theme='dark'] .fleet-ops-radar-briefing,
11070
+ body[data-theme='dark'] .fleet-ops-radar-decision {
11071
+ background: #1f2937;
11072
+ border-color: #374151;
11073
+ }
11074
+
11075
+ body[data-theme='dark'] .fleet-ops-radar-briefing-strip {
11076
+ background: #111827;
11077
+ border-color: #374151;
11078
+ color: #d1d5db;
11079
+ }
11080
+
11081
+ body[data-theme='dark'] .fleet-ops-radar-briefing-score-number,
11082
+ body[data-theme='dark'] .fleet-ops-radar-briefing-category-head,
11083
+ body[data-theme='dark'] .fleet-ops-radar-decision-title {
11084
+ color: #f9fafb;
11085
+ }
11086
+
11087
+ body[data-theme='dark'] .fleet-ops-radar-briefing-score-of,
11088
+ body[data-theme='dark'] .fleet-ops-radar-briefing-category-gaps,
11089
+ body[data-theme='dark'] .fleet-ops-radar-briefing-toggle,
11090
+ body[data-theme='dark'] .fleet-ops-radar-briefing-strip-title {
11091
+ color: #9ca3af;
11092
+ }
11093
+
11094
+ body[data-theme='dark'] .fleet-ops-radar-briefing-prose p,
11095
+ body[data-theme='dark'] .fleet-ops-radar-decision-reasoning {
11096
+ color: #d1d5db;
11097
+ }
11098
+
11099
+ body[data-theme='dark'] .fleet-ops-radar-briefing-category-bar {
11100
+ background: #374151;
11101
+ }
11102
+
11103
+ body[data-theme='dark'] .fleet-ops-radar-briefing-link {
11104
+ color: #93c5fd;
11105
+ }
11106
+
11107
+ /* Count pills: the only filter UI. */
11108
+ .fleet-ops-radar-pills {
11109
+ display: flex;
11110
+ flex-wrap: wrap;
11111
+ gap: 0.4rem;
11112
+ }
11113
+
11114
+ .fleet-ops-radar-pill {
11115
+ display: inline-flex;
11116
+ align-items: center;
11117
+ gap: 0.35rem;
11118
+ border: 1px solid #e5e7eb;
11119
+ background: #fff;
11120
+ color: #374151;
11121
+ border-radius: 999px;
11122
+ padding: 0.3rem 0.7rem;
11123
+ font-size: 0.75rem;
11124
+ line-height: 1;
11125
+ cursor: pointer;
11126
+ transition:
11127
+ border-color 0.12s ease,
11128
+ background-color 0.12s ease;
11129
+ }
11130
+
11131
+ .fleet-ops-radar-pill:hover {
11132
+ border-color: #bfdbfe;
11133
+ }
11134
+
11135
+ .fleet-ops-radar-pill.is-active {
11136
+ background: #3485e2;
11137
+ border-color: #3485e2;
11138
+ color: #fff;
11139
+ }
11140
+
11141
+ .fleet-ops-radar-pill.is-empty:not(.is-active) {
11142
+ color: #9ca3af;
11143
+ }
11144
+
11145
+ .fleet-ops-radar-pill-dot {
11146
+ width: 6px;
11147
+ height: 6px;
11148
+ border-radius: 3px;
11149
+ background: #e11d48;
11150
+ }
11151
+
11152
+ .fleet-ops-radar-pill.is-active .fleet-ops-radar-pill-dot {
11153
+ background: #fecdd3;
11154
+ }
11155
+
11156
+ .fleet-ops-radar-pill-count {
11157
+ font-weight: 800;
11158
+ }
11159
+
11160
+ .fleet-ops-radar-pill-clear {
11161
+ font-size: 0.7rem;
11162
+ opacity: 0.7;
11163
+ }
11164
+
11165
+ /* Status tabs and saved views. */
11166
+ .fleet-ops-radar-view-bar {
11167
+ display: flex;
11168
+ align-items: flex-end;
11169
+ gap: 1rem;
11170
+ border-bottom: 1px solid #e5e7eb;
11171
+ }
11172
+
11173
+ .fleet-ops-radar-tabs {
11174
+ display: flex;
11175
+ gap: 1rem;
11176
+ }
11177
+
11178
+ .fleet-ops-radar-tab {
11179
+ border: 0;
11180
+ background: transparent;
11181
+ padding: 0 1px 0.55rem;
11182
+ border-bottom: 2px solid transparent;
11183
+ font-size: 0.8125rem;
11184
+ color: #6b7280;
11185
+ cursor: pointer;
11186
+ display: inline-flex;
11187
+ gap: 0.35rem;
11188
+ }
11189
+
11190
+ .fleet-ops-radar-tab.is-active {
11191
+ color: #111827;
11192
+ font-weight: 700;
11193
+ border-bottom-color: #3485e2;
11194
+ }
11195
+
11196
+ .fleet-ops-radar-tab-count {
11197
+ color: #6b7280;
11198
+ font-weight: 600;
11199
+ }
11200
+
11201
+ .fleet-ops-radar-view-bar-right {
11202
+ margin-left: auto;
11203
+ display: flex;
11204
+ align-items: center;
11205
+ gap: 0.5rem;
11206
+ padding-bottom: 0.4rem;
11207
+ font-size: 0.75rem;
11208
+ color: #6b7280;
11209
+ }
11210
+
11211
+ .fleet-ops-radar-view-bar-label {
11212
+ font-size: 0.65rem;
11213
+ font-weight: 800;
11214
+ letter-spacing: 0.06em;
11215
+ text-transform: uppercase;
11216
+ }
11217
+
11218
+ .fleet-ops-radar-saved-view {
11219
+ display: inline-flex;
11220
+ align-items: center;
11221
+ box-sizing: border-box;
11222
+ height: 1.625rem;
11223
+ gap: 0.35rem;
11224
+ border: 1px solid #e5e7eb;
11225
+ background: #fff;
11226
+ border-radius: 0.375rem;
11227
+ padding: 0 0.55rem;
11228
+ line-height: 1;
11229
+ font-size: 0.75rem;
11230
+ color: #374151;
11231
+ cursor: pointer;
11232
+ }
11233
+
11234
+ .fleet-ops-radar-saved-view.is-active {
11235
+ border-color: #3485e2;
11236
+ color: #1c6cc7;
11237
+ background: #eff6ff;
11238
+ }
11239
+
11240
+ .fleet-ops-radar-saved-view-apply,
11241
+ .fleet-ops-radar-saved-view-delete {
11242
+ border: 0;
11243
+ background: transparent;
11244
+ padding: 0;
11245
+ color: inherit;
11246
+ font: inherit;
11247
+ cursor: pointer;
11248
+ display: inline-flex;
11249
+ align-items: center;
11250
+ gap: 0.35rem;
11251
+ }
11252
+
11253
+ .fleet-ops-radar-saved-view-delete {
11254
+ opacity: 0.6;
11255
+ font-size: 0.7rem;
11256
+ }
11257
+
11258
+ .fleet-ops-radar-saved-view-delete:hover {
11259
+ opacity: 1;
11260
+ }
11261
+
11262
+ .fleet-ops-radar-saved-view-save {
11263
+ font: inherit;
11264
+ font-size: 0.75rem;
11265
+ }
11266
+
11267
+ /* The bulk bar: appears above the list while something is selected. */
11268
+ .fleet-ops-radar-bulk-bar {
11269
+ display: flex;
11270
+ flex-wrap: wrap;
11271
+ align-items: center;
11272
+ gap: 0.6rem;
11273
+ border: 1px solid #bfdbfe;
11274
+ background: #eff6ff;
11275
+ border-radius: 0.5rem;
11276
+ padding: 0.5rem 0.75rem;
11277
+ font-size: 0.78rem;
11278
+ color: #1e3a8a;
11279
+ }
11280
+
11281
+ .fleet-ops-radar-bulk-bar .fleet-ops-radar-row-check {
11282
+ color: #3485e2;
11283
+ }
11284
+
11285
+ .fleet-ops-radar-bulk-copy {
11286
+ display: flex;
11287
+ flex-direction: column;
11288
+ line-height: 1.2;
11289
+ }
11290
+
11291
+ .fleet-ops-radar-bulk-actions {
11292
+ margin-left: auto;
11293
+ display: flex;
11294
+ flex-wrap: wrap;
11295
+ align-items: center;
11296
+ gap: 0.35rem;
11297
+ }
11298
+
11299
+ body[data-theme='dark'] .fleet-ops-radar-bulk-bar {
11300
+ background: rgba(28, 108, 199, 0.18);
11301
+ border-color: #1c6cc7;
11302
+ color: #bfdbfe;
11303
+ }
11304
+
11305
+ /* The list card, its group headers and rows. */
11306
+ .fleet-ops-radar-list {
11307
+ background: #fff;
11308
+ border: 1px solid #e5e7eb;
11309
+ border-radius: 0.5rem;
11310
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
11311
+ overflow: hidden;
11312
+ }
11313
+
11314
+ .fleet-ops-radar-group-header {
11315
+ display: flex;
11316
+ align-items: center;
11317
+ gap: 0.5rem;
11318
+ padding: 0.45rem 0.75rem;
11319
+ border-bottom: 1px solid #e5e7eb;
11320
+ background: #f9fafb;
11321
+ font-size: 0.65rem;
11322
+ font-weight: 800;
11323
+ letter-spacing: 0.06em;
11324
+ text-transform: uppercase;
11325
+ color: #6b7280;
11326
+ }
11327
+
11328
+ .fleet-ops-radar-group-header.is-overdue {
11329
+ background: #fff1f2;
11330
+ border-bottom-color: #fecdd3;
11331
+ color: #be123c;
11332
+ }
11333
+
11334
+ .fleet-ops-radar-group-header.is-today {
11335
+ background: #fffbeb;
11336
+ border-bottom-color: #fde68a;
11337
+ color: #b45309;
11338
+ }
11339
+
11340
+ .fleet-ops-radar-group-count {
11341
+ font-weight: 800;
11342
+ }
11343
+
11344
+ .fleet-ops-radar-row {
11345
+ display: grid;
11346
+ grid-template-columns: 1.25rem 5.25rem 8px minmax(0, 1fr) auto;
11347
+ align-items: center;
11348
+ gap: 0.6rem;
11349
+ padding: 0.55rem 0.75rem;
11350
+ border-bottom: 1px solid #f3f4f6;
11351
+ position: relative;
11352
+ outline: none;
11353
+ transition: background-color 0.12s ease;
11354
+ }
11355
+
11356
+ .fleet-ops-radar-row:last-child {
11357
+ border-bottom: 0;
11358
+ }
11359
+
11360
+ .fleet-ops-radar-row:hover,
11361
+ .fleet-ops-radar-row.is-focused {
11362
+ background: #f9fafb;
11363
+ }
11364
+
11365
+ .fleet-ops-radar-row.is-focused {
11366
+ box-shadow: inset 3px 0 0 #3485e2;
11367
+ }
11368
+
11369
+ .fleet-ops-radar-row.is-selected {
11370
+ background: #eff6ff;
11371
+ }
11372
+
11373
+ .fleet-ops-radar-row-check {
11374
+ display: flex;
11375
+ align-items: center;
11376
+ justify-content: center;
11377
+ border: 0;
11378
+ background: transparent;
11379
+ padding: 0;
11380
+ color: #9ca3af;
11381
+ cursor: pointer;
11382
+ font-size: 0.85rem;
11383
+ line-height: 1;
11384
+ }
11385
+
11386
+ .fleet-ops-radar-row.is-selected .fleet-ops-radar-row-check {
11387
+ color: #3485e2;
11388
+ }
11389
+
11390
+ .fleet-ops-radar-row-check > div {
11391
+ align-items: center;
11392
+ }
11393
+
11394
+ .fleet-ops-radar-row-chip .status-badge > span {
11395
+ width: 100%;
11396
+ justify-content: center;
11397
+ font-size: 0.6rem;
11398
+ font-weight: 800;
11399
+ letter-spacing: 0.04em;
11400
+ text-transform: uppercase;
11401
+ padding: 2px 5px;
11402
+ }
11403
+
11404
+ .fleet-ops-radar-severity {
11405
+ width: 8px;
11406
+ height: 8px;
11407
+ border-radius: 4px;
11408
+ background: #3485e2;
11409
+ }
11410
+
11411
+ .fleet-ops-radar-severity.is-critical {
11412
+ background: #e11d48;
11413
+ }
11414
+
11415
+ .fleet-ops-radar-severity.is-warning {
11416
+ background: #d97706;
11417
+ }
11418
+
11419
+ .fleet-ops-radar-row.is-acknowledged .fleet-ops-radar-severity {
11420
+ opacity: 0.35;
11421
+ }
11422
+
11423
+ .fleet-ops-radar-row-main {
11424
+ display: flex;
11425
+ align-items: center;
11426
+ flex-wrap: wrap;
11427
+ gap: 0.35rem 0.6rem;
11428
+ min-width: 0;
11429
+ }
11430
+
11431
+ .fleet-ops-radar-row-title {
11432
+ border: 0;
11433
+ background: transparent;
11434
+ padding: 0;
11435
+ font-size: 0.8125rem;
11436
+ font-weight: 600;
11437
+ color: #111827;
11438
+ text-align: left;
11439
+ cursor: pointer;
11440
+ }
11441
+
11442
+ .fleet-ops-radar-row-title:hover {
11443
+ color: #1c6cc7;
11444
+ }
11445
+
11446
+ .fleet-ops-radar-row.is-acknowledged .fleet-ops-radar-row-title {
11447
+ font-weight: 500;
11448
+ color: #4b5563;
11449
+ }
11450
+
11451
+ .fleet-ops-radar-subject {
11452
+ display: inline-flex;
11453
+ align-items: center;
11454
+ gap: 0.35rem;
11455
+ background: #f3f4f6;
11456
+ border-radius: 999px;
11457
+ padding: 2px 8px 2px 3px;
11458
+ font-size: 0.72rem;
11459
+ color: #374151;
11460
+ max-width: 18rem;
11461
+ }
11462
+
11463
+ .fleet-ops-radar-subject-label {
11464
+ overflow: hidden;
11465
+ text-overflow: ellipsis;
11466
+ white-space: nowrap;
11467
+ }
11468
+
11469
+ .fleet-ops-radar-avatar {
11470
+ width: 18px;
11471
+ height: 18px;
11472
+ border-radius: 9px;
11473
+ background: #d1d5db;
11474
+ color: #111827;
11475
+ display: inline-flex;
11476
+ align-items: center;
11477
+ justify-content: center;
11478
+ font-size: 0.55rem;
11479
+ font-weight: 800;
11480
+ overflow: hidden;
11481
+ flex: 0 0 auto;
11482
+ }
11483
+
11484
+ .fleet-ops-radar-avatar img {
11485
+ width: 100%;
11486
+ height: 100%;
11487
+ object-fit: cover;
11488
+ }
11489
+
11490
+ .fleet-ops-radar-avatar.is-user {
11491
+ background: #dbeafe;
11492
+ color: #1d4ed8;
11493
+ }
11494
+
11495
+ .fleet-ops-radar-row-meta {
11496
+ font-size: 0.72rem;
11497
+ color: #6b7280;
11498
+ }
11499
+
11500
+ .fleet-ops-radar-row-state {
11501
+ display: inline-flex;
11502
+ align-items: center;
11503
+ gap: 0.3rem;
11504
+ font-size: 0.72rem;
11505
+ color: #6b7280;
11506
+ }
11507
+
11508
+ .fleet-ops-radar-row-state svg {
11509
+ font-size: 0.65rem;
11510
+ }
11511
+
11512
+ .fleet-ops-radar-row-side {
11513
+ display: flex;
11514
+ align-items: center;
11515
+ gap: 0.6rem;
11516
+ justify-content: flex-end;
11517
+ }
11518
+
11519
+ .fleet-ops-radar-row-due {
11520
+ font-size: 0.72rem;
11521
+ font-weight: 700;
11522
+ color: #374151;
11523
+ white-space: nowrap;
11524
+ }
11525
+
11526
+ .fleet-ops-radar-row-due.is-overdue {
11527
+ color: #dc2626;
11528
+ }
11529
+
11530
+ .fleet-ops-radar-row-due.is-none {
11531
+ color: #9ca3af;
11532
+ font-weight: 500;
11533
+ }
11534
+
11535
+ .fleet-ops-radar-row-assignee {
11536
+ display: inline-flex;
11537
+ align-items: center;
11538
+ gap: 0.35rem;
11539
+ font-size: 0.72rem;
11540
+ color: #374151;
11541
+ min-width: 6.5rem;
11542
+ }
11543
+
11544
+ .fleet-ops-radar-row-assignee.is-empty {
11545
+ color: #9ca3af;
11546
+ }
11547
+
11548
+ /* The quick-action rail: fixed width so the row never reflows on hover. */
11549
+ .fleet-ops-radar-row-rail {
11550
+ display: flex;
11551
+ align-items: center;
11552
+ gap: 0.25rem;
11553
+ opacity: 0;
11554
+ transition: opacity 0.12s ease;
11555
+ }
11556
+
11557
+ .fleet-ops-radar-row:hover .fleet-ops-radar-row-rail,
11558
+ .fleet-ops-radar-row.is-focused .fleet-ops-radar-row-rail,
11559
+ .fleet-ops-radar-row-rail:focus-within {
11560
+ opacity: 1;
11561
+ }
11562
+
11563
+ /* The snooze DropdownButton wraps its button in a trigger; flatten it so it lines up. */
11564
+ .fleet-ops-radar-row-rail .ember-basic-dropdown,
11565
+ .fleet-ops-radar-row-rail .ember-basic-dropdown-trigger,
11566
+ .fleet-ops-radar-bulk-actions .ember-basic-dropdown,
11567
+ .fleet-ops-radar-bulk-actions .ember-basic-dropdown-trigger {
11568
+ display: inline-flex;
11569
+ align-items: center;
11570
+ }
11571
+
11572
+ .fleet-ops-radar-row-rail .btn-wrapper,
11573
+ .fleet-ops-radar-row-rail .btn-wrapper > .btn,
11574
+ .fleet-ops-radar-bulk-actions .btn-wrapper,
11575
+ .fleet-ops-radar-bulk-actions .btn-wrapper > .btn {
11576
+ height: 1.75rem;
11577
+ }
11578
+
11579
+ .fleet-ops-radar-row-rail .btn-wrapper > .btn,
11580
+ .fleet-ops-radar-bulk-actions .btn-wrapper > .btn {
11581
+ display: inline-flex;
11582
+ align-items: center;
11583
+ padding-top: 0;
11584
+ padding-bottom: 0;
11585
+ }
11586
+
11587
+ .fleet-ops-radar-row-open {
11588
+ display: inline-flex;
11589
+ align-items: center;
11590
+ justify-content: center;
11591
+ border: 0;
11592
+ background: transparent;
11593
+ color: #9ca3af;
11594
+ cursor: pointer;
11595
+ padding: 0.15rem;
11596
+ font-size: 0.7rem;
11597
+ line-height: 1;
11598
+ }
11599
+
11600
+ .fleet-ops-radar-row-open svg {
11601
+ width: 0.7rem;
11602
+ height: 0.7rem;
11603
+ }
11604
+
11605
+ .fleet-ops-radar-row-open:hover {
11606
+ color: #1c6cc7;
11607
+ }
11608
+
11609
+ @media (width <= 1023px) {
11610
+ .fleet-ops-radar-row {
11611
+ grid-template-columns: 1.25rem minmax(0, 1fr);
11612
+ }
11613
+
11614
+ .fleet-ops-radar-row-chip,
11615
+ .fleet-ops-radar-severity {
11616
+ display: none;
11617
+ }
11618
+
11619
+ .fleet-ops-radar-row-side {
11620
+ grid-column: 2;
11621
+ justify-content: flex-start;
11622
+ }
11623
+
11624
+ .fleet-ops-radar-row-rail {
11625
+ opacity: 1;
11626
+ }
11627
+ }
11628
+
11629
+ /* Footer: keys and paging, a full-width bar pinned to the bottom of the page while the list scrolls. */
11630
+ .fleet-ops-radar-footer {
11631
+ position: sticky;
11632
+ bottom: 0;
11633
+ z-index: 20;
11634
+ display: flex;
11635
+ flex-wrap: wrap;
11636
+ align-items: center;
11637
+ gap: 0.5rem 1.25rem;
11638
+ width: 100%;
11639
+ box-sizing: border-box;
11640
+
11641
+ /* The sidebar's attribution footer: 0.75rem padding either side of a
11642
+ 0.875rem line plus its 1px top border, so the two borders line up. */
11643
+ min-height: 2.4375rem;
11644
+ margin: 0;
11645
+ padding: 0.25rem 1rem;
11646
+ background: #fff;
11647
+ border-top: 1px solid #e5e7eb;
11648
+ box-shadow: 0 -4px 16px rgba(15, 23, 42, 0.06);
11649
+ font-size: 0.72rem;
11650
+ color: #6b7280;
11651
+ }
11652
+
11653
+ @media (width >= 768px) {
11654
+ .fleet-ops-radar-footer {
11655
+ flex-wrap: nowrap;
11656
+ height: 2.4375rem;
11657
+ padding: 0 1.5rem;
11658
+ overflow: hidden;
11659
+ }
11660
+ }
11661
+
11662
+ .fleet-ops-radar-footer-meta {
11663
+ margin-left: auto;
11664
+ display: flex;
11665
+ align-items: center;
11666
+ gap: 0.75rem;
11667
+ }
11668
+
11669
+ .fleet-ops-radar-footer-meta .fleet-ops-radar-paging {
11670
+ margin-left: 0;
11671
+ }
11672
+
11673
+ .fleet-ops-radar-footer .btn-wrapper,
11674
+ .fleet-ops-radar-footer .btn-wrapper > .btn {
11675
+ height: 1.5rem;
11676
+ }
11677
+
11678
+ .fleet-ops-radar-footer .btn-wrapper > .btn {
11679
+ display: inline-flex;
11680
+ align-items: center;
11681
+ padding-top: 0;
11682
+ padding-bottom: 0;
11683
+ }
11684
+
11685
+ .fleet-ops-radar-keys {
11686
+ display: flex;
11687
+ flex-wrap: wrap;
11688
+ gap: 0.75rem;
11689
+ }
11690
+
11691
+ .fleet-ops-radar-keys span {
11692
+ display: inline-flex;
11693
+ align-items: center;
11694
+ gap: 0.3rem;
11695
+ }
11696
+
11697
+ .fleet-ops-radar kbd {
11698
+ border: 1px solid #d1d5db;
11699
+ border-bottom-width: 2px;
11700
+ border-radius: 4px;
11701
+ background: #f9fafb;
11702
+ padding: 0 5px;
11703
+ font-family: inherit;
11704
+ font-size: 0.65rem;
11705
+ font-weight: 700;
11706
+ color: #374151;
11707
+ line-height: 1.3;
11708
+ }
11709
+
11710
+ .fleet-ops-radar-paging {
11711
+ margin-left: auto;
11712
+ display: flex;
11713
+ align-items: center;
11714
+ gap: 0.35rem;
11715
+ }
11716
+
11717
+ /* Empty states. */
11718
+ .fleet-ops-radar-empty {
11719
+ padding: 2.5rem 1.5rem;
11720
+ text-align: center;
11721
+ }
11722
+
11723
+ .fleet-ops-radar-empty-icon {
11724
+ width: 2.75rem;
11725
+ height: 2.75rem;
11726
+ border-radius: 0.5rem;
11727
+ background: #ecfdf5;
11728
+ color: #047857;
11729
+ display: inline-flex;
11730
+ align-items: center;
11731
+ justify-content: center;
11732
+ font-size: 1.1rem;
11733
+ margin-bottom: 0.75rem;
11734
+ }
11735
+
11736
+ .fleet-ops-radar-empty-icon.is-neutral {
11737
+ background: #f3f4f6;
11738
+ color: #6b7280;
11739
+ }
11740
+
11741
+ .fleet-ops-radar-empty-title {
11742
+ font-size: 0.9375rem;
11743
+ font-weight: 700;
11744
+ color: #111827;
11745
+ }
11746
+
11747
+ .fleet-ops-radar-empty-hint {
11748
+ font-size: 0.8125rem;
11749
+ color: #6b7280;
11750
+ margin-top: 0.25rem;
11751
+ }
11752
+
11753
+ .fleet-ops-radar-empty-schedule {
11754
+ margin: 1rem auto 0;
11755
+ max-width: 28rem;
11756
+ text-align: left;
11757
+ border: 1px solid #e5e7eb;
11758
+ border-radius: 0.375rem;
11759
+ font-size: 0.75rem;
11760
+ }
11761
+
11762
+ .fleet-ops-radar-empty-schedule > div {
11763
+ display: flex;
11764
+ justify-content: space-between;
11765
+ gap: 1rem;
11766
+ padding: 0.45rem 0.75rem;
11767
+ border-bottom: 1px solid #f3f4f6;
11768
+ color: #374151;
11769
+ }
11770
+
11771
+ .fleet-ops-radar-empty-schedule > div:last-child {
11772
+ border-bottom: 0;
11773
+ }
11774
+
11775
+ .fleet-ops-radar-empty-schedule time {
11776
+ color: #6b7280;
11777
+ white-space: nowrap;
11778
+ }
11779
+
11780
+ /* Drawer. */
11781
+ .fleet-ops-radar-drawer-section {
11782
+ padding: 0.875rem 1rem;
11783
+ border-bottom: 1px solid #e5e7eb;
11784
+ }
11785
+
11786
+ .fleet-ops-radar-drawer-label {
11787
+ font-size: 0.65rem;
11788
+ font-weight: 800;
11789
+ letter-spacing: 0.06em;
11790
+ text-transform: uppercase;
11791
+ color: #6b7280;
11792
+ margin-bottom: 0.4rem;
11793
+ }
11794
+
11795
+ .fleet-ops-radar-drawer-title {
11796
+ font-size: 0.9375rem;
11797
+ font-weight: 700;
11798
+ color: #111827;
11799
+ line-height: 1.35;
11800
+ }
11801
+
11802
+ .fleet-ops-radar-drawer-actions {
11803
+ display: flex;
11804
+ flex-wrap: wrap;
11805
+ gap: 0.4rem;
11806
+ }
11807
+
11808
+ .fleet-ops-radar-drawer-list {
11809
+ display: flex;
11810
+ flex-direction: column;
11811
+ gap: 0.35rem;
11812
+ font-size: 0.78rem;
11813
+ color: #374151;
11814
+ }
11815
+
11816
+ .fleet-ops-radar-drawer-list > div {
11817
+ display: flex;
11818
+ align-items: center;
11819
+ justify-content: space-between;
11820
+ gap: 0.75rem;
11821
+ }
11822
+
11823
+ .fleet-ops-radar-drawer-state {
11824
+ display: flex;
11825
+ flex-direction: column;
11826
+ gap: 0.3rem;
11827
+ font-size: 0.78rem;
11828
+ color: #374151;
11829
+ }
11830
+
11831
+ /* Agenda: overdue band, four lanes on a time scale, later rail, tray. */
11832
+ .fleet-ops-radar-agenda {
11833
+ display: flex;
11834
+ flex-direction: column;
11835
+ gap: 0.75rem;
11836
+ }
11837
+
11838
+ .fleet-ops-radar-agenda-toolbar {
11839
+ display: flex;
11840
+ flex-wrap: wrap;
11841
+ align-items: center;
11842
+ gap: 0.75rem;
11843
+ }
11844
+
11845
+ .fleet-ops-radar-agenda-grid {
11846
+ display: grid;
11847
+ grid-template-columns: 1fr;
11848
+ gap: 0.75rem;
11849
+ }
11850
+
11851
+ @media (width >= 1024px) {
11852
+ .fleet-ops-radar-agenda-grid {
11853
+ grid-template-columns: 11rem minmax(0, 1fr) 10rem;
11854
+ }
11855
+ }
11856
+
11857
+ .fleet-ops-radar-agenda-band,
11858
+ .fleet-ops-radar-agenda-scale,
11859
+ .fleet-ops-radar-agenda-tray {
11860
+ background: #fff;
11861
+ border: 1px solid #e5e7eb;
11862
+ border-radius: 0.5rem;
11863
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
11864
+ padding: 0.6rem 0.75rem;
11865
+ }
11866
+
11867
+ .fleet-ops-radar-agenda-band {
11868
+ display: flex;
11869
+ flex-direction: column;
11870
+ gap: 0.4rem;
11871
+ min-height: 12rem;
11872
+ }
11873
+
11874
+ .fleet-ops-radar-agenda-band-title {
11875
+ display: flex;
11876
+ align-items: center;
11877
+ gap: 0.35rem;
11878
+ font-size: 0.65rem;
11879
+ font-weight: 800;
11880
+ letter-spacing: 0.06em;
11881
+ text-transform: uppercase;
11882
+ color: #6b7280;
11883
+ }
11884
+
11885
+ .fleet-ops-radar-agenda-band-title.is-overdue {
11886
+ color: #be123c;
11887
+ }
11888
+
11889
+ .fleet-ops-radar-agenda-scale {
11890
+ display: flex;
11891
+ flex-direction: column;
11892
+ gap: 0.35rem;
11893
+ overflow-x: auto;
11894
+ }
11895
+
11896
+ .fleet-ops-radar-agenda-ruler,
11897
+ .fleet-ops-radar-agenda-lane {
11898
+ display: grid;
11899
+ grid-template-columns: 7rem minmax(0, 1fr);
11900
+ gap: 0.5rem;
11901
+ align-items: stretch;
11902
+ }
11903
+
11904
+ .fleet-ops-radar-agenda-lane-label {
11905
+ display: flex;
11906
+ align-items: center;
11907
+ gap: 0.4rem;
11908
+ font-size: 0.72rem;
11909
+ font-weight: 700;
11910
+ color: #374151;
11911
+ padding: 0.35rem 0;
11912
+ }
11913
+
11914
+ .fleet-ops-radar-agenda-track {
11915
+ position: relative;
11916
+ min-height: 2.6rem;
11917
+ border-radius: 0.375rem;
11918
+ background: repeating-linear-gradient(to right, #f3f4f6 0, #f3f4f6 1px, transparent 1px, transparent 8.333%);
11919
+ display: flex;
11920
+ flex-direction: column;
11921
+ gap: 0.25rem;
11922
+ padding: 0.3rem 0;
11923
+ }
11924
+
11925
+ .fleet-ops-radar-agenda-ruler .fleet-ops-radar-agenda-track {
11926
+ min-height: 1.4rem;
11927
+ background: transparent;
11928
+ border-bottom: 1px solid #e5e7eb;
11929
+ border-radius: 0;
11930
+ }
11931
+
11932
+ .fleet-ops-radar-agenda-tick {
11933
+ position: absolute;
11934
+ top: 0;
11935
+ transform: translateX(-50%);
11936
+ font-size: 0.65rem;
11937
+ color: #9ca3af;
11938
+ }
11939
+
11940
+ .fleet-ops-radar-agenda-now {
11941
+ position: absolute;
11942
+ top: 0;
11943
+ bottom: -100vh;
11944
+ width: 2px;
11945
+ background: #3485e2;
11946
+ z-index: 2;
11947
+ pointer-events: none;
11948
+ }
11949
+
11950
+ .fleet-ops-radar-agenda-now em {
11951
+ position: absolute;
11952
+ top: 0;
11953
+ left: 4px;
11954
+ font-style: normal;
11955
+ font-size: 0.6rem;
11956
+ font-weight: 800;
11957
+ color: #3485e2;
11958
+ background: #fff;
11959
+ padding: 0 3px;
11960
+ border-radius: 3px;
11961
+ }
11962
+
11963
+ .fleet-ops-radar-agenda-lane.is-drop-target .fleet-ops-radar-agenda-track {
11964
+ outline: 2px dashed #3485e2;
11965
+ outline-offset: -2px;
11966
+ }
11967
+
11968
+ .fleet-ops-radar-agenda-row {
11969
+ position: relative;
11970
+ height: 1.9rem;
11971
+ }
11972
+
11973
+ .fleet-ops-radar-agenda-empty-lane {
11974
+ font-size: 0.72rem;
11975
+ color: #9ca3af;
11976
+ padding: 0.5rem 0.75rem;
11977
+ }
11978
+
11979
+ .fleet-ops-radar-agenda-shift {
11980
+ position: absolute;
11981
+ top: 0;
11982
+ height: 1.8rem;
11983
+ display: flex;
11984
+ align-items: center;
11985
+ gap: 0.35rem;
11986
+ padding: 0 0.5rem 0 0.25rem;
11987
+ border: 1px solid #c7d2fe;
11988
+ background: #e0e7ff;
11989
+ color: #3730a3;
11990
+ border-radius: 0.375rem;
11991
+ font-size: 0.7rem;
11992
+ white-space: nowrap;
11993
+ overflow: hidden;
11994
+ cursor: pointer;
11995
+ }
11996
+
11997
+ .fleet-ops-radar-agenda-shift.is-not_online {
11998
+ border-color: #fecdd3;
11999
+ background: #fff1f2;
12000
+ color: #9f1239;
12001
+ }
12002
+
12003
+ .fleet-ops-radar-agenda-shift.has-handover {
12004
+ border-color: #fde68a;
12005
+ background: #fffbeb;
12006
+ color: #92400e;
12007
+ }
12008
+
12009
+ .fleet-ops-radar-agenda-shift.is-upcoming {
12010
+ opacity: 0.75;
12011
+ }
12012
+
12013
+ .fleet-ops-radar-agenda-shift.is-ended {
12014
+ opacity: 0.45;
12015
+ }
12016
+
12017
+ .fleet-ops-radar-agenda-shift-label {
12018
+ font-weight: 700;
12019
+ }
12020
+
12021
+ .fleet-ops-radar-agenda-shift-meta {
12022
+ opacity: 0.8;
12023
+ overflow: hidden;
12024
+ text-overflow: ellipsis;
12025
+ }
12026
+
12027
+ .fleet-ops-radar-agenda-entry {
12028
+ display: inline-flex;
12029
+ align-items: center;
12030
+ gap: 0.35rem;
12031
+ max-width: 100%;
12032
+ border: 1px solid #e5e7eb;
12033
+ background: #fff;
12034
+ border-radius: 0.375rem;
12035
+ padding: 0.25rem 0.5rem;
12036
+ font-size: 0.7rem;
12037
+ color: #374151;
12038
+ text-align: left;
12039
+ cursor: pointer;
12040
+ white-space: nowrap;
12041
+ }
12042
+
12043
+ .fleet-ops-radar-agenda-entry.is-positioned {
12044
+ position: absolute;
12045
+ top: 0;
12046
+ height: 1.8rem;
12047
+ max-width: 22rem;
12048
+ }
12049
+
12050
+ .fleet-ops-radar-agenda-entry.is-compact {
12051
+ white-space: normal;
12052
+ }
12053
+
12054
+ .fleet-ops-radar-agenda-entry.is-planned {
12055
+ border-style: dashed;
12056
+ }
12057
+
12058
+ .fleet-ops-radar-agenda-entry:hover {
12059
+ border-color: #bfdbfe;
12060
+ }
12061
+
12062
+ .fleet-ops-radar-agenda-entry strong {
12063
+ color: #111827;
12064
+ }
12065
+
12066
+ .fleet-ops-radar-agenda-entry-title {
12067
+ overflow: hidden;
12068
+ text-overflow: ellipsis;
12069
+ }
12070
+
12071
+ .fleet-ops-radar-agenda-entry-time {
12072
+ color: #6b7280;
12073
+ font-weight: 700;
12074
+ }
12075
+
12076
+ .fleet-ops-radar-agenda-grip {
12077
+ color: #9ca3af;
12078
+ cursor: grab;
12079
+ }
12080
+
12081
+ .fleet-ops-radar-agenda-tray-items {
12082
+ display: flex;
12083
+ flex-wrap: wrap;
12084
+ gap: 0.4rem;
12085
+ margin-top: 0.5rem;
12086
+ }
12087
+
12088
+ /* Handover card: floats above the page bottom-right. */
12089
+ .fleet-ops-radar-handover {
12090
+ position: fixed;
12091
+ right: 1.25rem;
12092
+ bottom: 1.25rem;
12093
+ width: min(26rem, calc(100vw - 2.5rem));
12094
+ z-index: 60;
12095
+ background: #fff;
12096
+ border: 1px solid #fde68a;
12097
+ border-radius: 0.5rem;
12098
+ box-shadow: 0 12px 32px rgba(15, 23, 42, 0.18);
12099
+ padding: 0.75rem 0.9rem;
12100
+ display: flex;
12101
+ flex-direction: column;
12102
+ gap: 0.6rem;
12103
+ font-size: 0.78rem;
12104
+ }
12105
+
12106
+ .fleet-ops-radar-handover-head {
12107
+ display: flex;
12108
+ align-items: center;
12109
+ gap: 0.5rem;
12110
+ }
12111
+
12112
+ .fleet-ops-radar-handover-title {
12113
+ font-weight: 700;
12114
+ color: #111827;
12115
+ }
12116
+
12117
+ .fleet-ops-radar-handover-orders {
12118
+ display: flex;
12119
+ flex-direction: column;
12120
+ gap: 0.25rem;
12121
+ }
12122
+
12123
+ .fleet-ops-radar-handover-order {
12124
+ display: flex;
12125
+ flex-wrap: wrap;
12126
+ gap: 0.4rem;
12127
+ align-items: center;
12128
+ padding: 0.3rem 0.5rem;
12129
+ border: 1px solid #e5e7eb;
12130
+ border-radius: 0.375rem;
12131
+ color: #374151;
12132
+ }
12133
+
12134
+ .fleet-ops-radar-handover-order.is-late {
12135
+ border-color: #fde68a;
12136
+ background: #fffbeb;
12137
+ }
12138
+
12139
+ .fleet-ops-radar-handover-late {
12140
+ color: #b45309;
12141
+ font-weight: 700;
12142
+ font-size: 0.68rem;
12143
+ }
12144
+
12145
+ .fleet-ops-radar-handover-cover {
12146
+ display: flex;
12147
+ align-items: center;
12148
+ gap: 0.5rem;
12149
+ }
12150
+
12151
+ @media print {
12152
+ .fleet-ops-control-hub-header,
12153
+ .fleet-ops-radar-agenda-toolbar,
12154
+ .fleet-ops-radar-briefing,
12155
+ .fleet-ops-radar-footer,
12156
+ .fleet-ops-radar-handover,
12157
+ .next-content-overlay {
12158
+ display: none !important;
12159
+ }
12160
+
12161
+ .fleet-ops-radar-agenda-grid {
12162
+ grid-template-columns: 1fr;
12163
+ }
12164
+
12165
+ .fleet-ops-radar-agenda-scale {
12166
+ overflow: visible;
12167
+ }
12168
+ }
12169
+
12170
+ body[data-theme='dark'] .fleet-ops-radar-agenda-band,
12171
+ body[data-theme='dark'] .fleet-ops-radar-agenda-scale,
12172
+ body[data-theme='dark'] .fleet-ops-radar-agenda-tray,
12173
+ body[data-theme='dark'] .fleet-ops-radar-agenda-entry,
12174
+ body[data-theme='dark'] .fleet-ops-radar-handover,
12175
+ body[data-theme='dark'] .fleet-ops-radar-handover-order {
12176
+ background: #1f2937;
12177
+ border-color: #374151;
12178
+ color: #d1d5db;
12179
+ }
12180
+
12181
+ body[data-theme='dark'] .fleet-ops-radar-agenda-lane-label,
12182
+ body[data-theme='dark'] .fleet-ops-radar-agenda-entry strong,
12183
+ body[data-theme='dark'] .fleet-ops-radar-handover-title {
12184
+ color: #f9fafb;
12185
+ }
12186
+
12187
+ body[data-theme='dark'] .fleet-ops-radar-agenda-track {
12188
+ background: repeating-linear-gradient(to right, #374151 0, #374151 1px, transparent 1px, transparent 8.333%);
12189
+ }
12190
+
12191
+ body[data-theme='dark'] .fleet-ops-radar-agenda-ruler .fleet-ops-radar-agenda-track {
12192
+ background: transparent;
12193
+ border-bottom-color: #374151;
12194
+ }
12195
+
12196
+ body[data-theme='dark'] .fleet-ops-radar-agenda-now em {
12197
+ background: #1f2937;
12198
+ }
12199
+
12200
+ body[data-theme='dark'] .fleet-ops-radar-agenda-shift {
12201
+ background: rgba(99, 102, 241, 0.25);
12202
+ border-color: #4f46e5;
12203
+ color: #c7d2fe;
12204
+ }
12205
+
12206
+ body[data-theme='dark'] .fleet-ops-radar-agenda-shift.is-not_online {
12207
+ background: rgba(225, 29, 72, 0.18);
12208
+ border-color: rgba(225, 29, 72, 0.5);
12209
+ color: #fda4af;
12210
+ }
12211
+
12212
+ body[data-theme='dark'] .fleet-ops-radar-agenda-shift.has-handover,
12213
+ body[data-theme='dark'] .fleet-ops-radar-handover-order.is-late {
12214
+ background: rgba(217, 119, 6, 0.18);
12215
+ border-color: rgba(217, 119, 6, 0.5);
12216
+ color: #fcd34d;
12217
+ }
12218
+
12219
+ /* Modals used from Radar. */
12220
+ .fleet-ops-radar-modal-grid {
12221
+ display: grid;
12222
+ grid-template-columns: 1fr;
12223
+ gap: 0.75rem;
12224
+ }
12225
+
12226
+ @media (width >= 640px) {
12227
+ .fleet-ops-radar-modal-grid.has-two {
12228
+ grid-template-columns: 1fr 1fr;
12229
+ }
12230
+ }
12231
+
12232
+ /* Dark mode. */
12233
+ body[data-theme='dark'] .fleet-ops-radar-header-summary,
12234
+ body[data-theme='dark'] .fleet-ops-radar-tab,
12235
+ body[data-theme='dark'] .fleet-ops-radar-tab-count,
12236
+ body[data-theme='dark'] .fleet-ops-radar-view-bar-right,
12237
+ body[data-theme='dark'] .fleet-ops-radar-row-meta,
12238
+ body[data-theme='dark'] .fleet-ops-radar-row-state,
12239
+ body[data-theme='dark'] .fleet-ops-radar-footer,
12240
+ body[data-theme='dark'] .fleet-ops-radar-empty-hint,
12241
+ body[data-theme='dark'] .fleet-ops-radar-drawer-label,
12242
+ body[data-theme='dark'] .fleet-ops-radar-empty-schedule time {
12243
+ color: #9ca3af;
12244
+ }
12245
+
12246
+ body[data-theme='dark'] .fleet-ops-radar-footer,
12247
+ body[data-theme='dark'] .fleet-ops-radar-view-toggle,
12248
+ body[data-theme='dark'] .fleet-ops-radar-pill,
12249
+ body[data-theme='dark'] .fleet-ops-radar-saved-view,
12250
+ body[data-theme='dark'] .fleet-ops-radar-list,
12251
+ body[data-theme='dark'] .fleet-ops-radar-empty-schedule {
12252
+ background: #1f2937;
12253
+ border-color: #374151;
12254
+ }
12255
+
12256
+ body[data-theme='dark'] .fleet-ops-radar-view-toggle-button,
12257
+ body[data-theme='dark'] .fleet-ops-radar-pill,
12258
+ body[data-theme='dark'] .fleet-ops-radar-saved-view,
12259
+ body[data-theme='dark'] .fleet-ops-radar-row-due,
12260
+ body[data-theme='dark'] .fleet-ops-radar-row-assignee,
12261
+ body[data-theme='dark'] .fleet-ops-radar-drawer-list,
12262
+ body[data-theme='dark'] .fleet-ops-radar-drawer-state,
12263
+ body[data-theme='dark'] .fleet-ops-radar-empty-schedule > div {
12264
+ color: #d1d5db;
12265
+ }
12266
+
12267
+ body[data-theme='dark'] .fleet-ops-radar-view-toggle-button.is-active {
12268
+ background: #1c6cc7;
12269
+ color: #fff;
12270
+ }
12271
+
12272
+ body[data-theme='dark'] .fleet-ops-radar-pill:hover {
12273
+ border-color: #1c6cc7;
12274
+ }
12275
+
12276
+ body[data-theme='dark'] .fleet-ops-radar-pill.is-active {
12277
+ background: #1c6cc7;
12278
+ border-color: #1c6cc7;
12279
+ color: #fff;
12280
+ }
12281
+
12282
+ body[data-theme='dark'] .fleet-ops-radar-pill.is-empty:not(.is-active) {
12283
+ color: #6b7280;
12284
+ }
12285
+
12286
+ body[data-theme='dark'] .fleet-ops-radar-saved-view.is-active {
12287
+ background: rgba(28, 108, 199, 0.2);
12288
+ border-color: #1c6cc7;
12289
+ color: #93c5fd;
12290
+ }
12291
+
12292
+ body[data-theme='dark'] .fleet-ops-radar-view-bar,
12293
+ body[data-theme='dark'] .fleet-ops-radar-group-header,
12294
+ body[data-theme='dark'] .fleet-ops-radar-row,
12295
+ body[data-theme='dark'] .fleet-ops-radar-drawer-section,
12296
+ body[data-theme='dark'] .fleet-ops-radar-empty-schedule > div {
12297
+ border-color: #374151;
12298
+ }
12299
+
12300
+ body[data-theme='dark'] .fleet-ops-radar-tab.is-active,
12301
+ body[data-theme='dark'] .fleet-ops-radar-row-title,
12302
+ body[data-theme='dark'] .fleet-ops-radar-empty-title,
12303
+ body[data-theme='dark'] .fleet-ops-radar-drawer-title {
12304
+ color: #f9fafb;
12305
+ }
12306
+
12307
+ body[data-theme='dark'] .fleet-ops-radar-tab.is-active {
12308
+ border-bottom-color: #60a5fa;
12309
+ }
12310
+
12311
+ body[data-theme='dark'] .fleet-ops-radar-group-header {
12312
+ background: #111827;
12313
+ color: #9ca3af;
12314
+ }
12315
+
12316
+ body[data-theme='dark'] .fleet-ops-radar-group-header.is-overdue {
12317
+ background: rgba(225, 29, 72, 0.15);
12318
+ border-bottom-color: rgba(225, 29, 72, 0.35);
12319
+ color: #fda4af;
12320
+ }
12321
+
12322
+ body[data-theme='dark'] .fleet-ops-radar-group-header.is-today {
12323
+ background: rgba(217, 119, 6, 0.15);
12324
+ border-bottom-color: rgba(217, 119, 6, 0.35);
12325
+ color: #fcd34d;
12326
+ }
12327
+
12328
+ body[data-theme='dark'] .fleet-ops-radar-row:hover,
12329
+ body[data-theme='dark'] .fleet-ops-radar-row.is-focused {
12330
+ background: #111827;
12331
+ }
12332
+
12333
+ body[data-theme='dark'] .fleet-ops-radar-row.is-selected {
12334
+ background: rgba(28, 108, 199, 0.18);
12335
+ }
12336
+
12337
+ body[data-theme='dark'] .fleet-ops-radar-row.is-acknowledged .fleet-ops-radar-row-title {
12338
+ color: #9ca3af;
12339
+ }
12340
+
12341
+ body[data-theme='dark'] .fleet-ops-radar-row-title:hover {
12342
+ color: #93c5fd;
12343
+ }
12344
+
12345
+ body[data-theme='dark'] .fleet-ops-radar-row-due.is-overdue {
12346
+ color: #fb7185;
12347
+ }
12348
+
12349
+ body[data-theme='dark'] .fleet-ops-radar-subject {
12350
+ background: #374151;
12351
+ color: #e5e7eb;
12352
+ }
12353
+
12354
+ body[data-theme='dark'] .fleet-ops-radar-avatar {
12355
+ background: #4b5563;
12356
+ color: #f9fafb;
12357
+ }
12358
+
12359
+ body[data-theme='dark'] .fleet-ops-radar-avatar.is-user {
12360
+ background: rgba(29, 78, 216, 0.35);
12361
+ color: #bfdbfe;
12362
+ }
12363
+
12364
+ body[data-theme='dark'] .fleet-ops-radar kbd {
12365
+ background: #111827;
12366
+ border-color: #4b5563;
12367
+ color: #d1d5db;
12368
+ }
12369
+
12370
+ body[data-theme='dark'] .fleet-ops-radar-empty-icon {
12371
+ background: rgba(5, 150, 105, 0.2);
12372
+ color: #6ee7b7;
12373
+ }
12374
+
12375
+ body[data-theme='dark'] .fleet-ops-radar-empty-icon.is-neutral {
12376
+ background: #374151;
12377
+ color: #9ca3af;
12378
+ }
12379
+
12380
+ body[data-theme='dark'] .fleet-ops-radar-sources-warning {
12381
+ background: rgba(217, 119, 6, 0.15);
12382
+ border-color: rgba(217, 119, 6, 0.4);
12383
+ color: #fcd34d;
12384
+ }
12385
+
12386
+ /* ── Resource list cell ──
12387
+ A has-many column (trailers, devices) shows one pill per record, drawn at
12388
+ the identity cell's size: a 1.25rem circle, the name centred beside it,
12389
+ and a hover box that stays inside the cell instead of touching its border. */
12390
+ .resource-list-pill > a[href],
12391
+ .resource-list-pill > .fleetbase-pill-body {
12392
+ display: inline-flex;
12393
+ align-items: center;
12394
+ gap: 0.375rem;
12395
+ padding: 0.125rem 0.375rem;
12396
+ margin: 0;
12397
+ border-radius: 0.375rem;
12398
+ }
12399
+
12400
+ .resource-list-pill .fleetbase-pill-body > * + * {
12401
+ margin-left: 0;
12402
+ }
12403
+
12404
+ .resource-list-pill .fleetbase-pill-body > .relative {
12405
+ width: 1.25rem;
12406
+ height: 1.25rem;
12407
+ }
12408
+
12409
+ .resource-list-pill .fleetbase-pill-body img.flb--img,
12410
+ .resource-list-pill .fleetbase-pill-body .resource-pill-icon {
12411
+ width: 1.25rem;
12412
+ height: 1.25rem;
12413
+ box-shadow: none;
12414
+ border: 1px solid #e5e7eb;
12415
+ }
12416
+
12417
+ body[data-theme='dark'] .resource-list-pill .fleetbase-pill-body img.flb--img,
12418
+ body[data-theme='dark'] .resource-list-pill .fleetbase-pill-body .resource-pill-icon {
12419
+ border-color: #374151;
12420
+ }
12421
+
12422
+ .resource-list-pill .fleetbase-pill-body .resource-pill-online-dot {
12423
+ width: 0.375rem;
12424
+ height: 0.375rem;
12425
+ margin: -0.125rem 0 0 -0.125rem;
12426
+ }
12427
+
12428
+ .resource-list-pill .fleetbase-pill-body .text-sm {
12429
+ font-size: 0.875rem;
12430
+ line-height: 1rem;
8885
12431
  }