@12-apps/ui 6.22.0 → 6.24.0

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 (347) hide show
  1. package/NATIVE.md +2 -1
  2. package/components-catalog.md +7 -0
  3. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
  4. package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
  5. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  6. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  7. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +1 -1
  8. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +1 -1
  9. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  10. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  11. package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
  12. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  13. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  14. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  15. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  16. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +41 -41
  17. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +47 -47
  18. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +1 -1
  19. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
  20. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
  21. package/dist/_internal/components/data-display/DataViews/base-list-card.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +5 -5
  23. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
  24. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +10 -10
  25. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
  26. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +36 -36
  27. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +11 -11
  28. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +3 -3
  29. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +4 -4
  30. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
  31. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  32. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  33. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
  34. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +1 -1
  35. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
  36. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  37. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
  38. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +32 -0
  39. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +23 -0
  40. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js.map +1 -0
  41. package/dist/_internal/components/data-display/FleetMap/FleetMap.base.js +1 -0
  42. package/dist/_internal/components/data-display/FleetMap/FleetMap.base.js.map +1 -0
  43. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +57 -0
  44. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js.map +1 -0
  45. package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js +14 -0
  46. package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js.map +1 -0
  47. package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js +9 -0
  48. package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js.map +1 -0
  49. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +47 -0
  50. package/dist/_internal/components/data-display/FleetMap/FleetMap.js.map +1 -0
  51. package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.js +20 -0
  52. package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.js.map +1 -0
  53. package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js +1 -0
  54. package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js.map +1 -0
  55. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +15 -0
  56. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js.map +1 -0
  57. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  58. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +2 -2
  59. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  60. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +6 -6
  61. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
  62. package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
  63. package/dist/_internal/components/data-display/Table/Table.js +3 -3
  64. package/dist/_internal/components/data-display/index.js +90 -69
  65. package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
  66. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
  67. package/dist/_internal/components/feedback/index.js +14 -14
  68. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
  69. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
  70. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
  71. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +2 -2
  72. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +4 -4
  73. package/dist/_internal/components/form/Command/Command.js +2 -2
  74. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +3 -3
  75. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  76. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
  77. package/dist/_internal/components/form/index.js +30 -30
  78. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +5 -5
  79. package/dist/_internal/components/form/total-form/Fields/index.js +9 -9
  80. package/dist/_internal/components/index.js +160 -140
  81. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
  82. package/dist/_internal/components/layout/index.js +20 -20
  83. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +4 -4
  84. package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
  85. package/dist/_internal/components/navigation/index.js +12 -12
  86. package/dist/_internal/components/utility/index.js +4 -4
  87. package/dist/_internal/platform/aria.js.map +1 -1
  88. package/dist/_internal/pt-BR.data-display.js +2 -2
  89. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  90. package/dist/charts.js +10 -10
  91. package/dist/{chunk-WGRS4PGY.js → chunk-2C47DEVU.js} +4 -4
  92. package/dist/chunk-2RQINU5T.js +41 -0
  93. package/dist/chunk-2RQINU5T.js.map +1 -0
  94. package/dist/{chunk-WMALDOF5.js → chunk-4G3FGCWX.js} +4 -4
  95. package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
  96. package/dist/{chunk-QFJRB27Q.js → chunk-6LGWJFQK.js} +2 -2
  97. package/dist/{chunk-XSF6AXEU.js → chunk-6RZDDUSM.js} +2 -2
  98. package/dist/{chunk-VIK3HAUQ.js → chunk-73NJCGQG.js} +2 -2
  99. package/dist/{chunk-UU3QAKG6.js → chunk-B7DKSBAE.js} +14 -14
  100. package/dist/{chunk-3FLVIVOK.js → chunk-BHIGHSXA.js} +2 -2
  101. package/dist/{chunk-HKV4MQ2W.js → chunk-BLBOYCOV.js} +5 -5
  102. package/dist/chunk-BTQZ3EX3.js +45 -0
  103. package/dist/chunk-BTQZ3EX3.js.map +1 -0
  104. package/dist/{chunk-PFV6RL4Q.js → chunk-C6KTQF4F.js} +3 -3
  105. package/dist/chunk-CDCTLPMD.js +1 -0
  106. package/dist/chunk-CDCTLPMD.js.map +1 -0
  107. package/dist/{chunk-LYSSO6WC.js → chunk-CZPU5TW3.js} +4 -4
  108. package/dist/{chunk-PMS3H3OO.js → chunk-DF2FFYZ7.js} +4 -4
  109. package/dist/{chunk-QZBUGUOY.js → chunk-DFLTUI7W.js} +4 -4
  110. package/dist/{chunk-WLQTHPMX.js → chunk-EJQW2IYW.js} +2 -2
  111. package/dist/{chunk-VQAM2XZV.js → chunk-EMUBMZMA.js} +2 -2
  112. package/dist/{chunk-XFUNJYFT.js → chunk-EPNUVSNK.js} +7 -7
  113. package/dist/{chunk-MSUSZLRE.js → chunk-EWT3WMVY.js} +5 -5
  114. package/dist/{chunk-Q75SJ35X.js → chunk-GMTM6EN7.js} +3 -3
  115. package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
  116. package/dist/{chunk-6NZTYZP5.js → chunk-GVA5CYKP.js} +2 -2
  117. package/dist/chunk-HMV4QMXS.js +219 -0
  118. package/dist/chunk-HMV4QMXS.js.map +1 -0
  119. package/dist/{chunk-VR5HDUBK.js → chunk-HP2ODXNA.js} +2 -2
  120. package/dist/{chunk-2MMEIN4T.js → chunk-I3E2QHTH.js} +4 -4
  121. package/dist/{chunk-UVGRRI7N.js → chunk-IPVYEPXO.js} +4 -4
  122. package/dist/{chunk-5ZTUP65G.js → chunk-JM64OEU6.js} +5 -5
  123. package/dist/{chunk-7BYFC2MR.js → chunk-JUHUKZGU.js} +7 -7
  124. package/dist/chunk-JZXWCEH5.js +116 -0
  125. package/dist/chunk-JZXWCEH5.js.map +1 -0
  126. package/dist/{chunk-DVUPIVI2.js → chunk-KT6HWAEN.js} +4 -4
  127. package/dist/{chunk-TLMLEC4F.js → chunk-KW7H5O3K.js} +6 -6
  128. package/dist/{chunk-VLHGBFR6.js → chunk-MZQTHSLN.js} +3 -3
  129. package/dist/{chunk-4SQFO4GW.js → chunk-NA7MIEG6.js} +7 -7
  130. package/dist/{chunk-QWDEOITU.js → chunk-O4VCZTK4.js} +2 -2
  131. package/dist/{chunk-LS4FMSHY.js → chunk-OAYX4XN7.js} +4 -4
  132. package/dist/{chunk-Y5UCOBQN.js → chunk-OGGHD64H.js} +4 -4
  133. package/dist/{chunk-7TZ6OC5T.js → chunk-OH3YGJT5.js} +2 -2
  134. package/dist/{chunk-REMK55JI.js → chunk-OLZTGVBT.js} +4 -4
  135. package/dist/{chunk-VNNG46TS.js → chunk-ORSLFKKZ.js} +6 -6
  136. package/dist/{chunk-ZIYMBR7K.js → chunk-OTH7H3IP.js} +2 -2
  137. package/dist/{chunk-5NKUYCZD.js → chunk-PN5CQKA2.js} +4 -4
  138. package/dist/{chunk-J4W4TQPC.js → chunk-QJRDDVZ2.js} +5 -5
  139. package/dist/{chunk-VNDOQEJ7.js → chunk-QRX5BYUQ.js} +4 -4
  140. package/dist/{chunk-XT7HMNBW.js → chunk-R6SNYC3D.js} +5 -5
  141. package/dist/{chunk-W2UTDN4T.js → chunk-RBGOGTT2.js} +4 -4
  142. package/dist/chunk-RP5FK3SO.js +79 -0
  143. package/dist/chunk-RP5FK3SO.js.map +1 -0
  144. package/dist/{chunk-X5MPHXG5.js → chunk-RPWEXIAW.js} +6 -6
  145. package/dist/chunk-RQWZYD6H.js +1 -0
  146. package/dist/chunk-RQWZYD6H.js.map +1 -0
  147. package/dist/{chunk-EXJBPKGW.js → chunk-SHDIZSN5.js} +5 -5
  148. package/dist/{chunk-23FCBIUN.js → chunk-TNVO2DTB.js} +8 -8
  149. package/dist/{chunk-AGSBIUPV.js → chunk-TPLKJHNN.js} +4 -4
  150. package/dist/{chunk-YQ6TNHAC.js → chunk-TTLI6PF7.js} +5 -5
  151. package/dist/{chunk-U2AC4AQX.js → chunk-TU5EIKJA.js} +4 -4
  152. package/dist/{chunk-KTK4A3IF.js → chunk-TX5V42AY.js} +11 -11
  153. package/dist/{chunk-BGYLL467.js → chunk-TXHJX2NG.js} +4 -4
  154. package/dist/{chunk-FL54G7PV.js → chunk-WIT3Y7JT.js} +2 -2
  155. package/dist/{chunk-W7Y6RA6W.js → chunk-WR5JFDQ5.js} +4 -4
  156. package/dist/chunk-XPMGFAJ3.js +36 -0
  157. package/dist/chunk-XPMGFAJ3.js.map +1 -0
  158. package/dist/{chunk-2UYR2OOE.js → chunk-YRUCIKPO.js} +4 -4
  159. package/dist/{chunk-AEGXHZQT.js → chunk-YW5T6KZ5.js} +7 -7
  160. package/dist/{chunk-QKIJ6YXZ.js → chunk-ZA4U5GDU.js} +4 -4
  161. package/dist/chunk-ZCPSND5Y.js +64 -0
  162. package/dist/chunk-ZCPSND5Y.js.map +1 -0
  163. package/dist/{chunk-ZKR5B6YJ.js → chunk-ZRPGVHTR.js} +2 -2
  164. package/dist/{chunk-OXQP3N6X.js → chunk-ZTZ6S5Q6.js} +4 -4
  165. package/dist/data-display/AsyncStateContainer.js +3 -3
  166. package/dist/data-display/Avatar.js +4 -4
  167. package/dist/data-display/Badge.js +2 -2
  168. package/dist/data-display/CardKit.js +11 -11
  169. package/dist/data-display/Carousel.js +2 -2
  170. package/dist/data-display/Chart.js +10 -10
  171. package/dist/data-display/DataGrid.js +2 -2
  172. package/dist/data-display/DataViews.js +68 -68
  173. package/dist/data-display/FleetMap.js +55 -0
  174. package/dist/data-display/FleetMap.js.map +1 -0
  175. package/dist/data-display/HoverCard.js +2 -2
  176. package/dist/data-display/Lightbox.js +2 -2
  177. package/dist/data-display/MapPreview.js +6 -6
  178. package/dist/data-display/Sheet.js +3 -3
  179. package/dist/data-display/Table.js +3 -3
  180. package/dist/feedback/ConfirmAction.js +3 -3
  181. package/dist/feedback/Modal.js +2 -2
  182. package/dist/feedback/StackedModal.js +2 -2
  183. package/dist/form/AddressAutocomplete.js +5 -5
  184. package/dist/form/CategorySelect.js +4 -4
  185. package/dist/form/Command.js +2 -2
  186. package/dist/form/DateRangePicker.js +5 -5
  187. package/dist/form/PhoneInput.js +3 -3
  188. package/dist/form/total-form.js +9 -9
  189. package/dist/layout/SettingsLayout.js +2 -2
  190. package/dist/locales.js +4 -4
  191. package/dist/native/chunks/{chunk-T6BJPP3E.js → chunk-DN73KYIZ.js} +1 -1
  192. package/dist/native/chunks/chunk-DN73KYIZ.js.map +1 -0
  193. package/dist/native/chunks/chunk-GW7TQ7HO.js +215 -0
  194. package/dist/native/chunks/chunk-GW7TQ7HO.js.map +1 -0
  195. package/dist/native/chunks/chunk-MJVSQXOD.js +9 -0
  196. package/dist/native/chunks/chunk-MJVSQXOD.js.map +1 -0
  197. package/dist/native/chunks/chunk-ZAQ3AZJM.js +292 -0
  198. package/dist/native/chunks/chunk-ZAQ3AZJM.js.map +1 -0
  199. package/dist/native/data-display/Alert.js +4 -4
  200. package/dist/native/data-display/Avatar.js +3 -3
  201. package/dist/native/data-display/Badge.js +4 -4
  202. package/dist/native/data-display/Chip.js +3 -5
  203. package/dist/native/data-display/Chip.js.map +1 -1
  204. package/dist/native/data-display/EmptyState.js +9 -286
  205. package/dist/native/data-display/EmptyState.js.map +1 -1
  206. package/dist/native/data-display/ErrorState.js +6 -6
  207. package/dist/native/data-display/FleetMap.js +498 -0
  208. package/dist/native/data-display/FleetMap.js.map +1 -0
  209. package/dist/native/data-display/LoadingState.js +3 -3
  210. package/dist/native/feedback/Dialog.js +3 -3
  211. package/dist/native/form/Checkbox.js +1 -1
  212. package/dist/native/form/Input.js +1 -1
  213. package/dist/native/form/Select.js +1 -1
  214. package/dist/native/form/Switch.js +1 -1
  215. package/dist/native/layout/Card.js +3 -3
  216. package/dist/native/layout/Skeleton.js +6 -209
  217. package/dist/native/layout/Skeleton.js.map +1 -1
  218. package/dist/navigation/AppHeader.js +6 -6
  219. package/dist/navigation/Pagination.js +2 -2
  220. package/dist/pt-BR.js +4 -4
  221. package/dist/types/components/data-display/FleetMap/FleetBody.d.ts +22 -0
  222. package/dist/types/components/data-display/FleetMap/FleetBody.d.ts.map +1 -0
  223. package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts +50 -0
  224. package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts.map +1 -0
  225. package/dist/types/components/data-display/FleetMap/FleetMap.base.d.ts +141 -0
  226. package/dist/types/components/data-display/FleetMap/FleetMap.base.d.ts.map +1 -0
  227. package/dist/types/components/data-display/FleetMap/FleetMap.d.ts +32 -0
  228. package/dist/types/components/data-display/FleetMap/FleetMap.d.ts.map +1 -0
  229. package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts +23 -0
  230. package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts.map +1 -0
  231. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
  232. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
  233. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts +71 -0
  234. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
  235. package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
  236. package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
  237. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts +45 -0
  238. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts.map +1 -0
  239. package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts +15 -0
  240. package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts.map +1 -0
  241. package/dist/types/components/data-display/FleetMap/index.d.ts +5 -0
  242. package/dist/types/components/data-display/FleetMap/index.d.ts.map +1 -0
  243. package/dist/types/components/data-display/index.d.ts +1 -0
  244. package/dist/types/components/data-display/index.d.ts.map +1 -1
  245. package/dist/types/platform/aria.d.ts +13 -0
  246. package/dist/types/platform/aria.d.ts.map +1 -1
  247. package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts +141 -0
  248. package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts.map +1 -0
  249. package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
  250. package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
  251. package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts +71 -0
  252. package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
  253. package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
  254. package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
  255. package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts +30 -0
  256. package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts.map +1 -0
  257. package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts +36 -0
  258. package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts.map +1 -0
  259. package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts +17 -0
  260. package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts.map +1 -0
  261. package/dist/types-native/components/data-display/FleetMap/index.native.d.ts +4 -0
  262. package/dist/types-native/components/data-display/FleetMap/index.native.d.ts.map +1 -0
  263. package/dist/types-native/platform/aria.d.ts +13 -0
  264. package/dist/types-native/platform/aria.d.ts.map +1 -1
  265. package/dist/user-avatar.js +5 -5
  266. package/package.json +9 -1
  267. package/src/components/data-display/FleetMap/FleetBody.tsx +96 -0
  268. package/src/components/data-display/FleetMap/FleetCanvas.tsx +80 -0
  269. package/src/components/data-display/FleetMap/FleetMap.base.ts +144 -0
  270. package/src/components/data-display/FleetMap/FleetMap.fixtures.ts +70 -0
  271. package/src/components/data-display/FleetMap/FleetMap.helpers.ts +85 -0
  272. package/src/components/data-display/FleetMap/FleetMap.hooks.ts +183 -0
  273. package/src/components/data-display/FleetMap/FleetMap.md +189 -0
  274. package/src/components/data-display/FleetMap/FleetMap.metrics.ts +81 -0
  275. package/src/components/data-display/FleetMap/FleetMap.native.tsx +185 -0
  276. package/src/components/data-display/FleetMap/FleetMap.tsx +163 -0
  277. package/src/components/data-display/FleetMap/FleetMap.types.native.ts +44 -0
  278. package/src/components/data-display/FleetMap/FleetMap.types.ts +53 -0
  279. package/src/components/data-display/FleetMap/FleetRoster.native.tsx +382 -0
  280. package/src/components/data-display/FleetMap/FleetRoster.tsx +327 -0
  281. package/src/components/data-display/FleetMap/NATIVE-NOTES.md +14 -0
  282. package/src/components/data-display/FleetMap/index.native.ts +10 -0
  283. package/src/components/data-display/FleetMap/index.ts +9 -0
  284. package/src/components/data-display/FleetMap/tests.md +84 -0
  285. package/src/components/data-display/FleetMap/track.md +50 -0
  286. package/src/components/data-display/index.ts +1 -0
  287. package/src/components/feedback/ConfirmAction/ConfirmAction.md +10 -4
  288. package/src/platform/aria.ts +13 -0
  289. package/dist/chunk-X3HL5C6H.js +0 -1
  290. package/dist/native/chunks/chunk-T6BJPP3E.js.map +0 -1
  291. /package/dist/{chunk-X3HL5C6H.js.map → _internal/components/data-display/FleetMap/FleetBody.js.map} +0 -0
  292. /package/dist/{chunk-WGRS4PGY.js.map → chunk-2C47DEVU.js.map} +0 -0
  293. /package/dist/{chunk-WMALDOF5.js.map → chunk-4G3FGCWX.js.map} +0 -0
  294. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
  295. /package/dist/{chunk-QFJRB27Q.js.map → chunk-6LGWJFQK.js.map} +0 -0
  296. /package/dist/{chunk-XSF6AXEU.js.map → chunk-6RZDDUSM.js.map} +0 -0
  297. /package/dist/{chunk-VIK3HAUQ.js.map → chunk-73NJCGQG.js.map} +0 -0
  298. /package/dist/{chunk-UU3QAKG6.js.map → chunk-B7DKSBAE.js.map} +0 -0
  299. /package/dist/{chunk-3FLVIVOK.js.map → chunk-BHIGHSXA.js.map} +0 -0
  300. /package/dist/{chunk-HKV4MQ2W.js.map → chunk-BLBOYCOV.js.map} +0 -0
  301. /package/dist/{chunk-PFV6RL4Q.js.map → chunk-C6KTQF4F.js.map} +0 -0
  302. /package/dist/{chunk-LYSSO6WC.js.map → chunk-CZPU5TW3.js.map} +0 -0
  303. /package/dist/{chunk-PMS3H3OO.js.map → chunk-DF2FFYZ7.js.map} +0 -0
  304. /package/dist/{chunk-QZBUGUOY.js.map → chunk-DFLTUI7W.js.map} +0 -0
  305. /package/dist/{chunk-WLQTHPMX.js.map → chunk-EJQW2IYW.js.map} +0 -0
  306. /package/dist/{chunk-VQAM2XZV.js.map → chunk-EMUBMZMA.js.map} +0 -0
  307. /package/dist/{chunk-XFUNJYFT.js.map → chunk-EPNUVSNK.js.map} +0 -0
  308. /package/dist/{chunk-MSUSZLRE.js.map → chunk-EWT3WMVY.js.map} +0 -0
  309. /package/dist/{chunk-Q75SJ35X.js.map → chunk-GMTM6EN7.js.map} +0 -0
  310. /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
  311. /package/dist/{chunk-6NZTYZP5.js.map → chunk-GVA5CYKP.js.map} +0 -0
  312. /package/dist/{chunk-VR5HDUBK.js.map → chunk-HP2ODXNA.js.map} +0 -0
  313. /package/dist/{chunk-2MMEIN4T.js.map → chunk-I3E2QHTH.js.map} +0 -0
  314. /package/dist/{chunk-UVGRRI7N.js.map → chunk-IPVYEPXO.js.map} +0 -0
  315. /package/dist/{chunk-5ZTUP65G.js.map → chunk-JM64OEU6.js.map} +0 -0
  316. /package/dist/{chunk-7BYFC2MR.js.map → chunk-JUHUKZGU.js.map} +0 -0
  317. /package/dist/{chunk-DVUPIVI2.js.map → chunk-KT6HWAEN.js.map} +0 -0
  318. /package/dist/{chunk-TLMLEC4F.js.map → chunk-KW7H5O3K.js.map} +0 -0
  319. /package/dist/{chunk-VLHGBFR6.js.map → chunk-MZQTHSLN.js.map} +0 -0
  320. /package/dist/{chunk-4SQFO4GW.js.map → chunk-NA7MIEG6.js.map} +0 -0
  321. /package/dist/{chunk-QWDEOITU.js.map → chunk-O4VCZTK4.js.map} +0 -0
  322. /package/dist/{chunk-LS4FMSHY.js.map → chunk-OAYX4XN7.js.map} +0 -0
  323. /package/dist/{chunk-Y5UCOBQN.js.map → chunk-OGGHD64H.js.map} +0 -0
  324. /package/dist/{chunk-7TZ6OC5T.js.map → chunk-OH3YGJT5.js.map} +0 -0
  325. /package/dist/{chunk-REMK55JI.js.map → chunk-OLZTGVBT.js.map} +0 -0
  326. /package/dist/{chunk-VNNG46TS.js.map → chunk-ORSLFKKZ.js.map} +0 -0
  327. /package/dist/{chunk-ZIYMBR7K.js.map → chunk-OTH7H3IP.js.map} +0 -0
  328. /package/dist/{chunk-5NKUYCZD.js.map → chunk-PN5CQKA2.js.map} +0 -0
  329. /package/dist/{chunk-J4W4TQPC.js.map → chunk-QJRDDVZ2.js.map} +0 -0
  330. /package/dist/{chunk-VNDOQEJ7.js.map → chunk-QRX5BYUQ.js.map} +0 -0
  331. /package/dist/{chunk-XT7HMNBW.js.map → chunk-R6SNYC3D.js.map} +0 -0
  332. /package/dist/{chunk-W2UTDN4T.js.map → chunk-RBGOGTT2.js.map} +0 -0
  333. /package/dist/{chunk-X5MPHXG5.js.map → chunk-RPWEXIAW.js.map} +0 -0
  334. /package/dist/{chunk-EXJBPKGW.js.map → chunk-SHDIZSN5.js.map} +0 -0
  335. /package/dist/{chunk-23FCBIUN.js.map → chunk-TNVO2DTB.js.map} +0 -0
  336. /package/dist/{chunk-AGSBIUPV.js.map → chunk-TPLKJHNN.js.map} +0 -0
  337. /package/dist/{chunk-YQ6TNHAC.js.map → chunk-TTLI6PF7.js.map} +0 -0
  338. /package/dist/{chunk-U2AC4AQX.js.map → chunk-TU5EIKJA.js.map} +0 -0
  339. /package/dist/{chunk-KTK4A3IF.js.map → chunk-TX5V42AY.js.map} +0 -0
  340. /package/dist/{chunk-BGYLL467.js.map → chunk-TXHJX2NG.js.map} +0 -0
  341. /package/dist/{chunk-FL54G7PV.js.map → chunk-WIT3Y7JT.js.map} +0 -0
  342. /package/dist/{chunk-W7Y6RA6W.js.map → chunk-WR5JFDQ5.js.map} +0 -0
  343. /package/dist/{chunk-2UYR2OOE.js.map → chunk-YRUCIKPO.js.map} +0 -0
  344. /package/dist/{chunk-AEGXHZQT.js.map → chunk-YW5T6KZ5.js.map} +0 -0
  345. /package/dist/{chunk-QKIJ6YXZ.js.map → chunk-ZA4U5GDU.js.map} +0 -0
  346. /package/dist/{chunk-ZKR5B6YJ.js.map → chunk-ZRPGVHTR.js.map} +0 -0
  347. /package/dist/{chunk-OXQP3N6X.js.map → chunk-ZTZ6S5Q6.js.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ LightboxCurrentMedia
3
+ } from "./chunk-2DWBJJK6.js";
1
4
  import {
2
5
  resolveLightboxProps
3
6
  } from "./chunk-UOS7DEQZ.js";
@@ -19,9 +22,6 @@ import {
19
22
  import {
20
23
  makeTestId
21
24
  } from "./chunk-56SJYTIT.js";
22
- import {
23
- LightboxCurrentMedia
24
- } from "./chunk-2DWBJJK6.js";
25
25
 
26
26
  // src/components/data-display/Lightbox/Lightbox.tsx
27
27
  import Dialog from "@mui/material/Dialog/index.js";
@@ -128,4 +128,4 @@ export {
128
128
  Lightbox,
129
129
  Lightbox_default
130
130
  };
131
- //# sourceMappingURL=chunk-PMS3H3OO.js.map
131
+ //# sourceMappingURL=chunk-DF2FFYZ7.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- RangePresets
3
- } from "./chunk-F4RR4666.js";
4
1
  import {
5
2
  NumberBoundInput
6
3
  } from "./chunk-FV36LFPX.js";
@@ -10,6 +7,9 @@ import {
10
7
  numericRange,
11
8
  rangeChipLabel
12
9
  } from "./chunk-GCZJH4XL.js";
10
+ import {
11
+ RangePresets
12
+ } from "./chunk-F4RR4666.js";
13
13
  import {
14
14
  presetsFor
15
15
  } from "./chunk-CBOB5AV6.js";
@@ -279,4 +279,4 @@ export {
279
279
  RangePill,
280
280
  PanelRangeField
281
281
  };
282
- //# sourceMappingURL=chunk-QZBUGUOY.js.map
282
+ //# sourceMappingURL=chunk-DFLTUI7W.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-4T6W43TO.js";
7
7
  import {
8
8
  CategorySelect
9
- } from "./chunk-5ZTUP65G.js";
9
+ } from "./chunk-JM64OEU6.js";
10
10
 
11
11
  // src/components/data-display/DataViews/data-views-category-pill.tsx
12
12
  import { jsx } from "react/jsx-runtime";
@@ -79,4 +79,4 @@ export {
79
79
  emitPillDiff,
80
80
  PillControl
81
81
  };
82
- //# sourceMappingURL=chunk-WLQTHPMX.js.map
82
+ //# sourceMappingURL=chunk-EJQW2IYW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-4X4KM4ZB.js";
4
4
  import {
5
5
  DataViewsGrid
6
- } from "./chunk-PFV6RL4Q.js";
6
+ } from "./chunk-C6KTQF4F.js";
7
7
  import {
8
8
  viewStateKey
9
9
  } from "./chunk-ZOLAYP2D.js";
@@ -178,4 +178,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
178
178
  export {
179
179
  DataViewsTableBase
180
180
  };
181
- //# sourceMappingURL=chunk-VQAM2XZV.js.map
181
+ //# sourceMappingURL=chunk-EMUBMZMA.js.map
@@ -1,9 +1,3 @@
1
- import {
2
- useHoverCard
3
- } from "./chunk-SXYIXCUB.js";
4
- import {
5
- HoverCardContent
6
- } from "./chunk-O26MKGIC.js";
7
1
  import {
8
2
  arrowSx,
9
3
  cardSx,
@@ -11,6 +5,12 @@ import {
11
5
  getTransformOrigin,
12
6
  sideOf
13
7
  } from "./chunk-KSLNO5NG.js";
8
+ import {
9
+ useHoverCard
10
+ } from "./chunk-SXYIXCUB.js";
11
+ import {
12
+ HoverCardContent
13
+ } from "./chunk-O26MKGIC.js";
14
14
  import {
15
15
  withDefaults
16
16
  } from "./chunk-HPK33ACY.js";
@@ -158,4 +158,4 @@ HoverCard.displayName = "HoverCard";
158
158
  export {
159
159
  HoverCard
160
160
  };
161
- //# sourceMappingURL=chunk-XFUNJYFT.js.map
161
+ //# sourceMappingURL=chunk-EPNUVSNK.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ resolveCommandProps,
3
+ useCommandPalette
4
+ } from "./chunk-6DN4ZULV.js";
1
5
  import {
2
6
  commandPaperStyles,
3
7
  commandSizeStyles
@@ -6,10 +10,6 @@ import {
6
10
  CommandEmpty,
7
11
  CommandLoading
8
12
  } from "./chunk-CMK4DJDR.js";
9
- import {
10
- resolveCommandProps,
11
- useCommandPalette
12
- } from "./chunk-6DN4ZULV.js";
13
13
 
14
14
  // src/components/form/Command/Command.tsx
15
15
  import CloseIcon from "@mui/icons-material/Close";
@@ -302,4 +302,4 @@ export {
302
302
  CommandList,
303
303
  CommandGroup
304
304
  };
305
- //# sourceMappingURL=chunk-MSUSZLRE.js.map
305
+ //# sourceMappingURL=chunk-EWT3WMVY.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  useAddressAutocomplete
3
- } from "./chunk-ZOUWHGV3.js";
3
+ } from "./chunk-4MGFUPQT.js";
4
4
  import {
5
5
  AddressFallbackField
6
6
  } from "./chunk-HKKSZ7HG.js";
7
7
  import {
8
8
  AddressAutocompleteField
9
- } from "./chunk-TLMLEC4F.js";
9
+ } from "./chunk-KW7H5O3K.js";
10
10
  import {
11
11
  resolveAddressProps
12
12
  } from "./chunk-MTGEJRE4.js";
@@ -35,4 +35,4 @@ export {
35
35
  AddressAutocomplete,
36
36
  AddressAutocomplete_default
37
37
  };
38
- //# sourceMappingURL=chunk-Q75SJ35X.js.map
38
+ //# sourceMappingURL=chunk-GMTM6EN7.js.map
@@ -1,10 +1,10 @@
1
+ import {
2
+ chartValueFormatter
3
+ } from "./chunk-QVWNK4JO.js";
1
4
  import {
2
5
  getChartSpecRenderer,
3
6
  getRegisteredChartSpecTypes
4
7
  } from "./chunk-WKUA6P3W.js";
5
- import {
6
- chartValueFormatter
7
- } from "./chunk-QVWNK4JO.js";
8
8
 
9
9
  // src/components/data-display/Chart/chart-spec.ts
10
10
  var CHART_SEMANTIC_COLORS = [
@@ -149,4 +149,4 @@ export {
149
149
  parseChartSpec,
150
150
  specToChartProps
151
151
  };
152
- //# sourceMappingURL=chunk-R6SBP5M5.js.map
152
+ //# sourceMappingURL=chunk-GOWBYHYW.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Sheet
3
- } from "./chunk-ZIYMBR7K.js";
3
+ } from "./chunk-OTH7H3IP.js";
4
4
  import {
5
5
  Dialog
6
6
  } from "./chunk-YANLN6HP.js";
@@ -162,4 +162,4 @@ AppHeaderDetails.displayName = "AppHeaderDetails";
162
162
  export {
163
163
  AppHeaderDetails
164
164
  };
165
- //# sourceMappingURL=chunk-6NZTYZP5.js.map
165
+ //# sourceMappingURL=chunk-GVA5CYKP.js.map
@@ -0,0 +1,219 @@
1
+ import {
2
+ freshnessOf
3
+ } from "./chunk-XPMGFAJ3.js";
4
+ import {
5
+ FLEET_DOT,
6
+ FLEET_ROSTER,
7
+ FLEET_ROW,
8
+ FLEET_SKELETON
9
+ } from "./chunk-BTQZ3EX3.js";
10
+ import {
11
+ Skeleton
12
+ } from "./chunk-7VN7LFBA.js";
13
+
14
+ // src/components/data-display/FleetMap/FleetRoster.tsx
15
+ import Box from "@mui/material/Box/index.js";
16
+ import Stack from "@mui/material/Stack/index.js";
17
+ import Typography from "@mui/material/Typography/index.js";
18
+ import { useTheme } from "@mui/material/styles/index.js";
19
+ import React from "react";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ function freshnessColor(freshness, theme) {
22
+ if (freshness === "live") return theme.palette.success.main;
23
+ if (freshness === "lagging") return theme.palette.warning.main;
24
+ return theme.palette.text.disabled;
25
+ }
26
+ function RowText({
27
+ unit,
28
+ copy,
29
+ freshness,
30
+ testId
31
+ }) {
32
+ const theme = useTheme();
33
+ const meta = [
34
+ copy.freshness[freshness],
35
+ copy.lastSeen(unit.staleSeconds),
36
+ unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM)
37
+ ].filter((part) => Boolean(part)).join(" \xB7 ");
38
+ return /* @__PURE__ */ jsxs(Stack, { sx: { minWidth: 0, flexGrow: 1 }, children: [
39
+ /* @__PURE__ */ jsx(
40
+ Typography,
41
+ {
42
+ variant: "body2",
43
+ component: "p",
44
+ "data-testid": `${testId}-label`,
45
+ sx: { fontWeight: theme.typography.fontWeightMedium, overflowWrap: "anywhere" },
46
+ children: unit.label
47
+ }
48
+ ),
49
+ /* @__PURE__ */ jsx(
50
+ Typography,
51
+ {
52
+ variant: "caption",
53
+ component: "p",
54
+ "data-testid": `${testId}-meta`,
55
+ sx: { color: theme.palette.text.secondary },
56
+ children: meta
57
+ }
58
+ )
59
+ ] });
60
+ }
61
+ function useKeptInView(selected, position) {
62
+ const row = React.useRef(null);
63
+ React.useEffect(() => {
64
+ const box = row.current;
65
+ const list = box?.parentElement;
66
+ if (!selected || !box || !list) return;
67
+ const top = box.offsetTop - list.offsetTop;
68
+ if (top < list.scrollTop) {
69
+ list.scrollTop = top;
70
+ } else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {
71
+ list.scrollTop = top + box.offsetHeight - list.clientHeight;
72
+ }
73
+ }, [selected, position]);
74
+ return row;
75
+ }
76
+ function rowSx(theme, selected) {
77
+ const resting = selected ? theme.palette.action.selected : "transparent";
78
+ return {
79
+ display: "flex",
80
+ alignItems: "center",
81
+ gap: theme.spacing(FLEET_ROW.gapUnits),
82
+ padding: theme.spacing(FLEET_ROW.paddingYUnits, FLEET_ROW.paddingXUnits),
83
+ // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as
84
+ // a multiple of `theme.shape.borderRadius`, so dividing the theme value out
85
+ // and letting `sx` multiply it back in is quadratic: measured 4px on the
86
+ // default theme — which is why this looked right — and 36px on a host that
87
+ // sets its own radius to 12. In a package whose whole premise is being
88
+ // re-themed, only the multiple is portable.
89
+ borderRadius: FLEET_ROW.radiusMultiple,
90
+ cursor: "pointer",
91
+ backgroundColor: resting,
92
+ "&:hover": {
93
+ backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover
94
+ }
95
+ };
96
+ }
97
+ function FleetRow({
98
+ unit,
99
+ copy,
100
+ freshness,
101
+ selected,
102
+ onSelect,
103
+ optionId,
104
+ position,
105
+ testId
106
+ }) {
107
+ const theme = useTheme();
108
+ const color = freshnessColor(freshness, theme);
109
+ const row = useKeptInView(selected, position);
110
+ return /* @__PURE__ */ jsxs(
111
+ Box,
112
+ {
113
+ ref: row,
114
+ role: "option",
115
+ "aria-selected": selected,
116
+ id: optionId,
117
+ "data-testid": testId,
118
+ "data-freshness": freshness,
119
+ onClick: () => onSelect(unit.id),
120
+ sx: rowSx(theme, selected),
121
+ children: [
122
+ /* @__PURE__ */ jsx(
123
+ Box,
124
+ {
125
+ "aria-hidden": "true",
126
+ "data-testid": `${testId}-dot`,
127
+ sx: {
128
+ width: FLEET_DOT.size,
129
+ height: FLEET_DOT.size,
130
+ borderRadius: "50%",
131
+ flexShrink: 0,
132
+ backgroundColor: color
133
+ }
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsx(RowText, { unit, copy, freshness, testId }),
137
+ unit.badge && /* @__PURE__ */ jsx(
138
+ Typography,
139
+ {
140
+ variant: "caption",
141
+ component: "span",
142
+ "data-testid": `${testId}-badge`,
143
+ sx: { color: theme.palette.text.secondary, flexShrink: 0 },
144
+ children: unit.badge
145
+ }
146
+ )
147
+ ]
148
+ }
149
+ );
150
+ }
151
+ function FirstLoad({ testId }) {
152
+ return /* @__PURE__ */ jsx(Stack, { spacing: FLEET_SKELETON.gapUnits, "data-testid": `${testId}-skeleton`, "aria-hidden": "true", children: Array.from({ length: FLEET_SKELETON.rows }, (_, row) => /* @__PURE__ */ jsx(
153
+ Skeleton,
154
+ {
155
+ variant: "rectangular",
156
+ height: FLEET_SKELETON.height,
157
+ borderRadius: FLEET_SKELETON.radiusMultiple
158
+ },
159
+ row
160
+ )) });
161
+ }
162
+ function FleetRoster({
163
+ units,
164
+ copy,
165
+ selectedId,
166
+ onSelect,
167
+ laggingAfterSeconds,
168
+ staleAfterSeconds,
169
+ loading,
170
+ testId,
171
+ onKeyDown
172
+ }) {
173
+ const theme = useTheme();
174
+ const rowIdPrefix = React.useId();
175
+ const optionId = (id) => `${rowIdPrefix}-${id}`;
176
+ const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;
177
+ if (loading && units.length === 0) return /* @__PURE__ */ jsx(FirstLoad, { testId });
178
+ return /* @__PURE__ */ jsx(
179
+ Box,
180
+ {
181
+ role: "listbox",
182
+ tabIndex: 0,
183
+ "aria-label": copy.rosterLabel,
184
+ "aria-activedescendant": active ? optionId(active) : void 0,
185
+ "data-testid": `${testId}-roster`,
186
+ onKeyDown,
187
+ sx: {
188
+ display: "flex",
189
+ flexDirection: "column",
190
+ gap: theme.spacing(FLEET_ROSTER.gapUnits),
191
+ overflowY: "auto",
192
+ minWidth: 0,
193
+ "&:focus-visible": {
194
+ outline: `${FLEET_ROSTER.focusRingWidth}px solid ${theme.palette.primary.main}`,
195
+ outlineOffset: FLEET_ROSTER.focusRingOffset
196
+ }
197
+ },
198
+ children: units.map((unit, index) => /* @__PURE__ */ jsx(
199
+ FleetRow,
200
+ {
201
+ unit,
202
+ copy,
203
+ freshness: freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds),
204
+ selected: unit.id === active,
205
+ onSelect,
206
+ optionId: optionId(unit.id),
207
+ position: index,
208
+ testId: `${testId}-${unit.id}`
209
+ },
210
+ unit.id
211
+ ))
212
+ }
213
+ );
214
+ }
215
+
216
+ export {
217
+ FleetRoster
218
+ };
219
+ //# sourceMappingURL=chunk-HMV4QMXS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/FleetMap/FleetRoster.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { Skeleton } from '../../layout/Skeleton/Skeleton';\n\nimport { freshnessOf } from './FleetMap.helpers';\nimport { FLEET_DOT, FLEET_ROSTER, FLEET_ROW, FLEET_SKELETON } from './FleetMap.metrics';\nimport type { FleetFreshness, FleetMapCopy, FleetUnit } from './FleetMap.types';\n\n/**\n * The roster beside the map — and the ACCESSIBLE half of this component.\n *\n * A map is a picture of positions and a screen reader cannot read a picture, so\n * the panel's information is carried by this list. That is not a consolation\n * prize: the list answers the questions a dispatcher actually asks — who is\n * reporting, how recently, and what are they carrying — and it answers them in\n * an order the map cannot express.\n *\n * The map beside it is a NAMED LANDMARK rather than an `aria-hidden` one, so a\n * reader can skip it in one gesture — see `FleetCanvas`, which carries the\n * reason it must not be hidden.\n */\n\n/** Each freshness draws from the semantic palette, never a hardcoded hex. */\nfunction freshnessColor(freshness: FleetFreshness, theme: Theme): string {\n if (freshness === 'live') return theme.palette.success.main;\n if (freshness === 'lagging') return theme.palette.warning.main;\n return theme.palette.text.disabled;\n}\n\n/**\n * A row's two lines of text — the name, and the one-line summary under it.\n *\n * Split out of `FleetRow` to keep that function under the size gate, and the\n * seam is the natural one: everything here is READ, nothing is interactive.\n */\nfunction RowText({\n unit,\n copy,\n freshness,\n testId,\n}: Pick<RowProps, 'unit' | 'copy' | 'freshness' | 'testId'>): React.JSX.Element {\n const theme = useTheme();\n\n // Dropped rather than rendered empty: a phone that reports no accuracy radius\n // would otherwise print a trailing separator with nothing after it.\n const meta = [\n copy.freshness[freshness],\n copy.lastSeen(unit.staleSeconds),\n unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM),\n ]\n .filter((part): part is string => Boolean(part))\n .join(' · ');\n\n return (\n <Stack sx={{ minWidth: 0, flexGrow: 1 }}>\n <Typography\n variant=\"body2\"\n component=\"p\"\n data-testid={`${testId}-label`}\n sx={{ fontWeight: theme.typography.fontWeightMedium, overflowWrap: 'anywhere' }}\n >\n {unit.label}\n </Typography>\n <Typography\n variant=\"caption\"\n component=\"p\"\n data-testid={`${testId}-meta`}\n sx={{ color: theme.palette.text.secondary }}\n >\n {meta}\n </Typography>\n </Stack>\n );\n}\n\n/**\n * Keep the selected row visible INSIDE the roster.\n *\n * The roster caps its own height, so a dispatcher arrowing through a fleet of\n * thirty otherwise walks the selection below the fold with nothing moving —\n * `aria-activedescendant` follows, and a SIGHTED keyboard user sees no feedback\n * at all.\n *\n * Watches the row's POSITION as well as its selectedness, because the roster\n * re-sorts on every poll: a rider who stays selected while their staleness\n * moves them down the list would otherwise slide out of view with the effect\n * never re-running.\n *\n * Arithmetic rather than `scrollIntoView({ block: 'nearest' })` because that\n * walks every scrollable ancestor, the document included, and `nearest` only\n * spares an ancestor the row is already visible in — which is exactly false\n * when the panel is off screen. Re-running on every re-sort, it would yank the\n * whole page back to the map on a timer, and drag it there on mount for any\n * board rendered below the fold with a selection already set.\n */\nfunction useKeptInView(\n selected: boolean,\n position: number,\n): React.RefObject<HTMLDivElement | null> {\n const row = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const box = row.current;\n const list = box?.parentElement;\n if (!selected || !box || !list) return;\n const top = box.offsetTop - list.offsetTop;\n if (top < list.scrollTop) {\n list.scrollTop = top;\n } else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = top + box.offsetHeight - list.clientHeight;\n }\n }, [selected, position]);\n\n return row;\n}\n\n/**\n * A row's own box, selected or not.\n *\n * Out of line because the hover rule needs the explanation more than the JSX\n * has room for: hover must never WEAKEN the selection. Written flat as\n * `'&:hover': { backgroundColor: action.hover }`, the pseudo-class wins on\n * specificity and repaints the selected row with the hover tint — measured at\n * `rgba(0,0,0,0.08)` idle against `rgba(0,0,0,0.04)` hovered, so pointing at\n * the selected row visually DESELECTED it and made it indistinguishable from\n * any other row under the cursor.\n */\nfunction rowSx(theme: Theme, selected: boolean): SxProps<Theme> {\n const resting = selected ? theme.palette.action.selected : 'transparent';\n return {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(FLEET_ROW.gapUnits),\n padding: theme.spacing(FLEET_ROW.paddingYUnits, FLEET_ROW.paddingXUnits),\n // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as\n // a multiple of `theme.shape.borderRadius`, so dividing the theme value out\n // and letting `sx` multiply it back in is quadratic: measured 4px on the\n // default theme — which is why this looked right — and 36px on a host that\n // sets its own radius to 12. In a package whose whole premise is being\n // re-themed, only the multiple is portable.\n borderRadius: FLEET_ROW.radiusMultiple,\n cursor: 'pointer',\n backgroundColor: resting,\n '&:hover': {\n backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover,\n },\n };\n}\n\ninterface RowProps {\n unit: FleetUnit;\n copy: FleetMapCopy;\n freshness: FleetFreshness;\n selected: boolean;\n onSelect: (id: string) => void;\n /** The row's DOM id, which `aria-activedescendant` points at. */\n optionId: string;\n /** Where the row sits in the re-sorted roster — see the scroll effect. */\n position: number;\n testId: string;\n}\n\nfunction FleetRow({\n unit,\n copy,\n freshness,\n selected,\n onSelect,\n optionId,\n position,\n testId,\n}: RowProps): React.JSX.Element {\n const theme = useTheme();\n const color = freshnessColor(freshness, theme);\n const row = useKeptInView(selected, position);\n\n return (\n <Box\n ref={row}\n role=\"option\"\n aria-selected={selected}\n id={optionId}\n data-testid={testId}\n data-freshness={freshness}\n onClick={() => onSelect(unit.id)}\n sx={rowSx(theme, selected)}\n >\n {/* The dot repeats what the freshness word beside it already says, so it\n is hidden rather than read twice — and colour is never the only\n carrier of the state. */}\n <Box\n aria-hidden=\"true\"\n data-testid={`${testId}-dot`}\n sx={{\n width: FLEET_DOT.size,\n height: FLEET_DOT.size,\n borderRadius: '50%',\n flexShrink: 0,\n backgroundColor: color,\n }}\n />\n <RowText unit={unit} copy={copy} freshness={freshness} testId={testId} />\n {unit.badge && (\n <Typography\n variant=\"caption\"\n component=\"span\"\n data-testid={`${testId}-badge`}\n sx={{ color: theme.palette.text.secondary, flexShrink: 0 }}\n >\n {unit.badge}\n </Typography>\n )}\n </Box>\n );\n}\n\n/**\n * What stands in for the roster before any unit has landed.\n *\n * `aria-hidden`, because three grey bars are not information — the panel's\n * `aria-busy` and its optional announcement carry that. The radius is the same\n * MULTIPLE a real row uses rather than a raw pixel count: `Skeleton` forwards\n * the number into `sx`, where it scales with `theme.shape.borderRadius`, so a\n * literal `4` drew 16px against the rows' 4px on the default theme and 48px\n * against 12px on a re-themed host.\n */\nfunction FirstLoad({ testId }: { testId: string }): React.JSX.Element {\n return (\n <Stack spacing={FLEET_SKELETON.gapUnits} data-testid={`${testId}-skeleton`} aria-hidden=\"true\">\n {Array.from({ length: FLEET_SKELETON.rows }, (_, row) => (\n <Skeleton\n key={row}\n variant=\"rectangular\"\n height={FLEET_SKELETON.height}\n borderRadius={FLEET_SKELETON.radiusMultiple}\n />\n ))}\n </Stack>\n );\n}\n\nexport interface FleetRosterProps {\n units: readonly FleetUnit[];\n copy: FleetMapCopy;\n selectedId: string | null | undefined;\n onSelect: (id: string) => void;\n laggingAfterSeconds: number;\n staleAfterSeconds: number;\n loading: boolean;\n testId: string;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function FleetRoster({\n units,\n copy,\n selectedId,\n onSelect,\n laggingAfterSeconds,\n staleAfterSeconds,\n loading,\n testId,\n onKeyDown,\n}: FleetRosterProps): React.JSX.Element {\n const theme = useTheme();\n // Generated, not derived from `dataTestId`: two boards on one page filtered\n // from the same fleet would otherwise emit duplicate DOM ids and an ambiguous\n // `aria-activedescendant`. Same reason the heading uses one.\n const rowIdPrefix = React.useId();\n const optionId = (id: string): string => `${rowIdPrefix}-${id}`;\n\n // The selection is CONTROLLED, so it can name a unit that has since dropped\n // out of the freshness window — a courier ending their shift mid-poll. The\n // attribute must then be absent rather than pointing at an element that no\n // longer renders, which announces nothing and fails an axe audit. `mapCentre`\n // and `nextSelection` both handle the same case; this is the third place.\n const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;\n\n // Only when there is nothing to show yet. Unmounting a populated listbox on\n // every poll destroys the focus inside it, so a dispatcher arrowing through\n // the roster is thrown back to the top of the page each time the data\n // refreshes — and the rows they were reading vanish and return.\n if (loading && units.length === 0) return <FirstLoad testId={testId} />;\n\n return (\n <Box\n role=\"listbox\"\n // A single tab stop with arrow keys inside, which is the listbox pattern:\n // a dispatcher tabbing past a fleet of thirty should not have to press it\n // thirty times to reach the map.\n tabIndex={0}\n aria-label={copy.rosterLabel}\n aria-activedescendant={active ? optionId(active) : undefined}\n data-testid={`${testId}-roster`}\n onKeyDown={onKeyDown}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(FLEET_ROSTER.gapUnits),\n overflowY: 'auto',\n minWidth: 0,\n '&:focus-visible': {\n outline: `${FLEET_ROSTER.focusRingWidth}px solid ${theme.palette.primary.main}`,\n outlineOffset: FLEET_ROSTER.focusRingOffset,\n },\n }}\n >\n {units.map((unit, index) => (\n <FleetRow\n key={unit.id}\n unit={unit}\n copy={copy}\n freshness={freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds)}\n selected={unit.id === active}\n onSelect={onSelect}\n optionId={optionId(unit.id)}\n position={index}\n testId={`${testId}-${unit.id}`}\n />\n ))}\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KHG57NAE.js";
4
4
  import {
5
5
  Pagination
6
- } from "./chunk-W2UTDN4T.js";
6
+ } from "./chunk-RBGOGTT2.js";
7
7
  import {
8
8
  default as default2
9
9
  } from "./chunk-6DPAWXZ3.js";
@@ -31,4 +31,4 @@ function DataViewsPagination({
31
31
  export {
32
32
  DataViewsPagination
33
33
  };
34
- //# sourceMappingURL=chunk-VR5HDUBK.js.map
34
+ //# sourceMappingURL=chunk-HP2ODXNA.js.map
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-5WNQJ5KS.js";
5
5
  import {
6
6
  PillControl
7
- } from "./chunk-WLQTHPMX.js";
7
+ } from "./chunk-EJQW2IYW.js";
8
8
  import {
9
9
  MoreFilters
10
- } from "./chunk-QFJRB27Q.js";
10
+ } from "./chunk-6LGWJFQK.js";
11
11
  import {
12
12
  RangePill
13
- } from "./chunk-QZBUGUOY.js";
13
+ } from "./chunk-DFLTUI7W.js";
14
14
  import {
15
15
  CollapsedSearch,
16
16
  InlineKeyword
@@ -220,4 +220,4 @@ function FilterSlots({
220
220
  export {
221
221
  InlineFilterControls
222
222
  };
223
- //# sourceMappingURL=chunk-2MMEIN4T.js.map
223
+ //# sourceMappingURL=chunk-I3E2QHTH.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ useDateRangePicker
3
+ } from "./chunk-OD4Z5G6G.js";
1
4
  import {
2
5
  DateRangeQuickList
3
6
  } from "./chunk-ZRHSIFWA.js";
@@ -7,9 +10,6 @@ import {
7
10
  import {
8
11
  DEFAULT_QUICK_RANGES
9
12
  } from "./chunk-QKLSHNOH.js";
10
- import {
11
- useDateRangePicker
12
- } from "./chunk-OD4Z5G6G.js";
13
13
  import {
14
14
  toLocalDay
15
15
  } from "./chunk-FRAVVI4A.js";
@@ -180,4 +180,4 @@ export {
180
180
  DateRangePicker,
181
181
  DateRangePicker_default
182
182
  };
183
- //# sourceMappingURL=chunk-UVGRRI7N.js.map
183
+ //# sourceMappingURL=chunk-IPVYEPXO.js.map
@@ -3,7 +3,10 @@ import {
3
3
  } from "./chunk-LMXWI3DD.js";
4
4
  import {
5
5
  CategoryPanel
6
- } from "./chunk-AGSBIUPV.js";
6
+ } from "./chunk-TPLKJHNN.js";
7
+ import {
8
+ useCategoryCommit
9
+ } from "./chunk-ZAB65STX.js";
7
10
  import {
8
11
  CategoryTrigger
9
12
  } from "./chunk-KIHQE5YA.js";
@@ -16,9 +19,6 @@ import {
16
19
  import {
17
20
  useCategoryKeyHandler
18
21
  } from "./chunk-ISH42UC7.js";
19
- import {
20
- useCategoryCommit
21
- } from "./chunk-ZAB65STX.js";
22
22
  import {
23
23
  summarizeSelection
24
24
  } from "./chunk-LR6MSKTT.js";
@@ -158,4 +158,4 @@ function CategorySelect(props) {
158
158
  export {
159
159
  CategorySelect
160
160
  };
161
- //# sourceMappingURL=chunk-5ZTUP65G.js.map
161
+ //# sourceMappingURL=chunk-JM64OEU6.js.map
@@ -1,17 +1,17 @@
1
- import {
2
- AVATAR_DEFAULTS,
3
- contentTypeOf,
4
- pickAvatarContent
5
- } from "./chunk-3ZVUNSFF.js";
6
1
  import {
7
2
  AvatarView
8
- } from "./chunk-4SQFO4GW.js";
3
+ } from "./chunk-NA7MIEG6.js";
9
4
  import {
10
5
  BORDER_WIDTH,
11
6
  GROUP_HOVER,
12
7
  GROUP_MAX,
13
8
  GROUP_OVERLAP
14
9
  } from "./chunk-FAITHWIO.js";
10
+ import {
11
+ AVATAR_DEFAULTS,
12
+ contentTypeOf,
13
+ pickAvatarContent
14
+ } from "./chunk-3ZVUNSFF.js";
15
15
 
16
16
  // src/components/data-display/Avatar/Avatar.tsx
17
17
  import BrokenImage from "@mui/icons-material/BrokenImage";
@@ -172,4 +172,4 @@ export {
172
172
  Avatar,
173
173
  AvatarGroup
174
174
  };
175
- //# sourceMappingURL=chunk-7BYFC2MR.js.map
175
+ //# sourceMappingURL=chunk-JUHUKZGU.js.map
@@ -0,0 +1,116 @@
1
+ import {
2
+ useFleetMap
3
+ } from "./chunk-ZCPSND5Y.js";
4
+ import {
5
+ FleetBody
6
+ } from "./chunk-RP5FK3SO.js";
7
+ import {
8
+ FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
9
+ FLEET_DEFAULT_STALE_AFTER_SECONDS,
10
+ FLEET_PANEL
11
+ } from "./chunk-BTQZ3EX3.js";
12
+ import {
13
+ SR_ONLY_SX
14
+ } from "./chunk-RNCQ5KHQ.js";
15
+ import {
16
+ EmptyState
17
+ } from "./chunk-25R3ITGZ.js";
18
+
19
+ // src/components/data-display/FleetMap/FleetMap.tsx
20
+ import Box from "@mui/material/Box/index.js";
21
+ import Typography from "@mui/material/Typography/index.js";
22
+ import { useTheme } from "@mui/material/styles/index.js";
23
+ import React from "react";
24
+ import { jsx, jsxs } from "react/jsx-runtime";
25
+ var DEFAULT_HEIGHT = "420px";
26
+ function FleetStatus({
27
+ announcement,
28
+ loading,
29
+ testId
30
+ }) {
31
+ if (announcement === void 0) return null;
32
+ return /* @__PURE__ */ jsx(Box, { role: "status", "aria-live": "polite", "data-testid": `${testId}-status`, sx: SR_ONLY_SX, children: loading ? announcement : "" });
33
+ }
34
+ var FleetMap = React.memo(
35
+ ({
36
+ units,
37
+ copy,
38
+ // NO default. `undefined` is what tells the hook the caller does not own
39
+ // the selection; defaulting it to `null` here made every render look
40
+ // controlled and the uncontrolled path unreachable.
41
+ selectedId,
42
+ onSelect,
43
+ laggingAfterSeconds = FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
44
+ staleAfterSeconds = FLEET_DEFAULT_STALE_AFTER_SECONDS,
45
+ height = DEFAULT_HEIGHT,
46
+ loading = false,
47
+ className,
48
+ dataTestId
49
+ }) => {
50
+ const theme = useTheme();
51
+ const testId = dataTestId || "fleet-map";
52
+ const headingId = React.useId();
53
+ const { ordered, active, centre, select, markers, onKeyDown } = useFleetMap(
54
+ units,
55
+ selectedId,
56
+ onSelect
57
+ );
58
+ return /* @__PURE__ */ jsxs(
59
+ Box,
60
+ {
61
+ role: "region",
62
+ "aria-labelledby": headingId,
63
+ className,
64
+ "data-testid": testId,
65
+ sx: { display: "flex", flexDirection: "column", gap: theme.spacing(FLEET_PANEL.gapUnits), minWidth: 0 },
66
+ children: [
67
+ /* @__PURE__ */ jsx(
68
+ Typography,
69
+ {
70
+ id: headingId,
71
+ variant: "subtitle1",
72
+ component: "h2",
73
+ "data-testid": `${testId}-title`,
74
+ sx: { fontWeight: theme.typography.fontWeightMedium },
75
+ children: copy.title
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsx(FleetStatus, { announcement: copy.loading, loading, testId }),
79
+ !loading && ordered.length === 0 ? /* @__PURE__ */ jsx(
80
+ EmptyState,
81
+ {
82
+ variant: "minimal",
83
+ title: copy.emptyTitle,
84
+ description: copy.emptyDescription,
85
+ dataTestId: `${testId}-empty`
86
+ }
87
+ ) : /* @__PURE__ */ jsx(
88
+ FleetBody,
89
+ {
90
+ ordered,
91
+ centre,
92
+ markers,
93
+ select,
94
+ onKeyDown,
95
+ copy,
96
+ selectedId: active,
97
+ laggingAfterSeconds,
98
+ staleAfterSeconds,
99
+ height,
100
+ loading,
101
+ testId
102
+ }
103
+ )
104
+ ]
105
+ }
106
+ );
107
+ }
108
+ );
109
+ FleetMap.displayName = "FleetMap";
110
+ var FleetMap_default = FleetMap;
111
+
112
+ export {
113
+ FleetMap,
114
+ FleetMap_default
115
+ };
116
+ //# sourceMappingURL=chunk-JZXWCEH5.js.map