@fleetbase/fleetops-engine 0.6.71 → 0.6.72

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 (378) hide show
  1. package/RELEASE.md +15 -18
  2. package/addon/components/admin/tracking-page-settings.hbs +56 -0
  3. package/addon/components/admin/tracking-page-settings.js +67 -0
  4. package/addon/components/device/form.hbs +2 -2
  5. package/addon/components/driver/details.hbs +1 -1
  6. package/addon/components/driver/form.hbs +1 -1
  7. package/addon/components/equipment/form.hbs +1 -1
  8. package/addon/components/layout/fleet-ops-sidebar.js +11 -3
  9. package/addon/components/maintenance/form.hbs +3 -3
  10. package/addon/components/map/google-live-map.js +2 -2
  11. package/addon/components/map/leaflet-live-map.js +45 -32
  12. package/addon/components/orchestrator/phase-builder.js +2 -1
  13. package/addon/components/orchestrator-workbench.hbs +7 -1
  14. package/addon/components/orchestrator-workbench.js +16 -2
  15. package/addon/components/order/form/route.hbs +1 -1
  16. package/addon/components/order/form/route.js +13 -1
  17. package/addon/components/service-rate/details.hbs +1 -1
  18. package/addon/components/service-rate/form.hbs +1 -1
  19. package/addon/components/tracking-page/full-view.hbs +276 -0
  20. package/addon/components/tracking-page/full-view.js +474 -0
  21. package/addon/components/tracking-page/locale-selector.js +30 -0
  22. package/addon/components/tracking-page/map.hbs +44 -0
  23. package/addon/components/tracking-page/map.js +328 -0
  24. package/addon/components/tracking-page/order-list.hbs +35 -0
  25. package/addon/components/tracking-page/public-view.hbs +60 -0
  26. package/addon/components/tracking-page/settings-preview.hbs +21 -0
  27. package/addon/components/tracking-page/settings-preview.js +23 -0
  28. package/addon/components/tracking-page/verify-panel.hbs +109 -0
  29. package/addon/components/tracking-page.hbs +142 -0
  30. package/addon/components/tracking-page.js +564 -0
  31. package/addon/components/trailer/form.hbs +2 -2
  32. package/addon/components/vehicle/form.hbs +3 -3
  33. package/addon/components/warranty/form.hbs +2 -2
  34. package/addon/components/widget/live-fleet.js +54 -6
  35. package/addon/components/widget/proof-of-delivery.hbs +49 -0
  36. package/addon/components/widget/proof-of-delivery.js +62 -0
  37. package/addon/components/work-order/form.hbs +3 -3
  38. package/addon/controllers/operations/orders/index/details.js +19 -3
  39. package/addon/controllers/operations/scheduler/index.js +45 -14
  40. package/addon/controllers/settings/index.js +6 -0
  41. package/addon/controllers/settings/map.js +75 -0
  42. package/addon/controllers/settings/orchestrator.js +8 -6
  43. package/addon/controllers/settings/tracking-page.js +212 -0
  44. package/addon/extension.js +65 -1
  45. package/addon/helpers/parcel-box-image.js +16 -0
  46. package/addon/routes/operations/orders/index/new.js +5 -4
  47. package/addon/routes/operations/scheduler/index.js +1 -1
  48. package/addon/routes/settings/tracking-page.js +31 -0
  49. package/addon/routes.js +1 -0
  50. package/addon/services/location.js +69 -21
  51. package/addon/services/map-settings.js +28 -0
  52. package/addon/services/order-allocation.js +1 -1
  53. package/addon/styles/fleetops-engine.css +1391 -0
  54. package/addon/templates/settings/map.hbs +46 -0
  55. package/addon/templates/settings/tracking-page.hbs +318 -0
  56. package/addon/utils/identity-cell-resource.js +2 -56
  57. package/addon/utils/map-default-view.js +132 -0
  58. package/addon/utils/placeholder-images.js +4 -69
  59. package/addon/utils/resource-descriptors/assets.js +2 -57
  60. package/addon/utils/resource-descriptors/helpers.js +23 -122
  61. package/addon/utils/resource-descriptors/operations.js +2 -61
  62. package/addon/utils/resource-descriptors/people.js +3 -142
  63. package/addon/utils/resource-descriptors/shared.js +18 -0
  64. package/addon/utils/tracking-live-source.js +123 -0
  65. package/addon/utils/tracking-page-theme.js +123 -0
  66. package/app/components/admin/tracking-page-settings.js +1 -0
  67. package/app/components/tracking-page/full-view.js +1 -0
  68. package/app/components/tracking-page/locale-selector.js +1 -0
  69. package/app/components/tracking-page/map.js +1 -0
  70. package/app/components/tracking-page/order-list.js +1 -0
  71. package/app/components/tracking-page/public-view.js +1 -0
  72. package/app/components/tracking-page/settings-preview.js +1 -0
  73. package/app/components/tracking-page/verify-panel.js +1 -0
  74. package/app/components/tracking-page.js +1 -0
  75. package/app/components/widget/proof-of-delivery.js +1 -0
  76. package/app/controllers/settings/tracking-page.js +1 -0
  77. package/app/helpers/parcel-box-image.js +1 -0
  78. package/app/routes/settings/tracking-page.js +1 -0
  79. package/app/templates/settings/tracking-page.js +1 -0
  80. package/app/utils/map-default-view.js +1 -0
  81. package/app/utils/tracking-live-source.js +1 -0
  82. package/app/utils/tracking-page-theme.js +1 -0
  83. package/composer.json +2 -2
  84. package/extension.json +1 -1
  85. package/package.json +4 -4
  86. package/scripts/pest-bootstrap.php +4 -0
  87. package/server/config/fleetops.php +4 -0
  88. package/server/migrations/2026_10_08_000001_create_tracking_sessions_tables.php +51 -0
  89. package/server/migrations/2026_10_10_000001_add_trashed_index_to_device_events.php +40 -0
  90. package/server/migrations/2026_10_10_000002_add_trashed_index_to_positions.php +40 -0
  91. package/server/migrations/2026_10_12_000001_add_deleted_at_to_tracking_sessions_tables.php +32 -0
  92. package/server/resources/views/labels/default.php +2 -2
  93. package/server/resources/views/labels/entity-label.php +2 -2
  94. package/server/resources/views/labels/waypoint-label.php +2 -2
  95. package/server/src/Auth/Schemas/FleetOps.php +5 -0
  96. package/server/src/Console/Commands/ProcessOperationalAlerts.php +1 -0
  97. package/server/src/Console/Commands/PruneTelematicsData.php +101 -26
  98. package/server/src/Events/OrderChanged.php +257 -0
  99. package/server/src/Events/OrderDriverUnassigned.php +68 -0
  100. package/server/src/Exceptions/OrderEditLockedException.php +32 -0
  101. package/server/src/Expansions/CompanyExpansion.php +3 -2
  102. package/server/src/Expansions/UserExpansion.php +12 -10
  103. package/server/src/Http/Controllers/Api/v1/CustomerController.php +108 -18
  104. package/server/src/Http/Controllers/Api/v1/DriverController.php +95 -10
  105. package/server/src/Http/Controllers/Api/v1/EntityController.php +66 -0
  106. package/server/src/Http/Controllers/Api/v1/FleetController.php +10 -4
  107. package/server/src/Http/Controllers/Api/v1/OrderController.php +139 -36
  108. package/server/src/Http/Controllers/Api/v1/PayloadController.php +76 -8
  109. package/server/src/Http/Controllers/Api/v1/PlaceController.php +3 -3
  110. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +6 -32
  111. package/server/src/Http/Controllers/Api/v1/VehicleController.php +5 -0
  112. package/server/src/Http/Controllers/Internal/v1/ContactController.php +3 -0
  113. package/server/src/Http/Controllers/Internal/v1/DriverController.php +10 -0
  114. package/server/src/Http/Controllers/Internal/v1/FleetController.php +16 -2
  115. package/server/src/Http/Controllers/Internal/v1/InspectionSubmissionController.php +13 -8
  116. package/server/src/Http/Controllers/Internal/v1/IssueController.php +2 -0
  117. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +4 -2
  118. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +93 -11
  119. package/server/src/Http/Controllers/Internal/v1/OrderController.php +84 -24
  120. package/server/src/Http/Controllers/Internal/v1/PositionController.php +22 -0
  121. package/server/src/Http/Controllers/Internal/v1/ProofController.php +55 -4
  122. package/server/src/Http/Controllers/Internal/v1/SettingController.php +303 -10
  123. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +1 -0
  124. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +1 -0
  125. package/server/src/Http/Controllers/Public/TrackingController.php +518 -0
  126. package/server/src/Http/Filter/ContactFilter.php +1 -1
  127. package/server/src/Http/Filter/InspectionFormFilter.php +23 -0
  128. package/server/src/Http/Filter/InspectionSubmissionFilter.php +23 -0
  129. package/server/src/Http/Filter/MaintenanceFilter.php +23 -0
  130. package/server/src/Http/Filter/OrderFilter.php +39 -4
  131. package/server/src/Http/Filter/ProofFilter.php +18 -0
  132. package/server/src/Http/Filter/RouteFilter.php +18 -0
  133. package/server/src/Http/Filter/TelematicFilter.php +23 -0
  134. package/server/src/Http/Filter/WarrantyFilter.php +23 -0
  135. package/server/src/Http/Requests/CancelOrderRequest.php +2 -1
  136. package/server/src/Http/Resources/v1/Concerns/ResolvesPublicRelationFields.php +14 -1
  137. package/server/src/Http/Resources/v1/Index/Customer.php +18 -0
  138. package/server/src/Http/Resources/v1/Index/Order.php +11 -2
  139. package/server/src/Http/Resources/v1/PublicOrderTracking.php +153 -0
  140. package/server/src/Http/Resources/v1/TrackingNumber.php +8 -34
  141. package/server/src/Http/Resources/v1/Zone.php +31 -23
  142. package/server/src/Jobs/FinalizeApiOrderCreation.php +3 -1
  143. package/server/src/Jobs/ProcessAllocationJob.php +16 -6
  144. package/server/src/Jobs/PublishTrackingUpdate.php +50 -0
  145. package/server/src/Listeners/HandleGeofenceEntered.php +31 -15
  146. package/server/src/Listeners/HandleOrderCanceled.php +9 -1
  147. package/server/src/Listeners/HandleUserRemovedFromCompany.php +2 -1
  148. package/server/src/Listeners/PublishTrackingUpdates.php +27 -0
  149. package/server/src/Mail/CustomerCredentialsMail.php +4 -2
  150. package/server/src/Models/AssetConnection.php +3 -0
  151. package/server/src/Models/Contact.php +3 -0
  152. package/server/src/Models/Device.php +28 -0
  153. package/server/src/Models/DeviceEvent.php +7 -0
  154. package/server/src/Models/Driver.php +20 -7
  155. package/server/src/Models/Entity.php +12 -4
  156. package/server/src/Models/Fleet.php +11 -32
  157. package/server/src/Models/FleetDriver.php +3 -0
  158. package/server/src/Models/FleetVehicle.php +3 -0
  159. package/server/src/Models/FuelReport.php +5 -13
  160. package/server/src/Models/Issue.php +4 -16
  161. package/server/src/Models/Order.php +200 -9
  162. package/server/src/Models/Payload.php +227 -35
  163. package/server/src/Models/Place.php +7 -1
  164. package/server/src/Models/ServiceArea.php +7 -0
  165. package/server/src/Models/ServiceRate.php +7 -17
  166. package/server/src/Models/TrackingNumber.php +101 -2
  167. package/server/src/Models/TrackingSession.php +33 -0
  168. package/server/src/Models/TrackingSessionGrant.php +22 -0
  169. package/server/src/Models/TrackingStatus.php +6 -0
  170. package/server/src/Models/Vehicle.php +21 -2
  171. package/server/src/Models/Vendor.php +7 -0
  172. package/server/src/Models/Waypoint.php +13 -4
  173. package/server/src/Notifications/OrderAssigned.php +2 -1
  174. package/server/src/Notifications/OrderCanceled.php +7 -1
  175. package/server/src/Notifications/OrderChanged.php +87 -0
  176. package/server/src/Notifications/OrderCompleted.php +2 -1
  177. package/server/src/Notifications/OrderDispatchFailed.php +2 -1
  178. package/server/src/Notifications/OrderDispatched.php +2 -1
  179. package/server/src/Notifications/OrderFailed.php +2 -1
  180. package/server/src/Notifications/OrderUnassigned.php +66 -0
  181. package/server/src/Notifications/WaypointCompleted.php +2 -1
  182. package/server/src/Observers/CompanyUserObserver.php +8 -7
  183. package/server/src/Observers/DriverObserver.php +6 -1
  184. package/server/src/Observers/OrderObserver.php +141 -1
  185. package/server/src/Observers/TrackingNumberObserver.php +18 -6
  186. package/server/src/Observers/UserObserver.php +2 -1
  187. package/server/src/Observers/VehicleObserver.php +8 -3
  188. package/server/src/Orchestration/Engines/RouteSequencingEngine.php +21 -3
  189. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +38 -8
  190. package/server/src/Orchestration/OrchestrationEngineRegistry.php +61 -1
  191. package/server/src/Orchestration/Support/OrchestratorSettings.php +61 -0
  192. package/server/src/Orchestration/Support/RouteMetrics.php +165 -0
  193. package/server/src/Providers/EventServiceProvider.php +11 -0
  194. package/server/src/Providers/FleetOpsServiceProvider.php +13 -0
  195. package/server/src/Support/ApiCacheThrottle.php +76 -0
  196. package/server/src/Support/LiveOrderQuery.php +3 -1
  197. package/server/src/Support/OrderEdit.php +365 -0
  198. package/server/src/Support/OrderEditPolicy.php +292 -0
  199. package/server/src/Support/ProfileAccountManager.php +54 -1
  200. package/server/src/Support/ResolvesOrderServiceStops.php +5 -0
  201. package/server/src/Support/SocketChannels.php +346 -0
  202. package/server/src/Support/Telematics/TelematicService.php +7 -2
  203. package/server/src/Support/Telematics/Telemetry/Inbox.php +8 -1
  204. package/server/src/Support/TrackingChannel.php +55 -0
  205. package/server/src/Support/TrackingCode.php +242 -0
  206. package/server/src/Support/TrackingPage/TrackingAccess.php +356 -0
  207. package/server/src/Support/TrackingPage/TrackingPageConfig.php +264 -0
  208. package/server/src/Support/TrackingPage/TrackingRecipient.php +111 -0
  209. package/server/src/Support/TrackingPage/TrackingResolver.php +201 -0
  210. package/server/src/Support/TrackingPage/TrackingTarget.php +40 -0
  211. package/server/src/Support/TrackingPage/TrackingView.php +543 -0
  212. package/server/src/Support/TrackingPublisher.php +261 -0
  213. package/server/src/Support/TrackingScope.php +182 -0
  214. package/server/src/Support/TrackingUpdate.php +402 -0
  215. package/server/src/Support/Utils.php +15 -3
  216. package/server/src/Traits/HasTrackingNumber.php +2 -0
  217. package/server/src/routes.php +39 -7
  218. package/server/tests/ApiCustomerControllerContractsTest.php +54 -7
  219. package/server/tests/ApiDriverPasswordContractsTest.php +25 -21
  220. package/server/tests/ApiEntityControllerContractsTest.php +84 -0
  221. package/server/tests/ApiOrderControllerContractsTest.php +245 -0
  222. package/server/tests/ApiPayloadControllerContractsTest.php +121 -0
  223. package/server/tests/ApiPlaceControllerContractsTest.php +1 -1
  224. package/server/tests/ApiTrackingNumberControllerContractsTest.php +6 -9
  225. package/server/tests/CompactResourceSerializationTest.php +23 -59
  226. package/server/tests/ControllerFilterContractsTest.php +1 -1
  227. package/server/tests/CustomerContactIdentitySafetyTest.php +1 -1
  228. package/server/tests/EventContractsTest.php +26 -60
  229. package/server/tests/ExpansionContractsTest.php +15 -2
  230. package/server/tests/Feature/Http/Api/CustomerControllerHelperSeamsTest.php +29 -3
  231. package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +23 -0
  232. package/server/tests/Feature/Http/Api/OrderControllerNearbyFiltersTest.php +16 -16
  233. package/server/tests/Feature/Http/Api/OrderControllerQueryFiltersTest.php +41 -14
  234. package/server/tests/Feature/Http/Api/TrackingNumberControllerHelpersTest.php +57 -22
  235. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +23 -9
  236. package/server/tests/Feature/Http/Internal/OrchestrationControllerContractsTest.php +171 -1
  237. package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +110 -14
  238. package/server/tests/Feature/Http/Internal/OrderControllerHelpersTest.php +7 -5
  239. package/server/tests/Feature/Http/Internal/PositionControllerReplayChannelTest.php +135 -0
  240. package/server/tests/Feature/Http/Internal/ProofControllerContractsTest.php +3 -3
  241. package/server/tests/Feature/Http/Internal/ProofControllerRecentTest.php +170 -0
  242. package/server/tests/Feature/Http/Public/TrackingControllerTest.php +495 -0
  243. package/server/tests/IndexCustomerPhotoTest.php +151 -0
  244. package/server/tests/ModelAccessorContractsTest.php +4 -3
  245. package/server/tests/NotificationAndMailContractsTest.php +5 -8
  246. package/server/tests/ObserverContractsTest.php +72 -10
  247. package/server/tests/OrderActivityFlowRegressionTest.php +3 -2
  248. package/server/tests/OrderFilterExecutionTest.php +167 -2
  249. package/server/tests/ProcessAllocationJobContractsTest.php +20 -0
  250. package/server/tests/PublicOrderTrackingResourceTest.php +221 -0
  251. package/server/tests/QueueJobContractsTest.php +2 -1
  252. package/server/tests/RequestContractsTest.php +1 -1
  253. package/server/tests/RouteRegistrationExecutionTest.php +26 -0
  254. package/server/tests/RouteSequencingEngineTest.php +17 -0
  255. package/server/tests/SettingControllerContractsTest.php +110 -0
  256. package/server/tests/Support/TrackingPageDatabase.php +200 -0
  257. package/server/tests/TenantScopingTest.php +206 -0
  258. package/server/tests/TrackingPageSettingsTest.php +343 -0
  259. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +51 -0
  260. package/server/tests/Unit/Http/Filter/ContactFilterAddressTest.php +61 -0
  261. package/server/tests/Unit/Http/Resources/IndexOrderResourceTest.php +30 -0
  262. package/server/tests/Unit/Jobs/FinalizeApiOrderCreationDispatchGuardTest.php +266 -0
  263. package/server/tests/Unit/Listeners/HandleGeofenceEnteredTest.php +182 -22
  264. package/server/tests/Unit/Listeners/HandleUserRemovedFromCompanyTest.php +5 -0
  265. package/server/tests/Unit/Models/DriverAssignVehicleTest.php +81 -0
  266. package/server/tests/Unit/Models/FleetTest.php +4 -3
  267. package/server/tests/Unit/Models/OrderCancelReasonTest.php +143 -0
  268. package/server/tests/Unit/Models/OrderPayloadConfigAndDistanceTest.php +60 -0
  269. package/server/tests/Unit/Models/OrderPayloadRouteTest.php +4 -2
  270. package/server/tests/Unit/Models/PayloadTest.php +18 -4
  271. package/server/tests/Unit/Models/ServiceRatePersistenceAndServicabilityTest.php +2 -2
  272. package/server/tests/Unit/Models/TrackingNumberTest.php +67 -6
  273. package/server/tests/Unit/Models/VehicleTest.php +16 -2
  274. package/server/tests/Unit/Models/WaypointTest.php +4 -3
  275. package/server/tests/Unit/Notifications/OrderChangeNotificationsTest.php +59 -0
  276. package/server/tests/Unit/Notifications/TerminalOrderNotificationsTest.php +3 -3
  277. package/server/tests/Unit/Observers/DriverDeletionCleanupTest.php +158 -0
  278. package/server/tests/Unit/Observers/FleetOpsCompanyUserAndServiceAreaObserversTest.php +20 -0
  279. package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +3 -3
  280. package/server/tests/Unit/Observers/OrderAssignmentObserverTest.php +100 -0
  281. package/server/tests/Unit/Observers/OrderDeleteCascadeTest.php +213 -0
  282. package/server/tests/Unit/Observers/VehicleObserverDeleteTest.php +67 -0
  283. package/server/tests/Unit/Orchestration/EngineSelectionAndRouteMetricsTest.php +336 -0
  284. package/server/tests/Unit/Orchestration/Engines/VroomOrchestrationEngineLifecycleTest.php +8 -1
  285. package/server/tests/Unit/Support/ApiCacheDependenciesTest.php +347 -0
  286. package/server/tests/Unit/Support/OrderEditPolicyTest.php +156 -0
  287. package/server/tests/Unit/Support/OrderOperationsTest.php +514 -0
  288. package/server/tests/Unit/Support/OsrmProofAndIssueFilterTest.php +4 -3
  289. package/server/tests/Unit/Support/ProfileAccountManagerTest.php +141 -0
  290. package/server/tests/Unit/Support/QuerySeamsTest.php +5 -1
  291. package/server/tests/Unit/Support/SocketChannelsTest.php +396 -0
  292. package/server/tests/Unit/Support/TrackingChannelTest.php +232 -0
  293. package/server/tests/Unit/Support/TrackingCodeTest.php +186 -0
  294. package/server/tests/Unit/Support/TrackingPage/TrackingAccessTest.php +200 -0
  295. package/server/tests/Unit/Support/TrackingPage/TrackingRecipientTest.php +51 -0
  296. package/server/tests/Unit/Support/TrackingPage/TrackingResolverTest.php +181 -0
  297. package/server/tests/Unit/Support/TrackingPage/TrackingViewTest.php +479 -0
  298. package/server/tests/Unit/Support/TrackingPublisherTest.php +425 -0
  299. package/server/tests/Unit/Support/TrackingUpdateTest.php +363 -0
  300. package/server/tests/Unit/Support/UtilsAdditionalTest.php +9 -0
  301. package/server/tests/Unit/Support/UtilsGeoMatrixAndVendorTest.php +25 -0
  302. package/server/tests/VehicleResourceContractsTest.php +46 -0
  303. package/server/tests/VroomOrchestrationEngineTest.php +34 -1
  304. package/server/tests/ZoneGeofenceSettingsResourceTest.php +121 -0
  305. package/translations/ar-ae.yml +274 -0
  306. package/translations/bg-bg.yaml +274 -0
  307. package/translations/en-us.yaml +287 -0
  308. package/translations/es-pa.yaml +274 -0
  309. package/translations/fr-fr.yaml +274 -0
  310. package/translations/mn-mn.yaml +274 -0
  311. package/translations/pt-br.yaml +274 -0
  312. package/translations/ru-ru.yaml +276 -2
  313. package/translations/uk-ua.yaml +275 -1
  314. package/translations/vi-vn.yaml +274 -0
  315. package/addon/components/cell/contact-identity.hbs +0 -1
  316. package/addon/components/cell/customer-identity.hbs +0 -1
  317. package/addon/components/cell/driver-identity.hbs +0 -1
  318. package/addon/components/cell/fleet-identity.hbs +0 -1
  319. package/addon/components/cell/order-identity.hbs +0 -1
  320. package/addon/components/cell/place-identity.hbs +0 -1
  321. package/addon/components/cell/vehicle-identity.hbs +0 -1
  322. package/addon/components/cell/vendor-identity.hbs +0 -1
  323. package/addon/components/contact/pill.hbs +0 -24
  324. package/addon/components/contact/summary.hbs +0 -1
  325. package/addon/components/customer/pill.hbs +0 -24
  326. package/addon/components/customer/summary.hbs +0 -1
  327. package/addon/components/driver/pill.hbs +0 -24
  328. package/addon/components/driver/summary.hbs +0 -1
  329. package/addon/components/fleet/pill.hbs +0 -24
  330. package/addon/components/fleet/summary.hbs +0 -1
  331. package/addon/components/order/pill.hbs +0 -24
  332. package/addon/components/order/summary.hbs +0 -1
  333. package/addon/components/place/pill.hbs +0 -24
  334. package/addon/components/place/summary.hbs +0 -1
  335. package/addon/components/select-option/contact.hbs +0 -12
  336. package/addon/components/select-option/customer.hbs +0 -12
  337. package/addon/components/select-option/driver.hbs +0 -12
  338. package/addon/components/select-option/fleet.hbs +0 -12
  339. package/addon/components/select-option/order.hbs +0 -12
  340. package/addon/components/select-option/place.hbs +0 -12
  341. package/addon/components/select-option/vehicle.hbs +0 -12
  342. package/addon/components/select-option/vendor.hbs +0 -12
  343. package/addon/components/vehicle/pill.hbs +0 -24
  344. package/addon/components/vehicle/summary.hbs +0 -1
  345. package/addon/components/vendor/pill.hbs +0 -24
  346. package/addon/components/vendor/summary.hbs +0 -1
  347. package/app/components/cell/contact-identity.js +0 -1
  348. package/app/components/cell/customer-identity.js +0 -1
  349. package/app/components/cell/driver-identity.js +0 -1
  350. package/app/components/cell/fleet-identity.js +0 -1
  351. package/app/components/cell/order-identity.js +0 -1
  352. package/app/components/cell/place-identity.js +0 -1
  353. package/app/components/cell/vehicle-identity.js +0 -1
  354. package/app/components/cell/vendor-identity.js +0 -1
  355. package/app/components/contact/pill.js +0 -1
  356. package/app/components/contact/summary.js +0 -1
  357. package/app/components/customer/pill.js +0 -1
  358. package/app/components/customer/summary.js +0 -1
  359. package/app/components/driver/pill.js +0 -1
  360. package/app/components/driver/summary.js +0 -1
  361. package/app/components/fleet/pill.js +0 -1
  362. package/app/components/fleet/summary.js +0 -1
  363. package/app/components/order/pill.js +0 -1
  364. package/app/components/order/summary.js +0 -1
  365. package/app/components/place/pill.js +0 -1
  366. package/app/components/place/summary.js +0 -1
  367. package/app/components/select-option/contact.js +0 -1
  368. package/app/components/select-option/customer.js +0 -1
  369. package/app/components/select-option/driver.js +0 -1
  370. package/app/components/select-option/fleet.js +0 -1
  371. package/app/components/select-option/order.js +0 -1
  372. package/app/components/select-option/place.js +0 -1
  373. package/app/components/select-option/vehicle.js +0 -1
  374. package/app/components/select-option/vendor.js +0 -1
  375. package/app/components/vehicle/pill.js +0 -1
  376. package/app/components/vehicle/summary.js +0 -1
  377. package/app/components/vendor/pill.js +0 -1
  378. package/app/components/vendor/summary.js +0 -1
@@ -12429,3 +12429,1394 @@ body[data-theme='dark'] .resource-list-pill .fleetbase-pill-body .resource-pill-
12429
12429
  font-size: 0.875rem;
12430
12430
  line-height: 1rem;
12431
12431
  }
12432
+
12433
+ /* Customer tracking page settings preview: colours come from the --tp-* tokens on the root. */
12434
+ .tp-preview {
12435
+ border: 1px solid var(--tp-border);
12436
+ border-radius: 1.25rem;
12437
+ overflow: hidden;
12438
+ background: var(--tp-bg);
12439
+ color: var(--tp-text);
12440
+ font-size: 0.75rem;
12441
+ }
12442
+
12443
+ .tp-preview-header {
12444
+ display: flex;
12445
+ align-items: center;
12446
+ gap: 0.5rem;
12447
+ padding: 0.625rem 0.875rem;
12448
+ background: var(--tp-surface);
12449
+ border-bottom: 1px solid var(--tp-border);
12450
+ }
12451
+
12452
+ .tp-preview-monogram {
12453
+ display: inline-flex;
12454
+ align-items: center;
12455
+ justify-content: center;
12456
+ width: 1.75rem;
12457
+ height: 1.75rem;
12458
+ border-radius: 0.5rem;
12459
+ background: var(--tp-accent);
12460
+ color: var(--tp-ink);
12461
+ font-weight: 700;
12462
+ font-size: 0.6875rem;
12463
+ }
12464
+
12465
+ .tp-preview-name {
12466
+ font-weight: 700;
12467
+ font-size: 0.8125rem;
12468
+ }
12469
+
12470
+ .tp-preview-body {
12471
+ display: flex;
12472
+ flex-direction: column;
12473
+ align-items: flex-start;
12474
+ gap: 0.5rem;
12475
+ padding: 0.875rem;
12476
+ }
12477
+
12478
+ .tp-preview-chip {
12479
+ padding: 0.125rem 0.5rem;
12480
+ border-radius: 999px;
12481
+ background: var(--tp-accent-soft);
12482
+ color: var(--tp-accent);
12483
+ font-weight: 600;
12484
+ }
12485
+
12486
+ .tp-preview-headline {
12487
+ font-size: 1.125rem;
12488
+ font-weight: 700;
12489
+ letter-spacing: -0.02em;
12490
+ }
12491
+
12492
+ .tp-preview-sub {
12493
+ color: var(--tp-muted);
12494
+ }
12495
+
12496
+ .tp-preview-steps {
12497
+ display: grid;
12498
+ grid-template-columns: repeat(4, minmax(0, 1fr));
12499
+ gap: 0.25rem;
12500
+ width: 100%;
12501
+ }
12502
+
12503
+ .tp-preview-step {
12504
+ height: 0.25rem;
12505
+ border-radius: 999px;
12506
+ background: var(--tp-border);
12507
+ }
12508
+
12509
+ .tp-preview-step-done {
12510
+ background: var(--tp-accent);
12511
+ }
12512
+
12513
+ .tp-preview-button {
12514
+ align-self: stretch;
12515
+ padding: 0.5rem;
12516
+ border-radius: 0.625rem;
12517
+ background: var(--tp-accent);
12518
+ color: var(--tp-ink);
12519
+ font-weight: 600;
12520
+ text-align: center;
12521
+ }
12522
+
12523
+ .tp-preview-footer {
12524
+ padding: 0.5rem 0.875rem 0.75rem;
12525
+ color: var(--tp-muted);
12526
+ text-align: center;
12527
+ font-size: 0.6875rem;
12528
+ }
12529
+
12530
+ /* Customer tracking page. Colours come from the --tp-* tokens the page sets from its company's branding. */
12531
+ .tp-root {
12532
+ display: flex;
12533
+ flex-direction: column;
12534
+ min-height: 100vh;
12535
+ background: var(--tp-bg);
12536
+ color: var(--tp-text);
12537
+ font-size: 1rem;
12538
+ line-height: 1.5;
12539
+ }
12540
+
12541
+ .tp-root a {
12542
+ color: var(--tp-accent);
12543
+ font-weight: 600;
12544
+ }
12545
+
12546
+ .tp-root h1,
12547
+ .tp-root h2,
12548
+ .tp-root h3,
12549
+ .tp-root p,
12550
+ .tp-root dl,
12551
+ .tp-root dd,
12552
+ .tp-root figure,
12553
+ .tp-root fieldset {
12554
+ margin: 0;
12555
+ }
12556
+
12557
+ .tp-root fieldset {
12558
+ border: 0;
12559
+ padding: 0;
12560
+ }
12561
+
12562
+ .tp-header {
12563
+ display: flex;
12564
+ align-items: center;
12565
+ justify-content: space-between;
12566
+ gap: 0.75rem;
12567
+ padding: 0.75rem 1rem;
12568
+ background: var(--tp-surface);
12569
+ border-bottom: 1px solid var(--tp-border);
12570
+ }
12571
+
12572
+ .tp-header-actions {
12573
+ display: flex;
12574
+ align-items: center;
12575
+ gap: 0.5rem;
12576
+ }
12577
+
12578
+ /* The console's locale switcher, in the page's own colours. */
12579
+ .tp-root .tp-locale-selector .next-org-button-trigger {
12580
+ color: var(--tp-text);
12581
+ }
12582
+
12583
+ .tp-root .tp-locale-selector .next-org-button-trigger:hover,
12584
+ .tp-root .tp-locale-selector .next-org-button-trigger.is-open {
12585
+ background: var(--tp-surface2);
12586
+ }
12587
+
12588
+ .tp-brand {
12589
+ display: flex;
12590
+ align-items: center;
12591
+ gap: 0.625rem;
12592
+ min-width: 0;
12593
+ }
12594
+
12595
+ .tp-brand-logo {
12596
+ height: 2rem;
12597
+ max-width: 8rem;
12598
+ object-fit: contain;
12599
+ }
12600
+
12601
+ .tp-brand-monogram {
12602
+ display: inline-flex;
12603
+ align-items: center;
12604
+ justify-content: center;
12605
+ width: 2rem;
12606
+ height: 2rem;
12607
+ flex: none;
12608
+ border-radius: 0.5rem;
12609
+ background: var(--tp-accent);
12610
+ color: var(--tp-ink);
12611
+ font-size: 0.8125rem;
12612
+ font-weight: 700;
12613
+ }
12614
+
12615
+ .tp-brand-name {
12616
+ overflow: hidden;
12617
+ font-weight: 700;
12618
+ white-space: nowrap;
12619
+ text-overflow: ellipsis;
12620
+ }
12621
+
12622
+ .tp-main {
12623
+ flex: 1;
12624
+ width: 100%;
12625
+ max-width: 77.5rem;
12626
+ margin: 0 auto;
12627
+ box-sizing: border-box;
12628
+ padding: 1.25rem 1rem;
12629
+ }
12630
+
12631
+ .tp-narrow {
12632
+ width: 100%;
12633
+ max-width: 30rem;
12634
+ margin: 0 auto;
12635
+ }
12636
+
12637
+ .tp-wide {
12638
+ width: 100%;
12639
+ max-width: 55rem;
12640
+ margin: 0 auto;
12641
+ }
12642
+
12643
+ .tp-stack {
12644
+ display: flex;
12645
+ flex-direction: column;
12646
+ gap: 1.25rem;
12647
+ }
12648
+
12649
+ .tp-stack-sm {
12650
+ display: flex;
12651
+ flex-direction: column;
12652
+ gap: 0.75rem;
12653
+ }
12654
+
12655
+ .tp-stack-xs {
12656
+ display: flex;
12657
+ flex-direction: column;
12658
+ gap: 0.25rem;
12659
+ min-width: 0;
12660
+ }
12661
+
12662
+ .tp-row {
12663
+ display: flex;
12664
+ align-items: center;
12665
+ gap: 0.75rem;
12666
+ }
12667
+
12668
+ .tp-row-wrap {
12669
+ display: flex;
12670
+ flex-wrap: wrap;
12671
+ align-items: center;
12672
+ gap: 0.5rem 1rem;
12673
+ }
12674
+
12675
+ .tp-row-between {
12676
+ display: flex;
12677
+ align-items: center;
12678
+ justify-content: space-between;
12679
+ gap: 0.75rem;
12680
+ }
12681
+
12682
+ .tp-row-end {
12683
+ display: flex;
12684
+ justify-content: flex-end;
12685
+ gap: 0.5rem;
12686
+ }
12687
+
12688
+ .tp-baseline {
12689
+ align-items: baseline;
12690
+ }
12691
+
12692
+ .tp-grow {
12693
+ flex: 1 1 12rem;
12694
+ min-width: 0;
12695
+ }
12696
+
12697
+ .tp-self-start {
12698
+ align-self: flex-start;
12699
+ }
12700
+
12701
+ .tp-top-border {
12702
+ padding-top: 0.75rem;
12703
+ border-top: 1px solid var(--tp-border);
12704
+ }
12705
+
12706
+ .tp-h1 {
12707
+ font-size: 1.875rem;
12708
+ font-weight: 700;
12709
+ line-height: 1.15;
12710
+ letter-spacing: -0.02em;
12711
+ text-wrap: balance;
12712
+ }
12713
+
12714
+ .tp-h2 {
12715
+ font-size: 1.375rem;
12716
+ font-weight: 700;
12717
+ line-height: 1.2;
12718
+ }
12719
+
12720
+ .tp-h3 {
12721
+ font-size: 1.0625rem;
12722
+ font-weight: 700;
12723
+ }
12724
+
12725
+ .tp-headline {
12726
+ font-size: 2rem;
12727
+ font-weight: 700;
12728
+ line-height: 1.08;
12729
+ letter-spacing: -0.03em;
12730
+ text-wrap: balance;
12731
+ }
12732
+
12733
+ .tp-subline {
12734
+ font-size: 1.0625rem;
12735
+ font-weight: 500;
12736
+ }
12737
+
12738
+ .tp-eyebrow {
12739
+ color: var(--tp-muted);
12740
+ font-size: 0.8125rem;
12741
+ font-weight: 600;
12742
+ letter-spacing: 0.06em;
12743
+ text-transform: uppercase;
12744
+ }
12745
+
12746
+ .tp-label {
12747
+ font-size: 0.875rem;
12748
+ font-weight: 600;
12749
+ }
12750
+
12751
+ .tp-small {
12752
+ font-size: 0.875rem;
12753
+ }
12754
+
12755
+ .tp-muted {
12756
+ color: var(--tp-muted);
12757
+ }
12758
+
12759
+ .tp-strong {
12760
+ font-weight: 600;
12761
+ }
12762
+
12763
+ .tp-mono {
12764
+ font-family: ui-monospace, sfmono-regular, menlo, monospace;
12765
+ letter-spacing: 0.02em;
12766
+ }
12767
+
12768
+ .tp-accent-text {
12769
+ color: var(--tp-accent);
12770
+ }
12771
+
12772
+ .tp-warn-text {
12773
+ color: var(--tp-warn);
12774
+ }
12775
+
12776
+ .tp-sr-only {
12777
+ position: absolute;
12778
+ width: 1px;
12779
+ height: 1px;
12780
+ overflow: hidden;
12781
+ clip-path: inset(50%);
12782
+ }
12783
+
12784
+ .tp-touch {
12785
+ display: inline-flex;
12786
+ align-items: center;
12787
+ min-height: 2.75rem;
12788
+ }
12789
+
12790
+ .tp-card {
12791
+ padding: 1.125rem;
12792
+ border: 1px solid var(--tp-border);
12793
+ border-radius: 1.125rem;
12794
+ background: var(--tp-surface);
12795
+ }
12796
+
12797
+ .tp-card-tight {
12798
+ padding: 0.75rem 0.875rem;
12799
+ border-radius: 0.875rem;
12800
+ }
12801
+
12802
+ .tp-card-accent {
12803
+ border: 2px solid var(--tp-accent);
12804
+ }
12805
+
12806
+ .tp-card-grid {
12807
+ display: grid;
12808
+ grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
12809
+ gap: 0.75rem;
12810
+ }
12811
+
12812
+ .tp-input {
12813
+ width: 100%;
12814
+ min-height: 3.25rem;
12815
+ box-sizing: border-box;
12816
+ padding: 0 0.875rem;
12817
+ border: 1.5px solid var(--tp-border);
12818
+ border-radius: 0.75rem;
12819
+ background: var(--tp-surface);
12820
+ color: var(--tp-text);
12821
+ font-size: 1rem;
12822
+ }
12823
+
12824
+ .tp-textarea {
12825
+ padding: 0.75rem;
12826
+ resize: vertical;
12827
+ }
12828
+
12829
+ .tp-button {
12830
+ display: inline-flex;
12831
+ align-items: center;
12832
+ justify-content: center;
12833
+ gap: 0.5rem;
12834
+ min-height: 3rem;
12835
+ box-sizing: border-box;
12836
+ padding: 0 1rem;
12837
+ border: 1.5px solid var(--tp-border);
12838
+ border-radius: 0.75rem;
12839
+ background: var(--tp-surface);
12840
+ color: var(--tp-text);
12841
+ font-size: 1rem;
12842
+ font-weight: 600;
12843
+ text-align: center;
12844
+ text-decoration: none;
12845
+ cursor: pointer;
12846
+ }
12847
+
12848
+ .tp-root a.tp-button {
12849
+ color: var(--tp-text);
12850
+ }
12851
+
12852
+ .tp-button:disabled {
12853
+ cursor: not-allowed;
12854
+ opacity: 0.5;
12855
+ }
12856
+
12857
+ .tp-button-primary,
12858
+ .tp-root a.tp-button-primary {
12859
+ border-color: var(--tp-accent);
12860
+ background: var(--tp-accent);
12861
+ color: var(--tp-ink);
12862
+ }
12863
+
12864
+ .tp-button-small {
12865
+ min-height: 2.75rem;
12866
+ padding: 0 0.75rem;
12867
+ font-size: 0.875rem;
12868
+ }
12869
+
12870
+ .tp-link-button {
12871
+ min-height: 2.75rem;
12872
+ padding: 0 0.25rem;
12873
+ border: 0;
12874
+ background: transparent;
12875
+ color: var(--tp-accent);
12876
+ font-size: 0.9375rem;
12877
+ font-weight: 600;
12878
+ cursor: pointer;
12879
+ }
12880
+
12881
+ .tp-back {
12882
+ display: inline-flex;
12883
+ align-items: center;
12884
+ align-self: flex-start;
12885
+ gap: 0.375rem;
12886
+ min-height: 2.75rem;
12887
+ border: 0;
12888
+ background: transparent;
12889
+ color: var(--tp-text);
12890
+ font-weight: 600;
12891
+ cursor: pointer;
12892
+ }
12893
+
12894
+ .tp-chip {
12895
+ display: inline-flex;
12896
+ align-items: center;
12897
+ align-self: flex-start;
12898
+ gap: 0.375rem;
12899
+ min-height: 2rem;
12900
+ padding: 0 0.75rem;
12901
+ border: 0;
12902
+ border-radius: 999px;
12903
+ background: var(--tp-surface2);
12904
+ color: var(--tp-text);
12905
+ font-size: 0.8125rem;
12906
+ font-weight: 600;
12907
+ }
12908
+
12909
+ .tp-chip-accent,
12910
+ .tp-chip-button {
12911
+ background: var(--tp-accent-soft);
12912
+ color: var(--tp-accent);
12913
+ }
12914
+
12915
+ .tp-chip-button {
12916
+ align-self: center;
12917
+ cursor: pointer;
12918
+ }
12919
+
12920
+ .tp-chip-warn {
12921
+ background: var(--tp-warn-soft);
12922
+ color: var(--tp-warn);
12923
+ }
12924
+
12925
+ .tp-notice {
12926
+ display: flex;
12927
+ gap: 0.625rem;
12928
+ padding: 0.75rem 0.875rem;
12929
+ border-radius: 0.75rem;
12930
+ background: var(--tp-surface2);
12931
+ font-size: 0.9375rem;
12932
+ }
12933
+
12934
+ .tp-notice-warn {
12935
+ background: var(--tp-warn-soft);
12936
+ }
12937
+
12938
+ .tp-icon-badge {
12939
+ display: inline-flex;
12940
+ align-items: center;
12941
+ justify-content: center;
12942
+ width: 3rem;
12943
+ height: 3rem;
12944
+ flex: none;
12945
+ border-radius: 0.875rem;
12946
+ background: var(--tp-accent-soft);
12947
+ color: var(--tp-accent);
12948
+ }
12949
+
12950
+ .tp-icon-badge-solid {
12951
+ background: var(--tp-accent);
12952
+ color: var(--tp-ink);
12953
+ }
12954
+
12955
+ .tp-icon-badge-warn {
12956
+ background: var(--tp-warn-soft);
12957
+ color: var(--tp-warn);
12958
+ }
12959
+
12960
+ .tp-icon-badge-soft {
12961
+ width: 2.5rem;
12962
+ height: 2.5rem;
12963
+ border-radius: 0.75rem;
12964
+ }
12965
+
12966
+ .tp-divider {
12967
+ display: flex;
12968
+ align-items: center;
12969
+ gap: 0.75rem;
12970
+ color: var(--tp-muted);
12971
+ font-size: 0.8125rem;
12972
+ }
12973
+
12974
+ .tp-divider::before,
12975
+ .tp-divider::after {
12976
+ content: '';
12977
+ flex: 1;
12978
+ height: 1px;
12979
+ background: var(--tp-border);
12980
+ }
12981
+
12982
+ .tp-skeleton {
12983
+ border-radius: 0.5rem;
12984
+ background: var(--tp-surface2);
12985
+ }
12986
+
12987
+ .tp-skeleton-title {
12988
+ width: 55%;
12989
+ height: 1.75rem;
12990
+ }
12991
+
12992
+ .tp-skeleton-line {
12993
+ width: 80%;
12994
+ height: 0.75rem;
12995
+ margin-top: 0.75rem;
12996
+ }
12997
+
12998
+ .tp-skeleton-card {
12999
+ height: 9rem;
13000
+ margin-top: 1.25rem;
13001
+ border-radius: 1.125rem;
13002
+ }
13003
+
13004
+ .tp-skeleton-row {
13005
+ height: 4.5rem;
13006
+ border-radius: 0.875rem;
13007
+ }
13008
+
13009
+ .tp-coarse {
13010
+ display: grid;
13011
+ grid-template-columns: repeat(3, minmax(0, 1fr));
13012
+ gap: 0.375rem;
13013
+ }
13014
+
13015
+ .tp-coarse-bar {
13016
+ height: 0.375rem;
13017
+ border-radius: 999px;
13018
+ background: var(--tp-border);
13019
+ }
13020
+
13021
+ .tp-coarse-done {
13022
+ background: var(--tp-accent);
13023
+ }
13024
+
13025
+ .tp-locked-grid {
13026
+ display: grid;
13027
+ grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
13028
+ gap: 0.75rem;
13029
+ }
13030
+
13031
+ .tp-locked {
13032
+ position: relative;
13033
+ min-height: 9rem;
13034
+ overflow: hidden;
13035
+ border: 1px solid var(--tp-border);
13036
+ border-radius: 1.125rem;
13037
+ background: var(--tp-surface);
13038
+ }
13039
+
13040
+ .tp-locked-blur {
13041
+ position: absolute;
13042
+ inset: 0;
13043
+ padding: 1.25rem;
13044
+ filter: blur(6px);
13045
+ }
13046
+
13047
+ .tp-locked-overlay {
13048
+ position: relative;
13049
+ display: flex;
13050
+ flex-direction: column;
13051
+ align-items: center;
13052
+ justify-content: center;
13053
+ gap: 0.5rem;
13054
+ min-height: 9rem;
13055
+ padding: 1rem;
13056
+ text-align: center;
13057
+ }
13058
+
13059
+ .tp-option {
13060
+ display: flex;
13061
+ align-items: center;
13062
+ gap: 0.875rem;
13063
+ min-height: 4rem;
13064
+ box-sizing: border-box;
13065
+ padding: 0.75rem 1rem;
13066
+ border: 1.5px solid var(--tp-border);
13067
+ border-radius: 0.875rem;
13068
+ background: var(--tp-surface);
13069
+ cursor: pointer;
13070
+ }
13071
+
13072
+ .tp-option-selected {
13073
+ border: 2px solid var(--tp-accent);
13074
+ background: var(--tp-accent-soft);
13075
+ }
13076
+
13077
+ .tp-option input {
13078
+ width: 1.25rem;
13079
+ height: 1.25rem;
13080
+ margin: 0;
13081
+ accent-color: var(--tp-accent);
13082
+ }
13083
+
13084
+ .tp-otp {
13085
+ position: relative;
13086
+ max-width: 23.75rem;
13087
+ }
13088
+
13089
+ .tp-otp-input {
13090
+ position: absolute;
13091
+ inset: 0;
13092
+ z-index: 1;
13093
+ width: 100%;
13094
+ height: 100%;
13095
+ font-size: 1rem;
13096
+ opacity: 0;
13097
+ cursor: text;
13098
+ }
13099
+
13100
+ .tp-otp-boxes {
13101
+ display: grid;
13102
+ grid-template-columns: repeat(6, minmax(0, 1fr));
13103
+ gap: 0.5rem;
13104
+ }
13105
+
13106
+ .tp-otp-box {
13107
+ display: flex;
13108
+ align-items: center;
13109
+ justify-content: center;
13110
+ height: 3.625rem;
13111
+ box-sizing: border-box;
13112
+ border: 1.5px solid var(--tp-border);
13113
+ border-radius: 0.75rem;
13114
+ background: var(--tp-surface);
13115
+ font-family: ui-monospace, sfmono-regular, menlo, monospace;
13116
+ font-size: 1.5rem;
13117
+ font-weight: 600;
13118
+ }
13119
+
13120
+ .tp-otp-box-active {
13121
+ border: 2px solid var(--tp-accent);
13122
+ box-shadow: 0 0 0 4px var(--tp-accent-soft);
13123
+ }
13124
+
13125
+ .tp-otp-box-wrong {
13126
+ border: 2px solid var(--tp-warn);
13127
+ }
13128
+
13129
+ .tp-otp-box-success {
13130
+ border-color: var(--tp-accent);
13131
+ background: var(--tp-accent);
13132
+ color: var(--tp-ink);
13133
+ }
13134
+
13135
+ .tp-otp-box-locked {
13136
+ background: var(--tp-surface2);
13137
+ color: var(--tp-muted);
13138
+ }
13139
+
13140
+ .tp-full {
13141
+ display: grid;
13142
+ grid-template-columns: minmax(0, 1fr);
13143
+ grid-template-areas: 'chips' 'head' 'map' 'body';
13144
+ gap: 1.125rem;
13145
+ }
13146
+
13147
+ .tp-full-chips {
13148
+ grid-area: chips;
13149
+ }
13150
+
13151
+ .tp-full-head {
13152
+ display: flex;
13153
+ flex-direction: column;
13154
+ grid-area: head;
13155
+ gap: 1.125rem;
13156
+ min-width: 0;
13157
+ }
13158
+
13159
+ .tp-full-map {
13160
+ grid-area: map;
13161
+ min-width: 0;
13162
+ }
13163
+
13164
+ .tp-full-body {
13165
+ display: flex;
13166
+ flex-direction: column;
13167
+ grid-area: body;
13168
+ gap: 1rem;
13169
+ min-width: 0;
13170
+ }
13171
+
13172
+ .tp-segmented {
13173
+ display: flex;
13174
+ flex-wrap: wrap;
13175
+ gap: 0.25rem;
13176
+ align-self: flex-start;
13177
+ padding: 0.25rem;
13178
+ border-radius: 0.75rem;
13179
+ background: var(--tp-surface2);
13180
+ }
13181
+
13182
+ .tp-segment {
13183
+ display: inline-flex;
13184
+ align-items: center;
13185
+ gap: 0.375rem;
13186
+ min-height: 2.5rem;
13187
+ padding: 0 1rem;
13188
+ border: 0;
13189
+ border-radius: 0.5625rem;
13190
+ background: transparent;
13191
+ color: var(--tp-muted);
13192
+ font-weight: 600;
13193
+ cursor: pointer;
13194
+ }
13195
+
13196
+ .tp-segment-selected {
13197
+ background: var(--tp-surface);
13198
+ color: var(--tp-text);
13199
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
13200
+ }
13201
+
13202
+ .tp-live {
13203
+ display: inline-flex;
13204
+ align-items: center;
13205
+ gap: 0.375rem;
13206
+ color: var(--tp-accent);
13207
+ font-weight: 600;
13208
+ }
13209
+
13210
+ .tp-live-dot {
13211
+ width: 0.5rem;
13212
+ height: 0.5rem;
13213
+ border-radius: 999px;
13214
+ background: var(--tp-accent);
13215
+ animation: tp-live-pulse 2s ease-in-out infinite;
13216
+ }
13217
+
13218
+ @keyframes tp-live-pulse {
13219
+ 50% {
13220
+ opacity: 0.35;
13221
+ }
13222
+ }
13223
+
13224
+ .tp-steps {
13225
+ display: flex;
13226
+ margin: 0;
13227
+ padding: 0;
13228
+ list-style: none;
13229
+ }
13230
+
13231
+ .tp-step {
13232
+ display: flex;
13233
+ flex: 1 1 0;
13234
+ flex-direction: column;
13235
+ gap: 0.5rem;
13236
+ min-width: 0;
13237
+ }
13238
+
13239
+ .tp-step-track {
13240
+ display: flex;
13241
+ align-items: center;
13242
+ }
13243
+
13244
+ .tp-step-dot {
13245
+ display: flex;
13246
+ align-items: center;
13247
+ justify-content: center;
13248
+ width: 1.625rem;
13249
+ height: 1.625rem;
13250
+ flex: none;
13251
+ box-sizing: border-box;
13252
+ border: 2px solid var(--tp-border);
13253
+ border-radius: 999px;
13254
+ background: var(--tp-surface);
13255
+ font-size: 0.75rem;
13256
+ }
13257
+
13258
+ .tp-step-line {
13259
+ flex: 1;
13260
+ height: 3px;
13261
+ margin-inline: 0.25rem;
13262
+ border-radius: 2px;
13263
+ background: var(--tp-border);
13264
+ }
13265
+
13266
+ .tp-step-done .tp-step-dot {
13267
+ border-color: var(--tp-accent);
13268
+ background: var(--tp-accent);
13269
+ color: var(--tp-ink);
13270
+ }
13271
+
13272
+ .tp-step-done .tp-step-line {
13273
+ background: var(--tp-accent);
13274
+ }
13275
+
13276
+ .tp-step-current .tp-step-dot {
13277
+ border: 3px solid var(--tp-accent);
13278
+ }
13279
+
13280
+ .tp-step-failed .tp-step-dot {
13281
+ border-color: var(--tp-warn);
13282
+ background: var(--tp-warn);
13283
+ color: var(--tp-surface);
13284
+ }
13285
+
13286
+ .tp-step-stop .tp-step-dot {
13287
+ border-color: var(--tp-neutral);
13288
+ background: var(--tp-neutral);
13289
+ color: var(--tp-surface);
13290
+ }
13291
+
13292
+ .tp-step-label {
13293
+ padding-inline-end: 0.375rem;
13294
+ font-size: 0.8125rem;
13295
+ font-weight: 600;
13296
+ line-height: 1.25;
13297
+ overflow-wrap: anywhere;
13298
+ hyphens: auto;
13299
+ }
13300
+
13301
+ .tp-step-todo .tp-step-label {
13302
+ color: var(--tp-muted);
13303
+ font-weight: 500;
13304
+ }
13305
+
13306
+ .tp-step-failed .tp-step-label {
13307
+ color: var(--tp-warn);
13308
+ }
13309
+
13310
+ .tp-map {
13311
+ position: relative;
13312
+ height: 17rem;
13313
+ overflow: hidden;
13314
+ border: 1px solid var(--tp-border);
13315
+ border-radius: 1.25rem;
13316
+ }
13317
+
13318
+ .tp-map-canvas {
13319
+ width: 100%;
13320
+ height: 100%;
13321
+ }
13322
+
13323
+ /* Full screen: the browser's where it has one, otherwise the map covers the window. */
13324
+ .tp-map:fullscreen,
13325
+ .tp-map-expanded {
13326
+ height: 100%;
13327
+ border: 0;
13328
+ border-radius: 0;
13329
+ }
13330
+
13331
+ .tp-map-expanded {
13332
+ position: fixed;
13333
+ inset: 0;
13334
+ z-index: 2000;
13335
+ height: 100dvh;
13336
+ }
13337
+
13338
+ .tp-map-chip {
13339
+ position: absolute;
13340
+ inset-block-start: 0.75rem;
13341
+ inset-inline-start: 0.75rem;
13342
+ z-index: 500;
13343
+ display: flex;
13344
+ align-items: center;
13345
+ gap: 0.375rem;
13346
+ min-height: 2rem;
13347
+ padding: 0 0.75rem;
13348
+ border-radius: 999px;
13349
+ background: var(--tp-surface);
13350
+ color: var(--tp-accent);
13351
+ font-size: 0.8125rem;
13352
+ font-weight: 600;
13353
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.16);
13354
+ }
13355
+
13356
+ .tp-map-chip-stale {
13357
+ color: var(--tp-muted);
13358
+ }
13359
+
13360
+ .tp-map-controls {
13361
+ position: absolute;
13362
+ inset-block-start: 0.75rem;
13363
+ inset-inline-end: 0.75rem;
13364
+ z-index: 500;
13365
+ display: flex;
13366
+ flex-direction: column;
13367
+ gap: 0.5rem;
13368
+ }
13369
+
13370
+ .tp-map-button {
13371
+ display: flex;
13372
+ align-items: center;
13373
+ justify-content: center;
13374
+ width: 2.25rem;
13375
+ height: 2.25rem;
13376
+ padding: 0;
13377
+ border: 0;
13378
+ font-size: 0.875rem;
13379
+ line-height: 1;
13380
+ border-radius: 0.75rem;
13381
+ background: var(--tp-surface);
13382
+ color: var(--tp-text);
13383
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.16);
13384
+ cursor: pointer;
13385
+ }
13386
+
13387
+ /* Leaflet positions markers with an inline transform, so a marker's shape is drawn on
13388
+ its child element; a transform on the marker itself would be overwritten. */
13389
+ .tp-map-marker {
13390
+ background: none;
13391
+ border: 0;
13392
+ }
13393
+
13394
+ .tp-root .tp-attribution,
13395
+ .tp-root .tp-attribution .fleetbase-attribution-link,
13396
+ .tp-root .tp-attribution .fleetbase-attribution-legal-link {
13397
+ color: var(--tp-muted);
13398
+ }
13399
+
13400
+ .tp-map-vehicle {
13401
+ transition: transform 1s linear;
13402
+ }
13403
+
13404
+ .tp-map-vehicle-dot {
13405
+ display: block;
13406
+ width: 100%;
13407
+ height: 100%;
13408
+ border: 3px solid var(--tp-surface);
13409
+ border-radius: 999px;
13410
+ background: var(--tp-accent);
13411
+ box-shadow: 0 0 0 6px var(--tp-accent-soft);
13412
+ }
13413
+
13414
+ .tp-map-vehicle-stale .tp-map-vehicle-dot {
13415
+ background: var(--tp-neutral);
13416
+ opacity: 0.5;
13417
+ }
13418
+
13419
+ /* Round markers with a label, as the console's order maps draw them: P, a waypoint's
13420
+ number, D, or a store. */
13421
+ .tp-map-point-dot {
13422
+ display: flex;
13423
+ align-items: center;
13424
+ justify-content: center;
13425
+ width: 100%;
13426
+ height: 100%;
13427
+ overflow: hidden;
13428
+ box-sizing: border-box;
13429
+ border: 2.5px solid #fff;
13430
+ border-radius: 999px;
13431
+ box-shadow: 0 2px 8px rgb(0 0 0 / 45%);
13432
+ color: #fff;
13433
+ font-family: ui-sans-serif, system-ui, sans-serif;
13434
+ font-size: 0.8125rem;
13435
+ font-weight: 700;
13436
+ line-height: 1;
13437
+ }
13438
+
13439
+ .tp-map-point-dot svg {
13440
+ width: 0.8125rem;
13441
+ height: 0.8125rem;
13442
+ fill: currentcolor;
13443
+ }
13444
+
13445
+ .tp-map-point-logo .tp-map-point-dot {
13446
+ background: #fff;
13447
+ }
13448
+
13449
+ .tp-map-point-dot img {
13450
+ width: 100%;
13451
+ height: 100%;
13452
+ object-fit: cover;
13453
+ }
13454
+
13455
+ .tp-map-point-selected .tp-map-point-dot {
13456
+ box-shadow:
13457
+ 0 0 0 4px var(--tp-accent-soft),
13458
+ 0 2px 8px rgb(0 0 0 / 45%);
13459
+ transform: scale(1.15);
13460
+ }
13461
+
13462
+ .tp-map-point-dimmed {
13463
+ opacity: 0.55;
13464
+ }
13465
+
13466
+ /* SVG presentation attributes don't resolve CSS variables, so the line takes its
13467
+ colour here rather than from Leaflet's `color` option. */
13468
+ .tp-map-route {
13469
+ stroke: var(--tp-accent);
13470
+ }
13471
+
13472
+ .tp-map-route-planned {
13473
+ stroke-opacity: 0.75;
13474
+ }
13475
+
13476
+ .tp-root .tp-map-label {
13477
+ max-width: 12rem;
13478
+ padding: 0.125rem 0.5rem;
13479
+ overflow: hidden;
13480
+ border: 1px solid var(--tp-border);
13481
+ border-radius: 999px;
13482
+ background: var(--tp-surface);
13483
+ box-shadow: 0 1px 3px rgb(0 0 0 / 15%);
13484
+ color: var(--tp-text);
13485
+ font-size: 0.75rem;
13486
+ font-weight: 600;
13487
+ text-overflow: ellipsis;
13488
+ white-space: nowrap;
13489
+ }
13490
+
13491
+ .tp-root .tp-map-label::before {
13492
+ display: none;
13493
+ }
13494
+
13495
+ /* Moved below its marker by the map when it would overlap another label. */
13496
+ .tp-root .tp-map-label-below {
13497
+ box-shadow: 0 -1px 3px rgb(0 0 0 / 15%);
13498
+ }
13499
+
13500
+ .tp-root .tp-map-label-vehicle {
13501
+ border-color: var(--tp-accent);
13502
+ color: var(--tp-accent);
13503
+ }
13504
+
13505
+ .tp-eta-time {
13506
+ font-size: 2.25rem;
13507
+ font-weight: 700;
13508
+ line-height: 1;
13509
+ letter-spacing: -0.025em;
13510
+ }
13511
+
13512
+ .tp-dl {
13513
+ display: flex;
13514
+ flex-direction: column;
13515
+ gap: 0.5rem;
13516
+ font-size: 0.9375rem;
13517
+ }
13518
+
13519
+ .tp-dl div {
13520
+ display: flex;
13521
+ justify-content: space-between;
13522
+ gap: 0.75rem;
13523
+ }
13524
+
13525
+ .tp-dl dt {
13526
+ color: var(--tp-muted);
13527
+ }
13528
+
13529
+ .tp-dl dd {
13530
+ font-weight: 600;
13531
+ text-align: end;
13532
+ }
13533
+
13534
+ .tp-avatar {
13535
+ display: inline-flex;
13536
+ align-items: center;
13537
+ justify-content: center;
13538
+ width: 3rem;
13539
+ height: 3rem;
13540
+ flex: none;
13541
+ border-radius: 999px;
13542
+ background: var(--tp-accent-soft);
13543
+ color: var(--tp-accent);
13544
+ font-size: 1.125rem;
13545
+ font-weight: 700;
13546
+ }
13547
+
13548
+ .tp-proof-grid {
13549
+ display: grid;
13550
+ grid-template-columns: repeat(2, minmax(0, 1fr));
13551
+ gap: 0.625rem;
13552
+ }
13553
+
13554
+ .tp-proof {
13555
+ display: flex;
13556
+ flex-direction: column;
13557
+ align-items: center;
13558
+ justify-content: center;
13559
+ gap: 0.375rem;
13560
+ height: 9.5rem;
13561
+ overflow: hidden;
13562
+ padding: 0;
13563
+ border: 1px solid var(--tp-border);
13564
+ border-radius: 0.875rem;
13565
+ background: var(--tp-surface2);
13566
+ color: var(--tp-muted);
13567
+ cursor: zoom-in;
13568
+ }
13569
+
13570
+ .tp-proof img {
13571
+ width: 100%;
13572
+ height: 100%;
13573
+ object-fit: cover;
13574
+ }
13575
+
13576
+ .tp-proof-empty {
13577
+ cursor: default;
13578
+ }
13579
+
13580
+ .tp-timeline {
13581
+ display: flex;
13582
+ flex-direction: column;
13583
+ margin: 0;
13584
+ padding: 0;
13585
+ list-style: none;
13586
+ }
13587
+
13588
+ .tp-timeline-day {
13589
+ padding: 0.375rem 0 0.25rem;
13590
+ }
13591
+
13592
+ .tp-timeline-entry {
13593
+ display: flex;
13594
+ align-items: baseline;
13595
+ gap: 0.75rem;
13596
+ padding-bottom: 0.875rem;
13597
+ }
13598
+
13599
+ .tp-timeline-dot {
13600
+ width: 0.75rem;
13601
+ height: 0.75rem;
13602
+ flex: none;
13603
+ box-sizing: border-box;
13604
+ border: 2px solid var(--tp-border);
13605
+ border-radius: 999px;
13606
+ }
13607
+
13608
+ /* Every update has happened: earlier ones are filled, the latest takes the accent. */
13609
+ .tp-timeline-entry .tp-timeline-dot {
13610
+ border-color: var(--tp-neutral);
13611
+ background: var(--tp-neutral);
13612
+ }
13613
+
13614
+ .tp-timeline-latest .tp-timeline-dot {
13615
+ border-color: var(--tp-accent);
13616
+ background: var(--tp-accent);
13617
+ }
13618
+
13619
+ .tp-item {
13620
+ display: flex;
13621
+ align-items: center;
13622
+ gap: 0.875rem;
13623
+ padding: 0.75rem 0;
13624
+ border-top: 1px solid var(--tp-border);
13625
+ }
13626
+
13627
+ .tp-item:first-of-type {
13628
+ border-top: 0;
13629
+ }
13630
+
13631
+ .tp-item-photo {
13632
+ display: inline-flex;
13633
+ align-items: center;
13634
+ justify-content: center;
13635
+ width: 3.5rem;
13636
+ height: 3.5rem;
13637
+ flex: none;
13638
+ overflow: hidden;
13639
+ border-radius: 0.75rem;
13640
+ background: var(--tp-surface2);
13641
+ color: var(--tp-muted);
13642
+ }
13643
+
13644
+ .tp-item-photo img {
13645
+ width: 100%;
13646
+ height: 100%;
13647
+ object-fit: cover;
13648
+ }
13649
+
13650
+ .tp-actions {
13651
+ display: grid;
13652
+ grid-template-columns: repeat(auto-fit, minmax(min(10rem, 100%), 1fr));
13653
+ gap: 0.5rem;
13654
+ }
13655
+
13656
+ .tp-list {
13657
+ display: flex;
13658
+ flex-direction: column;
13659
+ gap: 0.625rem;
13660
+ margin: 0;
13661
+ padding: 0;
13662
+ list-style: none;
13663
+ }
13664
+
13665
+ .tp-list-row {
13666
+ display: flex;
13667
+ align-items: center;
13668
+ gap: 0.875rem;
13669
+ width: 100%;
13670
+ min-height: 4.75rem;
13671
+ box-sizing: border-box;
13672
+ padding: 0.875rem 1rem;
13673
+ border: 1px solid var(--tp-border);
13674
+ border-radius: 0.875rem;
13675
+ background: var(--tp-surface);
13676
+ color: var(--tp-text);
13677
+ text-align: start;
13678
+ cursor: pointer;
13679
+ }
13680
+
13681
+ .tp-empty {
13682
+ display: flex;
13683
+ flex-direction: column;
13684
+ align-items: center;
13685
+ gap: 0.5rem;
13686
+ padding: 2.5rem 1.25rem;
13687
+ border: 1.5px dashed var(--tp-border);
13688
+ border-radius: 1rem;
13689
+ text-align: center;
13690
+ }
13691
+
13692
+ .tp-footer {
13693
+ display: flex;
13694
+ flex-direction: column;
13695
+ align-items: center;
13696
+ gap: 0.75rem;
13697
+ padding: 1.5rem 1.25rem 2rem;
13698
+ color: var(--tp-muted);
13699
+ font-size: 0.8125rem;
13700
+ text-align: center;
13701
+ }
13702
+
13703
+ .tp-toast-region {
13704
+ position: fixed;
13705
+ inset-inline: 1rem;
13706
+ bottom: 1.25rem;
13707
+ z-index: 1000;
13708
+ display: flex;
13709
+ justify-content: center;
13710
+ pointer-events: none;
13711
+ }
13712
+
13713
+ .tp-toast {
13714
+ display: flex;
13715
+ align-items: flex-start;
13716
+ gap: 0.75rem;
13717
+ width: 100%;
13718
+ max-width: 27.5rem;
13719
+ padding: 0.875rem 1rem;
13720
+ border-radius: 0.875rem;
13721
+ background: var(--tp-text);
13722
+ color: var(--tp-bg);
13723
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.22);
13724
+ pointer-events: auto;
13725
+ }
13726
+
13727
+ .tp-toast-title {
13728
+ font-weight: 600;
13729
+ }
13730
+
13731
+ .tp-toast-text {
13732
+ font-size: 0.875rem;
13733
+ opacity: 0.85;
13734
+ }
13735
+
13736
+ .tp-toast-close {
13737
+ margin-inline-start: auto;
13738
+ border: 0;
13739
+ background: transparent;
13740
+ color: inherit;
13741
+ cursor: pointer;
13742
+ }
13743
+
13744
+ .tp-lightbox {
13745
+ position: fixed;
13746
+ inset: 0;
13747
+ z-index: 1100;
13748
+ display: flex;
13749
+ align-items: center;
13750
+ justify-content: center;
13751
+ padding: 1.25rem;
13752
+ background: rgba(8, 12, 13, 0.8);
13753
+ }
13754
+
13755
+ .tp-lightbox-close {
13756
+ position: absolute;
13757
+ inset-block-start: 1rem;
13758
+ inset-inline-end: 1rem;
13759
+ width: 2.75rem;
13760
+ height: 2.75rem;
13761
+ border: 0;
13762
+ border-radius: 999px;
13763
+ background: var(--tp-surface);
13764
+ color: var(--tp-text);
13765
+ cursor: pointer;
13766
+ }
13767
+
13768
+ .tp-lightbox-figure {
13769
+ display: flex;
13770
+ flex-direction: column;
13771
+ gap: 0.75rem;
13772
+ max-width: 40rem;
13773
+ color: var(--tp-ink);
13774
+ text-align: center;
13775
+ }
13776
+
13777
+ .tp-lightbox-figure img {
13778
+ max-width: 100%;
13779
+ max-height: 75vh;
13780
+ border-radius: 1rem;
13781
+ background: var(--tp-surface);
13782
+ }
13783
+
13784
+ @media (width >= 960px) {
13785
+ .tp-main {
13786
+ padding: 2rem;
13787
+ }
13788
+
13789
+ .tp-headline {
13790
+ font-size: 2.75rem;
13791
+ }
13792
+
13793
+ .tp-full-with-map {
13794
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
13795
+ grid-template-areas: 'chips chips' 'head map' 'body map';
13796
+ gap: 1.25rem 2rem;
13797
+ align-items: start;
13798
+ }
13799
+
13800
+ .tp-full-with-map .tp-full-map {
13801
+ position: sticky;
13802
+ top: 1.5rem;
13803
+ }
13804
+
13805
+ .tp-full-with-map .tp-map {
13806
+ height: 40rem;
13807
+ }
13808
+
13809
+ .tp-full:not(.tp-full-with-map) {
13810
+ max-width: 47.5rem;
13811
+ margin: 0 auto;
13812
+ }
13813
+ }
13814
+
13815
+ @media (prefers-reduced-motion: reduce) {
13816
+ .tp-live-dot,
13817
+ .tp-root .tp-map-vehicle,
13818
+ .tp-root .tp-map-vehicle-dot {
13819
+ animation: none;
13820
+ transition: none;
13821
+ }
13822
+ }