@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,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,30 @@
1
+ import * as React from 'react';
2
+ import type { FleetMapProps } from './FleetMap.types.native';
3
+ /**
4
+ * FleetMap on React Native — where a set of tracked units is right now.
5
+ *
6
+ * Product-free by construction: it draws a labelled row with a freshness, and
7
+ * every word — the heading, the three freshness states, how a duration and a
8
+ * distance are written — arrives through `copy`. Couriers, service vans and
9
+ * field engineers are all the same list.
10
+ *
11
+ * ## What this renderer does NOT draw, and why
12
+ *
13
+ * There is no map. `MapPreview` — 2,200 lines that project, tile and decorate
14
+ * their own surface — has no React Native build, and porting it is its own
15
+ * change with its own consumers. What that costs is smaller than it sounds,
16
+ * because the web half already calls this list "the accessible representation,
17
+ * not a sidebar": every fact a pin carries — who, how recently, how precisely,
18
+ * what they are carrying — is on a row, in an order the map cannot express. So
19
+ * a native board is the half a screen reader was always given, and a device
20
+ * gets the same answers a dispatcher asks for. The gap is stated in
21
+ * `NATIVE-NOTES.md` rather than claimed away, and it is where the map goes when
22
+ * `MapPreview` is ported.
23
+ *
24
+ * The consequence for the API is one line in `FleetMap.types.native.ts`: the
25
+ * native copy interface has no `map` and no `mapLabel`, because a caller should
26
+ * not be asked to name controls nothing renders.
27
+ */
28
+ export declare const FleetMap: React.FC<FleetMapProps>;
29
+ export default FleetMap;
30
+ //# sourceMappingURL=FleetMap.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAsD7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA+E5C,CAAC;AAeF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { StyleProp, ViewStyle } from 'react-native';
2
+ import type { FleetMapBaseProps, FleetMapCopyBase } from './FleetMap.base';
3
+ /**
4
+ * The REACT NATIVE half of `FleetMap`'s contract.
5
+ *
6
+ * Everything platform-neutral is re-exported from `FleetMap.base.ts` unchanged.
7
+ * What differs is at both ends of the file: there is no `map` copy and no
8
+ * `mapLabel`, because there is no map — `MapPreview` has no native build, and
9
+ * the roster is this component's own stated "accessible representation, not a
10
+ * sidebar", which is exactly the half that ports. And `style` stands where the
11
+ * web takes `className`, which is the ordinary `sx`/`style` split.
12
+ */
13
+ export type { FleetFreshness, FleetMapBaseProps, FleetMapCopyBase, FleetUnit, } from './FleetMap.base';
14
+ /**
15
+ * Every word the native board prints.
16
+ *
17
+ * An alias rather than an empty `extends`, so that the day `MapPreview` is
18
+ * ported this becomes an interface with the map's words in it and no consumer
19
+ * import has to move.
20
+ */
21
+ export type FleetMapCopy = FleetMapCopyBase;
22
+ /** Props for the native {@link FleetMap} board. */
23
+ export interface FleetMapProps extends FleetMapBaseProps {
24
+ copy: FleetMapCopy;
25
+ /**
26
+ * A ceiling for the roster, so a fleet of thirty scrolls inside the panel
27
+ * rather than pushing everything below it off the screen.
28
+ *
29
+ * A NUMBER of pixels, where the web takes any CSS length: React Native has no
30
+ * `calc`, no viewport units and no `%` that resolves against a parent which
31
+ * has not sized itself.
32
+ */
33
+ maxHeight?: number;
34
+ style?: StyleProp<ViewStyle>;
35
+ }
36
+ //# sourceMappingURL=FleetMap.types.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetMap.types.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.types.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE3E;;;;;;;;;GASG;AACH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C,mDAAmD;AACnD,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,IAAI,EAAE,YAAY,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ import type { FleetKeyEvent } from './FleetMap.hooks';
3
+ import type { FleetMapCopy, FleetUnit } from './FleetMap.types.native';
4
+ export interface FleetRosterProps {
5
+ units: readonly FleetUnit[];
6
+ copy: FleetMapCopy;
7
+ selectedId: string | null | undefined;
8
+ onSelect: (id: string) => void;
9
+ laggingAfterSeconds: number;
10
+ staleAfterSeconds: number;
11
+ loading: boolean;
12
+ maxHeight: number | undefined;
13
+ testId: string;
14
+ onKeyDown: (event: FleetKeyEvent) => void;
15
+ }
16
+ export declare function FleetRoster({ units, copy, selectedId, onSelect, laggingAfterSeconds, staleAfterSeconds, loading, maxHeight, testId, onKeyDown, }: FleetRosterProps): React.JSX.Element;
17
+ //# sourceMappingURL=FleetRoster.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FleetRoster.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetRoster.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAkB,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAsQvF,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,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiEtC"}
@@ -0,0 +1,4 @@
1
+ export { FleetMap, default } from './FleetMap.native';
2
+ export { FleetRoster } from './FleetRoster.native';
3
+ export type { FleetFreshness, FleetMapBaseProps, FleetMapCopy, FleetMapCopyBase, FleetMapProps, FleetUnit, } from './FleetMap.types.native';
4
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,SAAS,GACV,MAAM,yBAAyB,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"}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-ZKR5B6YJ.js";
4
+ } from "./chunk-ZRPGVHTR.js";
5
5
  import "./chunk-UDQSIRAP.js";
6
- import "./chunk-7BYFC2MR.js";
7
- import "./chunk-3ZVUNSFF.js";
8
- import "./chunk-4SQFO4GW.js";
9
- import "./chunk-FAITHWIO.js";
6
+ import "./chunk-JUHUKZGU.js";
7
+ import "./chunk-NA7MIEG6.js";
10
8
  import "./chunk-XRMZMBE3.js";
9
+ import "./chunk-FAITHWIO.js";
10
+ import "./chunk-3ZVUNSFF.js";
11
11
  import "./chunk-VUHLNYAE.js";
12
12
  import "./chunk-2GSIEDGN.js";
13
13
  import "./chunk-AIRWM7KK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.22.0",
3
+ "version": "6.24.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -204,6 +204,14 @@
204
204
  "types": "./dist/types/components/data-display/EmptyState/index.d.ts",
205
205
  "default": "./dist/data-display/EmptyState.js"
206
206
  },
207
+ "./data-display/FleetMap": {
208
+ "react-native": {
209
+ "types": "./dist/types-native/components/data-display/FleetMap/index.native.d.ts",
210
+ "default": "./dist/native/data-display/FleetMap.js"
211
+ },
212
+ "types": "./dist/types/components/data-display/FleetMap/index.d.ts",
213
+ "default": "./dist/data-display/FleetMap.js"
214
+ },
207
215
  "./data-display/SectionOnboarding": {
208
216
  "types": "./dist/types/components/data-display/SectionOnboarding/index.d.ts",
209
217
  "default": "./dist/data-display/SectionOnboarding.js"
@@ -0,0 +1,96 @@
1
+ import Box from '@mui/material/Box/index.js';
2
+ import Stack from '@mui/material/Stack/index.js';
3
+ import React from 'react';
4
+
5
+ import { FleetCanvas } from './FleetCanvas';
6
+ import type { FleetMapState } from './FleetMap.hooks';
7
+ import type { FleetMapCopy } from './FleetMap.types';
8
+ import { FleetRoster } from './FleetRoster';
9
+
10
+ export interface FleetBodyProps
11
+ extends Pick<FleetMapState, 'ordered' | 'centre' | 'markers' | 'select' | 'onKeyDown'> {
12
+ copy: FleetMapCopy;
13
+ selectedId: string | null | undefined;
14
+ laggingAfterSeconds: number;
15
+ staleAfterSeconds: number;
16
+ height: string;
17
+ loading: boolean;
18
+ testId: string;
19
+ }
20
+
21
+ /**
22
+ * The two halves side by side: the roster that reads the fleet, and the map.
23
+ *
24
+ * A component rather than JSX inside {@link import('./FleetMap').FleetMap}
25
+ * because the layout is where every responsive decision lives, and keeping it
26
+ * here is what leaves the exported component short enough to read in one
27
+ * screen — which the complexity ledger enforces rather than merely suggests.
28
+ */
29
+ export function FleetBody({
30
+ ordered,
31
+ centre,
32
+ markers,
33
+ select,
34
+ onKeyDown,
35
+ copy,
36
+ selectedId,
37
+ laggingAfterSeconds,
38
+ staleAfterSeconds,
39
+ height,
40
+ loading,
41
+ testId,
42
+ }: FleetBodyProps): React.JSX.Element {
43
+ return (
44
+ <Stack
45
+ direction={{ xs: 'column', md: 'row' }}
46
+ spacing={2}
47
+ // `aria-busy` belongs on the halves that are actually reloading, NOT on
48
+ // the panel root — the live region announcing the reload is a sibling up
49
+ // there, and a live region inside a busy subtree is exactly what
50
+ // `aria-busy` tells assistive tech to hold back. Marking the root busy
51
+ // would have silenced the announcement for the whole of the only window
52
+ // in which it has anything to say. `CepField` splits them the same way.
53
+ aria-busy={loading || undefined}
54
+ data-testid={`${testId}-body`}
55
+ sx={{ alignItems: 'stretch', minWidth: 0 }}
56
+ >
57
+ {/* The roster reads first on a phone and sits beside the map from md up.
58
+ It keeps a ceiling so thirty units scroll rather than push the map off
59
+ the screen.
60
+
61
+ It also WIDENS with the viewport rather than staying at its md width.
62
+ Held at 280px, a desktop gave the map 1600px for three pins while the
63
+ roster stayed too narrow for its own meta line — `Lagging · 2 min ago ·
64
+ ±180 m` wrapped, at 1920px of all widths. The rungs below are the ones
65
+ the six-width pass was taken at. */}
66
+ <Box
67
+ sx={{
68
+ flexBasis: { md: '280px', lg: '320px', xl: '380px' },
69
+ flexShrink: 0,
70
+ minWidth: 0,
71
+ maxHeight: height,
72
+ display: 'flex',
73
+ }}
74
+ >
75
+ <FleetRoster
76
+ units={ordered}
77
+ copy={copy}
78
+ selectedId={selectedId}
79
+ onSelect={select}
80
+ laggingAfterSeconds={laggingAfterSeconds}
81
+ staleAfterSeconds={staleAfterSeconds}
82
+ loading={loading}
83
+ testId={testId}
84
+ onKeyDown={onKeyDown}
85
+ />
86
+ </Box>
87
+ <FleetCanvas
88
+ copy={copy}
89
+ centre={centre}
90
+ markers={markers}
91
+ height={height}
92
+ testId={testId}
93
+ />
94
+ </Stack>
95
+ );
96
+ }
@@ -0,0 +1,80 @@
1
+ import Box from '@mui/material/Box/index.js';
2
+ import React from 'react';
3
+
4
+ import { MapPreview } from '../MapPreview/MapPreview';
5
+
6
+ import type { FleetMarker } from './FleetMap.hooks';
7
+ import type { LatLng } from './FleetMap.helpers';
8
+ import type { FleetMapCopy } from './FleetMap.types';
9
+
10
+ export interface FleetCanvasProps {
11
+ copy: FleetMapCopy;
12
+ /** Where to point. `null` renders NOTHING — see the component's note. */
13
+ centre: LatLng | null;
14
+ markers: FleetMarker[];
15
+ height: string;
16
+ testId: string;
17
+ }
18
+
19
+ /**
20
+ * The map half — a NAMED LANDMARK, not an `aria-hidden` one.
21
+ *
22
+ * Its controls are focusable, and `aria-hidden` over a focusable subtree is the
23
+ * `aria-hidden-focus` violation: a keyboard user tabs into something a screen
24
+ * reader insists is not there. `role="region"` with a name is what puts it in a
25
+ * screen reader's landmark rotor, so it can be jumped PAST in one gesture;
26
+ * `role="group"` is not a landmark and would not.
27
+ *
28
+ * ## Skipping it does not silence it, and that is not ours to fix here
29
+ *
30
+ * `MapPreview` puts `aria-live="polite"` on its own root, with an English
31
+ * `aria-label` naming the centre coordinates and zoom. So re-centring the map —
32
+ * which every selection change does — announces something like "Map preview
33
+ * centered at -23.5505, -46.6333 with zoom level 15", in English, however
34
+ * thoroughly a reader has skipped the landmark. Two things follow, and neither
35
+ * is solved by anything this file can do:
36
+ *
37
+ * * a live region announces from wherever the reader is, so the landmark's
38
+ * skippability does not suppress it;
39
+ * * that string is the one piece of user-facing text in this component that
40
+ * does NOT come through `copy`.
41
+ *
42
+ * Fixing it means changing `MapPreview`, which every other consumer shares, so
43
+ * it is stated here rather than quietly claimed away.
44
+ *
45
+ * ## No centre, no map
46
+ *
47
+ * `mapCentre` answers `null` rather than a coordinate for an empty fleet, and
48
+ * that refusal has to survive the whole way down. `MapPreview` has no default
49
+ * centre — it resolves `center || coordinates || { lat: 0, lng: 0 }` — so
50
+ * forwarding `undefined` sails the map to the Gulf of Guinea and prints
51
+ * `Lat: 0.000000` under a default pin. That is exactly the render the helper
52
+ * exists to prevent, and it is reachable: a board that is `loading` with
53
+ * nothing yet reported skips the empty state by design and lands here.
54
+ */
55
+ export function FleetCanvas({
56
+ copy,
57
+ centre,
58
+ markers,
59
+ height,
60
+ testId,
61
+ }: FleetCanvasProps): React.JSX.Element | null {
62
+ if (!centre) return null;
63
+ return (
64
+ <Box
65
+ role="region"
66
+ aria-label={copy.mapLabel}
67
+ data-testid={`${testId}-canvas`}
68
+ sx={{ flexGrow: 1, minWidth: 0 }}
69
+ >
70
+ <MapPreview
71
+ copy={copy.map}
72
+ center={centre}
73
+ markers={markers}
74
+ height={height}
75
+ interactive
76
+ showControls
77
+ />
78
+ </Box>
79
+ );
80
+ }
@@ -0,0 +1,144 @@
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
+ /**
16
+ * One tracked unit's newest position, as the caller resolved it.
17
+ *
18
+ * Deliberately says nothing about WHAT is being tracked. A courier, a service
19
+ * van, a field engineer — the component draws a labelled dot with a freshness,
20
+ * and every word that names the domain arrives through the copy object.
21
+ */
22
+ export interface FleetUnit {
23
+ id: string;
24
+ /** The name a human reads, on the pin and in the roster. */
25
+ label: string;
26
+ latitude: number;
27
+ longitude: number;
28
+ /**
29
+ * The fix's accuracy radius in metres, when the platform reported one.
30
+ *
31
+ * Kept because it is what separates a rooftop GPS fix from a cell-tower guess
32
+ * three blocks wide, and a map that draws both identically tells its reader
33
+ * something false.
34
+ */
35
+ accuracyM?: number | null;
36
+ /**
37
+ * Seconds since the fix was ACCEPTED, on the server's clock.
38
+ *
39
+ * The caller computes it, and the distinction matters: a device whose own
40
+ * clock is an hour slow would otherwise report itself as an hour stale while
41
+ * reporting perfectly.
42
+ */
43
+ staleSeconds: number;
44
+ /** A short pre-formatted badge beside the name, e.g. `"2 entregas"`. */
45
+ badge?: string;
46
+ }
47
+
48
+ /** How current a unit's newest fix is, derived from the thresholds below. */
49
+ export type FleetFreshness = 'live' | 'lagging' | 'stale';
50
+
51
+ /**
52
+ * Every word the board prints, and the two it FORMATS — minus the map's own.
53
+ *
54
+ * `lastSeen` and `accuracy` are functions rather than strings because a
55
+ * duration and a distance are locale rules, and this package holds the same
56
+ * line `StatCard` does: presentation only, the caller owns the formatting. A
57
+ * `lastSeenMinutes: string` template would have made "há 2 min" the only
58
+ * shape any consumer could ever render.
59
+ */
60
+ export interface FleetMapCopyBase {
61
+ /** The panel's heading. */
62
+ title: string;
63
+ /** What the roster says when nobody is reporting. */
64
+ emptyTitle: string;
65
+ emptyDescription?: string;
66
+ /** The roster list's accessible name — it is the map's readable half. */
67
+ rosterLabel: string;
68
+ /**
69
+ * What a screen reader hears while the roster reloads, e.g. "Atualizando a
70
+ * frota". OPTIONAL, and silence is the honest default: the busy state marks
71
+ * the region stale without uttering anything, the skeletons are hidden from
72
+ * the reader, and this component cannot invent the sentence in the reader's
73
+ * language. Set it and the panel announces politely; leave it and it stays
74
+ * quiet.
75
+ *
76
+ * Announced on a TRANSITION into loading. A board mounted already loading is
77
+ * silent — as any live region is at mount, since there is no change for a
78
+ * reader to observe.
79
+ */
80
+ loading?: string;
81
+ /** The three freshness words, as a reader sees them on a row. */
82
+ freshness: Record<FleetFreshness, string>;
83
+ /** `(seconds) => "há 2 min"`. */
84
+ lastSeen: (staleSeconds: number) => string;
85
+ /** `(metres) => "±12 m"`. A unit with no accuracy renders none. */
86
+ accuracy: (metres: number) => string;
87
+ }
88
+
89
+ /**
90
+ * The props both renderers take.
91
+ *
92
+ * `height` and `className` are NOT here: the first is a CSS length the web
93
+ * gives the map, and the second is a DOM class. Each side declares its own
94
+ * layout escape hatch beside its own extras.
95
+ */
96
+ export interface FleetMapBaseProps {
97
+ /** Everyone currently reporting. An empty array renders the empty state. */
98
+ units: readonly FleetUnit[];
99
+ /**
100
+ * Which unit is highlighted: the roster marks it selected, and on the web the
101
+ * map centres on it. `null` selects nobody.
102
+ *
103
+ * PASSING IT AT ALL IS THE DECISION. Present on the first render — `null`
104
+ * included — and the board is controlled for life: it renders what you pass
105
+ * and never moves the selection itself. Absent on the first render and it
106
+ * keeps its own, reporting each change through {@link onSelect}. The mode is
107
+ * latched on that first render, the way React latches an `<input>`, so the
108
+ * component cannot change its own semantics halfway through a session.
109
+ *
110
+ * A controlled board reads `undefined` as "nobody is selected", so
111
+ * `useState<string>()` in the caller behaves: clearing it clears the roster.
112
+ */
113
+ selectedId?: string | null;
114
+ /**
115
+ * A click or press on a row, and each arrow-key move on the web.
116
+ *
117
+ * Passing {@link selectedId} WITHOUT this is a selection nothing can move:
118
+ * the arrow keys then decline to act and leave the page to scroll, rather
119
+ * than swallowing a keypress that would do nothing.
120
+ */
121
+ onSelect?: (id: string) => void;
122
+ /**
123
+ * Seconds after which a unit stops reading as `live`, and then as `lagging`.
124
+ *
125
+ * Both carry a GENERIC default (90s and 300s, sized for a phone reporting
126
+ * every twenty seconds) and no domain one, because the answer is entirely a
127
+ * property of the fleet's own ping cadence: a phone reporting every twenty
128
+ * seconds is late at ninety, and a tracker reporting every five minutes is
129
+ * not. A component that picked one would be picking it for every consumer.
130
+ */
131
+ laggingAfterSeconds?: number;
132
+ staleAfterSeconds?: number;
133
+ /**
134
+ * While true the roster is marked busy, and renders skeletons IF no units
135
+ * have landed yet — a poll over a populated roster keeps the list, because
136
+ * unmounting it throws away the focus inside it.
137
+ *
138
+ * It only ANNOUNCES if the copy's `loading` sentence is set: busy is a state,
139
+ * not an utterance.
140
+ */
141
+ loading?: boolean;
142
+ /** Test id for the panel root; every child id is derived from it. */
143
+ dataTestId?: string;
144
+ }
@@ -0,0 +1,70 @@
1
+ import { EN_US_MAP_PREVIEW_COPY } from '../../../en-US.data-display';
2
+
3
+ import type { FleetMapCopy, FleetUnit } from './FleetMap.types';
4
+
5
+ /**
6
+ * The copy and the fleet every story and test story shares.
7
+ *
8
+ * A module rather than a per-story literal, so a change to the shape breaks in
9
+ * ONE place rather than in fourteen — and so the test stories assert against
10
+ * the same words the visual ones render.
11
+ */
12
+
13
+ /** English, because stories are developer-facing. A consumer passes its own. */
14
+ export const FLEET_COPY: FleetMapCopy = {
15
+ title: 'Couriers on the road',
16
+ emptyTitle: 'Nobody is reporting',
17
+ emptyDescription: 'A courier appears here once their phone sends its first position.',
18
+ rosterLabel: 'Couriers, freshest first',
19
+ mapLabel: 'Map of where the couriers are',
20
+ freshness: { live: 'Live', lagging: 'Lagging', stale: 'Stale' },
21
+ lastSeen: (seconds) =>
22
+ seconds < 60 ? `${seconds}s ago` : `${Math.floor(seconds / 60)} min ago`,
23
+ // A NON-BREAKING space between the number and its unit. The meta line is
24
+ // the narrowest text in the component and it wraps at spaces, so a plain
25
+ // space orphans the `m` onto a line of its own — measured at 900px and
26
+ // 1920px, where the roster column is at its tightest relative to the map.
27
+ // Consumers writing their own `accuracy` want the same character.
28
+ accuracy: (metres) => `±${Math.round(metres)}\u00A0m`,
29
+ map: EN_US_MAP_PREVIEW_COPY,
30
+ };
31
+
32
+ /**
33
+ * Three riders around São Paulo, one in each freshness state.
34
+ *
35
+ * Deliberately NOT in staleness order, and the labels deliberately do not agree
36
+ * with it either. `rosterOrder` sorts on staleness and breaks ties on the
37
+ * label, so a fixture whose two orders coincide lets the roster's ordering
38
+ * assertion pass against a LABEL-only sort as readily as the real one — a test
39
+ * reporting coverage it does not have. Here the three orders are all different:
40
+ * declared is [ale, ana, bruno], alphabetical is the same, and the correct
41
+ * answer is [ana, bruno, ale].
42
+ */
43
+ export const FLEET: FleetUnit[] = [
44
+ {
45
+ id: 'ale',
46
+ label: 'Alessandra Nunes',
47
+ latitude: -23.5405,
48
+ longitude: -46.6133,
49
+ accuracyM: null,
50
+ staleSeconds: 640,
51
+ },
52
+ {
53
+ id: 'ana',
54
+ label: 'Ana Ribeiro',
55
+ latitude: -23.5505,
56
+ longitude: -46.6333,
57
+ accuracyM: 12,
58
+ staleSeconds: 8,
59
+ badge: '2 deliveries',
60
+ },
61
+ {
62
+ id: 'bruno',
63
+ label: 'Bruno Alves',
64
+ latitude: -23.5605,
65
+ longitude: -46.6533,
66
+ accuracyM: 180,
67
+ staleSeconds: 140,
68
+ badge: '1 delivery',
69
+ },
70
+ ];