@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
@@ -0,0 +1,45 @@
1
+ import type { FleetFreshness, FleetUnit } from './FleetMap.base';
2
+ /**
3
+ * How current a fix is, on the two thresholds the caller supplied.
4
+ *
5
+ * Inclusive at both boundaries in the direction that reads better on a screen:
6
+ * a unit exactly at the lagging threshold is already lagging. A boundary has to
7
+ * fall somewhere, and the conservative side is the one that does not tell a
8
+ * dispatcher somebody is live when they are on the edge of not being.
9
+ */
10
+ export declare function freshnessOf(staleSeconds: number, laggingAfterSeconds: number, staleAfterSeconds: number): FleetFreshness;
11
+ /** A latitude/longitude pair, as the map wants its centre. */
12
+ export interface LatLng {
13
+ lat: number;
14
+ lng: number;
15
+ }
16
+ /**
17
+ * Where the map should point.
18
+ *
19
+ * The selected unit when there is one — a dispatcher who clicked a name is
20
+ * asking to look at them. Otherwise the fleet's own centroid, which keeps
21
+ * everybody in frame without the caller having to compute a bounding box.
22
+ *
23
+ * `null` for an empty fleet rather than a coordinate: (0, 0) is a real place in
24
+ * the Atlantic, and a map that quietly sails there is worse than one that says
25
+ * it has nothing to show.
26
+ */
27
+ export declare function mapCentre(units: readonly FleetUnit[], selectedId?: string | null): LatLng | null;
28
+ /**
29
+ * The roster's order: freshest first, then alphabetically.
30
+ *
31
+ * Not the caller's order, deliberately. The one question this panel answers is
32
+ * *who is moving right now*, and a list sorted by anything else buries the
33
+ * answer under whoever happens to sort first. Ties break on the label so the
34
+ * list does not reshuffle between polls when two units share a staleness.
35
+ */
36
+ export declare function rosterOrder(units: readonly FleetUnit[]): FleetUnit[];
37
+ /**
38
+ * Move the selection by one row, wrapping at both ends.
39
+ *
40
+ * Wrapping rather than stopping: this is a short list a dispatcher arrows
41
+ * through repeatedly, and a selection that sticks at the last row makes the
42
+ * keyboard path feel broken next to the mouse one.
43
+ */
44
+ export declare function nextSelection(units: readonly FleetUnit[], currentId: string | null | undefined, step: 1 | -1): string | null;
45
+ //# sourceMappingURL=FleetMap.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.helpers.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,iBAAiB,EAAE,MAAM,GACxB,cAAc,CAIhB;AAED,8DAA8D;AAC9D,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAIpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GACX,MAAM,GAAG,IAAI,CAQf"}
@@ -0,0 +1,71 @@
1
+ import { type LatLng } from './FleetMap.helpers';
2
+ import type { FleetUnit } from './FleetMap.base';
3
+ /**
4
+ * The half of a key event this hook reads, spelled structurally.
5
+ *
6
+ * NOT `React.KeyboardEvent<HTMLDivElement>`: the native type program is checked
7
+ * without the DOM lib (`tsconfig.native.json`), so a DOM type here would put
8
+ * the whole hook out of reach of the React Native renderer that shares it. A
9
+ * DOM event satisfies this shape, and a handler taking the wider type is
10
+ * assignable wherever the narrower one is expected — so the web passes its own
11
+ * `onKeyDown` unchanged.
12
+ */
13
+ export interface FleetKeyEvent {
14
+ key: string;
15
+ altKey?: boolean;
16
+ ctrlKey?: boolean;
17
+ metaKey?: boolean;
18
+ shiftKey?: boolean;
19
+ preventDefault: () => void;
20
+ }
21
+ /**
22
+ * Everything the board derives from its props, in one hook.
23
+ *
24
+ * Split out of the component so the component is layout and nothing else.
25
+ *
26
+ * The memos are honest about what they buy, which is less than it looks. `units`
27
+ * arrives as a fresh array on every poll, so `ordered` and `markers` are
28
+ * recomputed on every poll whatever these do — a new array is a new identity.
29
+ * What they buy is stability across the renders a poll does NOT cause: a parent
30
+ * re-render, a selection change (which re-runs `centre` but not `ordered`), a
31
+ * theme flip. Sorting a fleet is cheap either way; this is tidiness, not a
32
+ * measured win, and it should not be read as one.
33
+ *
34
+ * `centre` is the exception, and there it is load-bearing rather than tidy —
35
+ * see {@link useFleetMap}.
36
+ *
37
+ * ## Selection works with, without, or half-way through a handler
38
+ *
39
+ * `selectedId` and `onSelect` are both optional, so all four combinations
40
+ * arrive. Left purely controlled, the two useful ones broke: with neither prop
41
+ * the roster was a listbox that answered nothing, and arrowing it called
42
+ * `preventDefault` before a no-op `select`, so the keys did not move a
43
+ * selection AND did not scroll the page either.
44
+ *
45
+ * So the hook keeps its own selection and defers to `selectedId` only when the
46
+ * caller passes one — the ordinary controlled/uncontrolled split, the same one
47
+ * an `<input>` makes. `onSelect` still fires either way, so a consumer can
48
+ * observe the selection without owning it.
49
+ */
50
+ /** One pin, in the shape `MapPreview` takes. */
51
+ export interface FleetMarker {
52
+ position: LatLng;
53
+ title: string;
54
+ onClick: () => void;
55
+ }
56
+ export interface FleetMapState {
57
+ /** The units, freshest first — see {@link rosterOrder}. */
58
+ ordered: FleetUnit[];
59
+ /**
60
+ * The selection in force — the caller's when they own it, this hook's when
61
+ * they do not. Everything downstream reads THIS and never the raw prop.
62
+ */
63
+ active: string | null;
64
+ /** Where the map points, or `null` when there is nothing to show. */
65
+ centre: LatLng | null;
66
+ select: (id: string) => void;
67
+ markers: FleetMarker[];
68
+ onKeyDown: (event: FleetKeyEvent) => void;
69
+ }
70
+ export declare function useFleetMap(units: readonly FleetUnit[], selectedId: string | null | undefined, onSelect: ((id: string) => void) | undefined): FleetMapState;
71
+ //# sourceMappingURL=FleetMap.hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.hooks.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAiDD,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC3C,aAAa,CAuDf"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * THE NUMBERS BOTH `FleetMap` RENDERERS DRAW WITH.
3
+ *
4
+ * `FleetRoster.tsx` / `FleetMap.tsx` (web, MUI `sx`) and `FleetRoster.native.tsx`
5
+ * / `FleetMap.native.tsx` (React Native) read this one table. The web hands the
6
+ * spacing UNITS to `theme.spacing()` and the radius MULTIPLES to `sx`; native
7
+ * multiplies the units by the theme's own spacing step and the multiples by
8
+ * `shape.borderRadius`.
9
+ *
10
+ * Nothing here imports a renderer, a theme or a colour: a freshness dot's
11
+ * COLOUR is the theme's (`success.main`, `warning.main`, `text.disabled`), and
12
+ * the two sides reach the same palette through different doors.
13
+ *
14
+ * ## Why the radii are MULTIPLES and never pixels
15
+ *
16
+ * MUI's `sx` reads a bare number for `borderRadius` as a multiple of
17
+ * `theme.shape.borderRadius`, so a value that already had the theme's radius
18
+ * divided out of it is applied twice. Measured: `theme.shape.borderRadius / 4`
19
+ * drew 4px on the default theme — which is why it looked right — and 36px on a
20
+ * host that sets its own radius to 12. In a package whose whole premise is
21
+ * being re-themed, only the multiple is portable, and it is the multiple that
22
+ * both renderers store here.
23
+ */
24
+ /** `theme.spacing(n)` for the panel's own stack. */
25
+ export declare const FLEET_PANEL: {
26
+ /** Between the heading, the status region and the body. */
27
+ readonly gapUnits: 1.5;
28
+ };
29
+ /** The roster list box. */
30
+ export declare const FLEET_ROSTER: {
31
+ /** Between rows. */
32
+ readonly gapUnits: 0.5;
33
+ /** `:focus-visible` ring on the web; a device has no focus ring to draw. */
34
+ readonly focusRingWidth: 2;
35
+ readonly focusRingOffset: 2;
36
+ };
37
+ /** One roster row. */
38
+ export declare const FLEET_ROW: {
39
+ /** Between the dot, the text block and the badge. */
40
+ readonly gapUnits: 1.5;
41
+ /** `theme.spacing(y, x)`. */
42
+ readonly paddingYUnits: 1;
43
+ readonly paddingXUnits: 1.5;
44
+ /** A MULTIPLE of `theme.shape.borderRadius` — see the note above. */
45
+ readonly radiusMultiple: 1;
46
+ };
47
+ /**
48
+ * The freshness dot.
49
+ *
50
+ * A perfect circle, so the radius is half the box on both sides rather than
51
+ * the web's `50%`: React Native resolves a percentage radius against the box
52
+ * it is given, and a square box makes the two spellings agree.
53
+ */
54
+ export declare const FLEET_DOT: {
55
+ readonly size: 10;
56
+ };
57
+ /** What stands in for the roster before any unit has landed. */
58
+ export declare const FLEET_SKELETON: {
59
+ /** Three bars, the height of a row with its padding. */
60
+ readonly rows: 3;
61
+ readonly height: 44;
62
+ /** A MULTIPLE, for the same reason the row's is. */
63
+ readonly radiusMultiple: 1;
64
+ readonly gapUnits: 1;
65
+ };
66
+ /**
67
+ * How long a fix stays `live`, and then `lagging`, when the caller says nothing.
68
+ *
69
+ * Ninety seconds and five minutes: sized for a phone reporting every twenty
70
+ * seconds, which is the densest cadence a battery tolerates all day. They are
71
+ * DEFAULTS and not a rule — a fleet on five-minute trackers passes its own, and
72
+ * the props exist so it can.
73
+ */
74
+ export declare const FLEET_DEFAULT_LAGGING_AFTER_SECONDS = 90;
75
+ export declare const FLEET_DEFAULT_STALE_AFTER_SECONDS = 300;
76
+ //# sourceMappingURL=FleetMap.metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,oDAAoD;AACpD,eAAO,MAAM,WAAW;IACtB,2DAA2D;;CAEnD,CAAC;AAEX,2BAA2B;AAC3B,eAAO,MAAM,YAAY;IACvB,oBAAoB;;IAEpB,4EAA4E;;;CAGpE,CAAC;AAEX,sBAAsB;AACtB,eAAO,MAAM,SAAS;IACpB,qDAAqD;;IAErD,6BAA6B;;;IAG7B,qEAAqE;;CAE7D,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;;CAEZ,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,cAAc;IACzB,wDAAwD;;;IAGxD,oDAAoD;;;CAG5C,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,iCAAiC,MAAM,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { MapPreviewCopy } from '../../../copy';
2
+ import type { FleetMapBaseProps, FleetMapCopyBase } from './FleetMap.base';
3
+ /**
4
+ * The WEB half of `FleetMap`'s contract.
5
+ *
6
+ * Everything platform-neutral lives in `FleetMap.base.ts` and is re-exported
7
+ * here unchanged, so a consumer's `import type { FleetUnit } from
8
+ * '@12-apps/ui/data-display/FleetMap'` keeps resolving exactly as it did. What
9
+ * this file adds is what only the web has: the map.
10
+ */
11
+ export type { FleetFreshness, FleetMapBaseProps, FleetMapCopyBase, FleetUnit, } from './FleetMap.base';
12
+ /**
13
+ * Every word the board prints, plus the map control bar's own six.
14
+ *
15
+ * `map` is web-only because the map half is: `MapPreview` has no React Native
16
+ * build yet, so the native copy interface stops at the roster's words rather
17
+ * than asking a caller to name controls nothing renders. See `NATIVE-NOTES.md`.
18
+ */
19
+ export interface FleetMapCopy extends FleetMapCopyBase {
20
+ /**
21
+ * The map region's accessible name.
22
+ *
23
+ * The map is NOT `aria-hidden`, and that is deliberate rather than an
24
+ * oversight: it carries focusable controls (zoom, centre, map type), and
25
+ * `aria-hidden` over a focusable subtree is the `aria-hidden-focus`
26
+ * violation — a keyboard user tabs into a region a screen reader insists is
27
+ * not there. So it is a NAMED region a reader can skip past instead, and the
28
+ * roster beside it carries every fact a pin does.
29
+ *
30
+ * Skipping it does not silence it: `MapPreview` carries its own
31
+ * `aria-live="polite"` and announces its centre in English on every
32
+ * re-centre. See `FleetCanvas` for why that is stated rather than fixed here.
33
+ */
34
+ mapLabel: string;
35
+ /** The map control bar's own six names. */
36
+ map: MapPreviewCopy;
37
+ }
38
+ /** Props for the {@link FleetMap} live board. */
39
+ export interface FleetMapProps extends FleetMapBaseProps {
40
+ copy: FleetMapCopy;
41
+ /** Map height, any CSS length. */
42
+ height?: string;
43
+ className?: string;
44
+ }
45
+ //# sourceMappingURL=FleetMap.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE3E;;;;;;;GAOG;AACH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,IAAI,EAAE,YAAY,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { FleetMapCopy, FleetUnit } from './FleetMap.types';
3
+ export interface FleetRosterProps {
4
+ units: readonly FleetUnit[];
5
+ copy: FleetMapCopy;
6
+ selectedId: string | null | undefined;
7
+ onSelect: (id: string) => void;
8
+ laggingAfterSeconds: number;
9
+ staleAfterSeconds: number;
10
+ loading: boolean;
11
+ testId: string;
12
+ onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;
13
+ }
14
+ export declare function FleetRoster({ units, copy, selectedId, onSelect, laggingAfterSeconds, staleAfterSeconds, loading, testId, onKeyDown, }: FleetRosterProps): React.JSX.Element;
15
+ //# sourceMappingURL=FleetRoster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetRoster.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetRoster.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAkB,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA2OhF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CACjE;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA2DtC"}
@@ -0,0 +1,5 @@
1
+ export { FleetMap } from './FleetMap';
2
+ export { freshnessOf, mapCentre, nextSelection, rosterOrder } from './FleetMap.helpers';
3
+ export type { LatLng } from './FleetMap.helpers';
4
+ export type { FleetFreshness, FleetMapCopy, FleetMapProps, FleetUnit, } from './FleetMap.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxF,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,kBAAkB,CAAC"}
@@ -17,6 +17,7 @@ export * from './InteractiveTooltip';
17
17
  export * from './LazyImage';
18
18
  export * from './Lightbox';
19
19
  export * from './LoadingState';
20
+ export * from './FleetMap';
20
21
  export * from './MapPreview';
21
22
  export * from './Popover';
22
23
  export * from './Progress';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,uCAAuC,CAAC;AACtD,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,uCAAuC,CAAC;AACtD,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -27,6 +27,19 @@ export interface WebAria {
27
27
  * it expands is a listbox — which is what the web's own trigger carries.
28
28
  */
29
29
  'aria-haspopup'?: 'listbox' | 'menu' | 'dialog' | 'true';
30
+ /**
31
+ * Which option a composite widget's single tab stop is currently on — the
32
+ * listbox pattern, where the LIST holds focus and the selection moves inside
33
+ * it. React Native has no equivalent because it has no roving focus to
34
+ * describe: a device selects by touching the row.
35
+ *
36
+ * Note the interaction with `aria-atomic` documented on {@link webAria}:
37
+ * react-native-web reads THIS value when it means the atomic flag, so a
38
+ * component that sets both gets the descendant id emitted as `aria-atomic`.
39
+ * Nothing here sets both, and a component that needs to should pass its own
40
+ * atomic flag directly rather than through this helper.
41
+ */
42
+ 'aria-activedescendant'?: string;
30
43
  }
31
44
  /**
32
45
  * `attrs` as something JSX can spread onto a react-native element without
@@ -1 +1 @@
1
- {"version":3,"file":"aria.d.ts","sourceRoot":"","sources":["../../../src/platform/aria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAO;IACtB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAE7E;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"aria.d.ts","sourceRoot":"","sources":["../../../src/platform/aria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAO;IACtB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzD;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAE7E;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CAExE"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * THE CONTRACT BOTH `FleetMap` RENDERERS HONOUR — and nothing else.
3
+ *
4
+ * This file imports no MUI and no react-native, on purpose: it ships in BOTH
5
+ * declaration outputs (`dist/types` and `dist/types-native`), and a native
6
+ * consumer has no `@mui/material` to resolve a type import against.
7
+ *
8
+ * What is NOT here is as deliberate as what is. `map` (the map control bar's
9
+ * six words) lives on the web copy alone, because the map half is web-only
10
+ * until `MapPreview` is ported — see `NATIVE-NOTES.md`. A native caller that
11
+ * had to supply words for a bar no renderer draws would be asked to describe
12
+ * something it cannot see.
13
+ */
14
+ /**
15
+ * One tracked unit's newest position, as the caller resolved it.
16
+ *
17
+ * Deliberately says nothing about WHAT is being tracked. A courier, a service
18
+ * van, a field engineer — the component draws a labelled dot with a freshness,
19
+ * and every word that names the domain arrives through the copy object.
20
+ */
21
+ export interface FleetUnit {
22
+ id: string;
23
+ /** The name a human reads, on the pin and in the roster. */
24
+ label: string;
25
+ latitude: number;
26
+ longitude: number;
27
+ /**
28
+ * The fix's accuracy radius in metres, when the platform reported one.
29
+ *
30
+ * Kept because it is what separates a rooftop GPS fix from a cell-tower guess
31
+ * three blocks wide, and a map that draws both identically tells its reader
32
+ * something false.
33
+ */
34
+ accuracyM?: number | null;
35
+ /**
36
+ * Seconds since the fix was ACCEPTED, on the server's clock.
37
+ *
38
+ * The caller computes it, and the distinction matters: a device whose own
39
+ * clock is an hour slow would otherwise report itself as an hour stale while
40
+ * reporting perfectly.
41
+ */
42
+ staleSeconds: number;
43
+ /** A short pre-formatted badge beside the name, e.g. `"2 entregas"`. */
44
+ badge?: string;
45
+ }
46
+ /** How current a unit's newest fix is, derived from the thresholds below. */
47
+ export type FleetFreshness = 'live' | 'lagging' | 'stale';
48
+ /**
49
+ * Every word the board prints, and the two it FORMATS — minus the map's own.
50
+ *
51
+ * `lastSeen` and `accuracy` are functions rather than strings because a
52
+ * duration and a distance are locale rules, and this package holds the same
53
+ * line `StatCard` does: presentation only, the caller owns the formatting. A
54
+ * `lastSeenMinutes: string` template would have made "há 2 min" the only
55
+ * shape any consumer could ever render.
56
+ */
57
+ export interface FleetMapCopyBase {
58
+ /** The panel's heading. */
59
+ title: string;
60
+ /** What the roster says when nobody is reporting. */
61
+ emptyTitle: string;
62
+ emptyDescription?: string;
63
+ /** The roster list's accessible name — it is the map's readable half. */
64
+ rosterLabel: string;
65
+ /**
66
+ * What a screen reader hears while the roster reloads, e.g. "Atualizando a
67
+ * frota". OPTIONAL, and silence is the honest default: the busy state marks
68
+ * the region stale without uttering anything, the skeletons are hidden from
69
+ * the reader, and this component cannot invent the sentence in the reader's
70
+ * language. Set it and the panel announces politely; leave it and it stays
71
+ * quiet.
72
+ *
73
+ * Announced on a TRANSITION into loading. A board mounted already loading is
74
+ * silent — as any live region is at mount, since there is no change for a
75
+ * reader to observe.
76
+ */
77
+ loading?: string;
78
+ /** The three freshness words, as a reader sees them on a row. */
79
+ freshness: Record<FleetFreshness, string>;
80
+ /** `(seconds) => "há 2 min"`. */
81
+ lastSeen: (staleSeconds: number) => string;
82
+ /** `(metres) => "±12 m"`. A unit with no accuracy renders none. */
83
+ accuracy: (metres: number) => string;
84
+ }
85
+ /**
86
+ * The props both renderers take.
87
+ *
88
+ * `height` and `className` are NOT here: the first is a CSS length the web
89
+ * gives the map, and the second is a DOM class. Each side declares its own
90
+ * layout escape hatch beside its own extras.
91
+ */
92
+ export interface FleetMapBaseProps {
93
+ /** Everyone currently reporting. An empty array renders the empty state. */
94
+ units: readonly FleetUnit[];
95
+ /**
96
+ * Which unit is highlighted: the roster marks it selected, and on the web the
97
+ * map centres on it. `null` selects nobody.
98
+ *
99
+ * PASSING IT AT ALL IS THE DECISION. Present on the first render — `null`
100
+ * included — and the board is controlled for life: it renders what you pass
101
+ * and never moves the selection itself. Absent on the first render and it
102
+ * keeps its own, reporting each change through {@link onSelect}. The mode is
103
+ * latched on that first render, the way React latches an `<input>`, so the
104
+ * component cannot change its own semantics halfway through a session.
105
+ *
106
+ * A controlled board reads `undefined` as "nobody is selected", so
107
+ * `useState<string>()` in the caller behaves: clearing it clears the roster.
108
+ */
109
+ selectedId?: string | null;
110
+ /**
111
+ * A click or press on a row, and each arrow-key move on the web.
112
+ *
113
+ * Passing {@link selectedId} WITHOUT this is a selection nothing can move:
114
+ * the arrow keys then decline to act and leave the page to scroll, rather
115
+ * than swallowing a keypress that would do nothing.
116
+ */
117
+ onSelect?: (id: string) => void;
118
+ /**
119
+ * Seconds after which a unit stops reading as `live`, and then as `lagging`.
120
+ *
121
+ * Both carry a GENERIC default (90s and 300s, sized for a phone reporting
122
+ * every twenty seconds) and no domain one, because the answer is entirely a
123
+ * property of the fleet's own ping cadence: a phone reporting every twenty
124
+ * seconds is late at ninety, and a tracker reporting every five minutes is
125
+ * not. A component that picked one would be picking it for every consumer.
126
+ */
127
+ laggingAfterSeconds?: number;
128
+ staleAfterSeconds?: number;
129
+ /**
130
+ * While true the roster is marked busy, and renders skeletons IF no units
131
+ * have landed yet — a poll over a populated roster keeps the list, because
132
+ * unmounting it throws away the focus inside it.
133
+ *
134
+ * It only ANNOUNCES if the copy's `loading` sentence is set: busy is a state,
135
+ * not an utterance.
136
+ */
137
+ loading?: boolean;
138
+ /** Test id for the panel root; every child id is derived from it. */
139
+ dataTestId?: string;
140
+ }
141
+ //# sourceMappingURL=FleetMap.base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC1C,iCAAiC;IACjC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,mEAAmE;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,45 @@
1
+ import type { FleetFreshness, FleetUnit } from './FleetMap.base';
2
+ /**
3
+ * How current a fix is, on the two thresholds the caller supplied.
4
+ *
5
+ * Inclusive at both boundaries in the direction that reads better on a screen:
6
+ * a unit exactly at the lagging threshold is already lagging. A boundary has to
7
+ * fall somewhere, and the conservative side is the one that does not tell a
8
+ * dispatcher somebody is live when they are on the edge of not being.
9
+ */
10
+ export declare function freshnessOf(staleSeconds: number, laggingAfterSeconds: number, staleAfterSeconds: number): FleetFreshness;
11
+ /** A latitude/longitude pair, as the map wants its centre. */
12
+ export interface LatLng {
13
+ lat: number;
14
+ lng: number;
15
+ }
16
+ /**
17
+ * Where the map should point.
18
+ *
19
+ * The selected unit when there is one — a dispatcher who clicked a name is
20
+ * asking to look at them. Otherwise the fleet's own centroid, which keeps
21
+ * everybody in frame without the caller having to compute a bounding box.
22
+ *
23
+ * `null` for an empty fleet rather than a coordinate: (0, 0) is a real place in
24
+ * the Atlantic, and a map that quietly sails there is worse than one that says
25
+ * it has nothing to show.
26
+ */
27
+ export declare function mapCentre(units: readonly FleetUnit[], selectedId?: string | null): LatLng | null;
28
+ /**
29
+ * The roster's order: freshest first, then alphabetically.
30
+ *
31
+ * Not the caller's order, deliberately. The one question this panel answers is
32
+ * *who is moving right now*, and a list sorted by anything else buries the
33
+ * answer under whoever happens to sort first. Ties break on the label so the
34
+ * list does not reshuffle between polls when two units share a staleness.
35
+ */
36
+ export declare function rosterOrder(units: readonly FleetUnit[]): FleetUnit[];
37
+ /**
38
+ * Move the selection by one row, wrapping at both ends.
39
+ *
40
+ * Wrapping rather than stopping: this is a short list a dispatcher arrows
41
+ * through repeatedly, and a selection that sticks at the last row makes the
42
+ * keyboard path feel broken next to the mouse one.
43
+ */
44
+ export declare function nextSelection(units: readonly FleetUnit[], currentId: string | null | undefined, step: 1 | -1): string | null;
45
+ //# sourceMappingURL=FleetMap.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.helpers.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,iBAAiB,EAAE,MAAM,GACxB,cAAc,CAIhB;AAED,8DAA8D;AAC9D,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAIpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GACX,MAAM,GAAG,IAAI,CAQf"}
@@ -0,0 +1,71 @@
1
+ import { type LatLng } from './FleetMap.helpers';
2
+ import type { FleetUnit } from './FleetMap.base';
3
+ /**
4
+ * The half of a key event this hook reads, spelled structurally.
5
+ *
6
+ * NOT `React.KeyboardEvent<HTMLDivElement>`: the native type program is checked
7
+ * without the DOM lib (`tsconfig.native.json`), so a DOM type here would put
8
+ * the whole hook out of reach of the React Native renderer that shares it. A
9
+ * DOM event satisfies this shape, and a handler taking the wider type is
10
+ * assignable wherever the narrower one is expected — so the web passes its own
11
+ * `onKeyDown` unchanged.
12
+ */
13
+ export interface FleetKeyEvent {
14
+ key: string;
15
+ altKey?: boolean;
16
+ ctrlKey?: boolean;
17
+ metaKey?: boolean;
18
+ shiftKey?: boolean;
19
+ preventDefault: () => void;
20
+ }
21
+ /**
22
+ * Everything the board derives from its props, in one hook.
23
+ *
24
+ * Split out of the component so the component is layout and nothing else.
25
+ *
26
+ * The memos are honest about what they buy, which is less than it looks. `units`
27
+ * arrives as a fresh array on every poll, so `ordered` and `markers` are
28
+ * recomputed on every poll whatever these do — a new array is a new identity.
29
+ * What they buy is stability across the renders a poll does NOT cause: a parent
30
+ * re-render, a selection change (which re-runs `centre` but not `ordered`), a
31
+ * theme flip. Sorting a fleet is cheap either way; this is tidiness, not a
32
+ * measured win, and it should not be read as one.
33
+ *
34
+ * `centre` is the exception, and there it is load-bearing rather than tidy —
35
+ * see {@link useFleetMap}.
36
+ *
37
+ * ## Selection works with, without, or half-way through a handler
38
+ *
39
+ * `selectedId` and `onSelect` are both optional, so all four combinations
40
+ * arrive. Left purely controlled, the two useful ones broke: with neither prop
41
+ * the roster was a listbox that answered nothing, and arrowing it called
42
+ * `preventDefault` before a no-op `select`, so the keys did not move a
43
+ * selection AND did not scroll the page either.
44
+ *
45
+ * So the hook keeps its own selection and defers to `selectedId` only when the
46
+ * caller passes one — the ordinary controlled/uncontrolled split, the same one
47
+ * an `<input>` makes. `onSelect` still fires either way, so a consumer can
48
+ * observe the selection without owning it.
49
+ */
50
+ /** One pin, in the shape `MapPreview` takes. */
51
+ export interface FleetMarker {
52
+ position: LatLng;
53
+ title: string;
54
+ onClick: () => void;
55
+ }
56
+ export interface FleetMapState {
57
+ /** The units, freshest first — see {@link rosterOrder}. */
58
+ ordered: FleetUnit[];
59
+ /**
60
+ * The selection in force — the caller's when they own it, this hook's when
61
+ * they do not. Everything downstream reads THIS and never the raw prop.
62
+ */
63
+ active: string | null;
64
+ /** Where the map points, or `null` when there is nothing to show. */
65
+ centre: LatLng | null;
66
+ select: (id: string) => void;
67
+ markers: FleetMarker[];
68
+ onKeyDown: (event: FleetKeyEvent) => void;
69
+ }
70
+ export declare function useFleetMap(units: readonly FleetUnit[], selectedId: string | null | undefined, onSelect: ((id: string) => void) | undefined): FleetMapState;
71
+ //# sourceMappingURL=FleetMap.hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.hooks.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAiDD,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC3C,aAAa,CAuDf"}