@12-apps/ui 6.21.0 → 6.23.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 (688) hide show
  1. package/NATIVE.md +6 -4
  2. package/components-catalog.md +7 -0
  3. package/dist/_internal/components/data-display/Alert/Alert.js +4 -4
  4. package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
  5. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +8 -8
  6. package/dist/_internal/components/data-display/Badge/Badge.js +3 -3
  7. package/dist/_internal/components/data-display/CardKit/CardKebab.js +4 -4
  8. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +5 -5
  9. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +9 -9
  10. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +4 -4
  11. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  12. package/dist/_internal/components/data-display/Chart/SpecChart.js +5 -5
  13. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  14. package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
  15. package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
  16. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  17. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +3 -3
  18. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +50 -50
  19. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +68 -65
  20. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +10 -7
  21. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +11 -8
  22. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +14 -11
  23. package/dist/_internal/components/data-display/DataViews/base-card.js +9 -7
  24. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +7 -7
  25. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  26. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +6 -6
  27. package/dist/_internal/components/data-display/DataViews/base-list-card.js +15 -13
  28. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +12 -12
  29. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +3 -3
  30. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +5 -5
  31. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +8 -8
  32. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
  33. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -5
  34. package/dist/_internal/components/data-display/DataViews/data-views-export.js +5 -5
  35. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +15 -15
  36. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -12
  37. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +4 -4
  38. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +46 -46
  39. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +3 -3
  40. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +21 -21
  41. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +6 -6
  42. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +9 -9
  43. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
  44. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  45. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +5 -5
  46. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +13 -13
  47. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +21 -18
  48. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +12 -12
  49. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
  50. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  51. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +3 -3
  52. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
  53. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +3 -3
  54. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
  55. package/dist/_internal/components/data-display/ErrorState/ErrorState.js +2 -2
  56. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +31 -0
  57. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +23 -0
  58. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js.map +1 -0
  59. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +57 -0
  60. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js.map +1 -0
  61. package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js +14 -0
  62. package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js.map +1 -0
  63. package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js +9 -0
  64. package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js.map +1 -0
  65. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +46 -0
  66. package/dist/_internal/components/data-display/FleetMap/FleetMap.js.map +1 -0
  67. package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js +1 -0
  68. package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js.map +1 -0
  69. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +14 -0
  70. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js.map +1 -0
  71. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +4 -4
  72. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +1 -1
  73. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +4 -4
  74. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  75. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  76. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
  77. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  78. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  79. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  80. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  81. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
  82. package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
  83. package/dist/_internal/components/data-display/StatCard/StatCard.js +4 -4
  84. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  85. package/dist/_internal/components/data-display/index.js +88 -68
  86. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +4 -4
  87. package/dist/_internal/components/feedback/Dialog/Dialog.base.js +1 -0
  88. package/dist/_internal/components/feedback/Dialog/Dialog.base.js.map +1 -0
  89. package/dist/_internal/components/feedback/Dialog/Dialog.helpers.js +12 -0
  90. package/dist/_internal/components/feedback/Dialog/Dialog.helpers.js.map +1 -0
  91. package/dist/_internal/components/feedback/Dialog/Dialog.js +6 -2
  92. package/dist/_internal/components/feedback/Dialog/Dialog.metrics.js +42 -0
  93. package/dist/_internal/components/feedback/Dialog/Dialog.metrics.js.map +1 -0
  94. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +3 -1
  95. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
  96. package/dist/_internal/components/feedback/index.js +16 -13
  97. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
  98. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +7 -7
  99. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +3 -3
  100. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
  101. package/dist/_internal/components/form/Button/Button.js +3 -3
  102. package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
  103. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  104. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  105. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +5 -5
  106. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +3 -3
  107. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +2 -2
  108. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +10 -10
  109. package/dist/_internal/components/form/CepField/CepField.js +4 -4
  110. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  111. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
  112. package/dist/_internal/components/form/Command/Command.js +2 -2
  113. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +6 -6
  114. package/dist/_internal/components/form/Input/Input.js +3 -3
  115. package/dist/_internal/components/form/Label/Label.js +2 -2
  116. package/dist/_internal/components/form/Menubar/Menubar.js +5 -5
  117. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -2
  118. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  119. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
  120. package/dist/_internal/components/form/Select/Select.js +2 -2
  121. package/dist/_internal/components/form/Switch/Switch.js +2 -2
  122. package/dist/_internal/components/form/index.js +55 -55
  123. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +11 -11
  124. package/dist/_internal/components/form/total-form/Fields/CepField.js +5 -5
  125. package/dist/_internal/components/form/total-form/Fields/SelectField.js +3 -3
  126. package/dist/_internal/components/form/total-form/Fields/TextField.js +4 -4
  127. package/dist/_internal/components/form/total-form/Fields/index.js +25 -25
  128. package/dist/_internal/components/form/total-form/SubmitButton.js +4 -4
  129. package/dist/_internal/components/index.js +198 -175
  130. package/dist/_internal/components/layout/Box/Box.js +2 -2
  131. package/dist/_internal/components/layout/Card/Card.base.js +1 -0
  132. package/dist/_internal/components/layout/Card/Card.base.js.map +1 -0
  133. package/dist/_internal/components/layout/Card/Card.helpers.js +1 -1
  134. package/dist/_internal/components/layout/Card/Card.js +6 -3
  135. package/dist/_internal/components/layout/Card/Card.metrics.js +44 -0
  136. package/dist/_internal/components/layout/Card/Card.metrics.js.map +1 -0
  137. package/dist/_internal/components/layout/Card/Card.styles.js +3 -1
  138. package/dist/_internal/components/layout/Container/Container.js +2 -2
  139. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
  140. package/dist/_internal/components/layout/Skeleton/Skeleton.js +3 -3
  141. package/dist/_internal/components/layout/Spacer/Spacer.js +2 -2
  142. package/dist/_internal/components/layout/Stack/Stack.js +3 -3
  143. package/dist/_internal/components/layout/index.js +30 -28
  144. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +12 -9
  145. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  146. package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
  147. package/dist/_internal/components/navigation/index.js +22 -19
  148. package/dist/_internal/components/typography/Heading/Heading.js +2 -2
  149. package/dist/_internal/components/typography/Paragraph/Paragraph.js +2 -2
  150. package/dist/_internal/components/typography/Text/Text.js +2 -2
  151. package/dist/_internal/components/typography/index.js +4 -4
  152. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
  153. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
  154. package/dist/_internal/components/utility/index.js +8 -8
  155. package/dist/_internal/icons/Icon.js +2 -2
  156. package/dist/_internal/platform/test-id.js +3 -1
  157. package/dist/_internal/pt-BR.data-display.js +2 -2
  158. package/dist/_internal/social-login-button/social-login-button.js +11 -9
  159. package/dist/_internal/tokens/mui-type.js +1 -0
  160. package/dist/_internal/tokens/mui-type.js.map +1 -1
  161. package/dist/_internal/tokens/shadow.js +18 -0
  162. package/dist/_internal/tokens/shadow.js.map +1 -0
  163. package/dist/_internal/user-avatar/user-avatar.js +10 -8
  164. package/dist/charts.js +6 -6
  165. package/dist/{chunk-NUE774AN.js → chunk-25R3ITGZ.js} +2 -2
  166. package/dist/{chunk-Z6UEOSL7.js → chunk-2FDBR77W.js} +3 -3
  167. package/dist/{chunk-IFNK5TPI.js → chunk-2HPP6RVC.js} +2 -2
  168. package/dist/chunk-2RQINU5T.js +41 -0
  169. package/dist/chunk-2RQINU5T.js.map +1 -0
  170. package/dist/{chunk-GCXYCDOA.js → chunk-2UGJIKVA.js} +2 -2
  171. package/dist/{chunk-26Z7QWID.js → chunk-343TTIHD.js} +2 -2
  172. package/dist/{chunk-BRSF5NRT.js → chunk-3FLVIVOK.js} +4 -4
  173. package/dist/{chunk-BDVNAU2C.js → chunk-4523RYE7.js} +5 -5
  174. package/dist/{chunk-4ETQRBZC.js → chunk-46UPILLK.js} +4 -4
  175. package/dist/{chunk-WMALDOF5.js → chunk-4G3FGCWX.js} +4 -4
  176. package/dist/{chunk-I3MDKPGG.js → chunk-4IVOHL32.js} +2 -2
  177. package/dist/{chunk-SAHQLXNN.js → chunk-4LRFGB3K.js} +4 -4
  178. package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
  179. package/dist/{chunk-TLX66HCW.js → chunk-4OHRZW7U.js} +5 -5
  180. package/dist/{chunk-2QFTAGDH.js → chunk-4X4KM4ZB.js} +4 -4
  181. package/dist/{chunk-7ZH7ZB33.js → chunk-4XZXLB4I.js} +4 -4
  182. package/dist/{chunk-6PRA45LC.js → chunk-5KEMPCW4.js} +54 -45
  183. package/dist/chunk-5KEMPCW4.js.map +1 -0
  184. package/dist/{chunk-77F36LQQ.js → chunk-5OIH36KX.js} +3 -3
  185. package/dist/chunk-5V4UPOWK.js +36 -0
  186. package/dist/chunk-5V4UPOWK.js.map +1 -0
  187. package/dist/{chunk-GDEXYUPF.js → chunk-67L7HMEP.js} +2 -2
  188. package/dist/{chunk-ZFPJBKVZ.js → chunk-6JGPPTLX.js} +5 -5
  189. package/dist/chunk-6Q6T3FW5.js +92 -0
  190. package/dist/chunk-6Q6T3FW5.js.map +1 -0
  191. package/dist/chunk-73BEVJCS.js +28 -0
  192. package/dist/chunk-73BEVJCS.js.map +1 -0
  193. package/dist/{chunk-VIK3HAUQ.js → chunk-73NJCGQG.js} +2 -2
  194. package/dist/{chunk-D4T646G4.js → chunk-7NSX7A5H.js} +2 -2
  195. package/dist/{chunk-QS7ZGRNS.js → chunk-7VN7LFBA.js} +6 -6
  196. package/dist/{chunk-3UOHKHOT.js → chunk-ACFGEZ4Q.js} +3 -3
  197. package/dist/{chunk-GBNOYRLP.js → chunk-AEGXHZQT.js} +8 -8
  198. package/dist/{chunk-D2IASECY.js → chunk-AIRWM7KK.js} +39 -28
  199. package/dist/chunk-AIRWM7KK.js.map +1 -0
  200. package/dist/{chunk-BEH4DN63.js → chunk-AJGYHDA5.js} +6 -6
  201. package/dist/{chunk-65DLYC4S.js → chunk-AVGTTWTE.js} +4 -4
  202. package/dist/{chunk-PXH24VIP.js → chunk-B6IURHSZ.js} +4 -4
  203. package/dist/chunk-BEBLRL5D.js +177 -0
  204. package/dist/chunk-BEBLRL5D.js.map +1 -0
  205. package/dist/{chunk-XEE7PLDR.js → chunk-BZTFPSWT.js} +4 -4
  206. package/dist/{chunk-B3BK2SNS.js → chunk-C3CMEDSO.js} +2 -2
  207. package/dist/{chunk-OH3YGJT5.js → chunk-CBTY36TU.js} +2 -2
  208. package/dist/chunk-CDCTLPMD.js +1 -0
  209. package/dist/chunk-CDCTLPMD.js.map +1 -0
  210. package/dist/chunk-CF3FAAPC.js +79 -0
  211. package/dist/chunk-CF3FAAPC.js.map +1 -0
  212. package/dist/{chunk-JIINGMEB.js → chunk-CHPZTF34.js} +7 -7
  213. package/dist/{chunk-PWXL3QQ6.js → chunk-CJBBGMIA.js} +2 -2
  214. package/dist/{chunk-BPYPUEM5.js → chunk-CZJLWCEG.js} +2 -2
  215. package/dist/{chunk-FPWB5ILF.js → chunk-DRHIIUDO.js} +5 -5
  216. package/dist/{chunk-BEGWE5O4.js → chunk-DTC224UJ.js} +4 -4
  217. package/dist/{chunk-UB76PBDF.js → chunk-DVFIE54C.js} +2 -2
  218. package/dist/{chunk-GO4MVQGC.js → chunk-DW5FRWRQ.js} +2 -2
  219. package/dist/{chunk-6Z4H2Y77.js → chunk-E27Y7FF2.js} +4 -4
  220. package/dist/{chunk-PANMJFDS.js → chunk-E55CJV65.js} +2 -2
  221. package/dist/{chunk-JXAYT6LX.js → chunk-EJQW2IYW.js} +2 -2
  222. package/dist/{chunk-TPIBJP4S.js → chunk-EOHKZGOZ.js} +2 -2
  223. package/dist/{chunk-MSUSZLRE.js → chunk-EWT3WMVY.js} +5 -5
  224. package/dist/chunk-F7VBGS4C.js +64 -0
  225. package/dist/chunk-F7VBGS4C.js.map +1 -0
  226. package/dist/{chunk-DH75UNF3.js → chunk-FGK2C7JR.js} +2 -2
  227. package/dist/{chunk-RI5JZLZL.js → chunk-FKUYRQSP.js} +1 -1
  228. package/dist/chunk-FKUYRQSP.js.map +1 -0
  229. package/dist/{chunk-AD776JPA.js → chunk-FR67FG2U.js} +2 -2
  230. package/dist/{chunk-SHQWIDD5.js → chunk-GJQYM3PM.js} +4 -4
  231. package/dist/{chunk-7KTU6YMQ.js → chunk-GMTM6EN7.js} +5 -5
  232. package/dist/{chunk-WROCSDVL.js → chunk-GSFNH4C5.js} +5 -5
  233. package/dist/{chunk-PF5HDFYY.js → chunk-GVA5CYKP.js} +4 -4
  234. package/dist/chunk-GYXUCS37.js +36 -0
  235. package/dist/chunk-GYXUCS37.js.map +1 -0
  236. package/dist/{chunk-Z5ABJLTM.js → chunk-HFXTAEYY.js} +2 -2
  237. package/dist/{chunk-FOMK3WPG.js → chunk-HLYPI5CO.js} +4 -4
  238. package/dist/{chunk-VR5HDUBK.js → chunk-HP2ODXNA.js} +2 -2
  239. package/dist/{chunk-GBRKP5GZ.js → chunk-I5SBTNV2.js} +2 -2
  240. package/dist/{chunk-TP4N3X2Q.js → chunk-IPVYEPXO.js} +5 -5
  241. package/dist/{chunk-RRO2EOJB.js → chunk-JB67KPGM.js} +4 -4
  242. package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
  243. package/dist/{chunk-4HYXEMBP.js → chunk-JIKWZDNK.js} +2 -2
  244. package/dist/{chunk-4MLDWACO.js → chunk-JM64OEU6.js} +12 -12
  245. package/dist/{chunk-2QLVUVVR.js → chunk-JSH3HFDQ.js} +2 -2
  246. package/dist/{chunk-TZ4SFX3M.js → chunk-JWW2Z3RH.js} +4 -4
  247. package/dist/{chunk-QFHH2NU5.js → chunk-JXNT5TUP.js} +3 -3
  248. package/dist/{chunk-FINCVAAR.js → chunk-KHWCX4LI.js} +4 -4
  249. package/dist/{chunk-THZ2NAA4.js → chunk-KW7H5O3K.js} +7 -7
  250. package/dist/{chunk-XLJJ2ZAP.js → chunk-L4U23SBX.js} +11 -11
  251. package/dist/{chunk-ZXLIWOXC.js → chunk-LS4FMSHY.js} +5 -5
  252. package/dist/{chunk-SFAP5EH5.js → chunk-LUMF63BM.js} +4 -4
  253. package/dist/{chunk-CZPU5TW3.js → chunk-LYSSO6WC.js} +4 -4
  254. package/dist/{chunk-736HP6BL.js → chunk-M4LQRQFL.js} +2 -2
  255. package/dist/{chunk-426FTCMF.js → chunk-MESRKY67.js} +2 -2
  256. package/dist/{chunk-B5PYBEXO.js → chunk-MP4VSWHK.js} +2 -2
  257. package/dist/chunk-MQNKRIGC.js +205 -0
  258. package/dist/chunk-MQNKRIGC.js.map +1 -0
  259. package/dist/{chunk-UOPQOBQZ.js → chunk-MYGNIFZC.js} +3 -3
  260. package/dist/{chunk-6RGWDKUL.js → chunk-N2TUX4A5.js} +4 -4
  261. package/dist/{chunk-VWGR5XUP.js → chunk-NWNSUHEB.js} +2 -2
  262. package/dist/{chunk-4K7FDVAB.js → chunk-O3336DJ6.js} +2 -2
  263. package/dist/{chunk-YCCKY5VW.js → chunk-OFOYMZRY.js} +4 -4
  264. package/dist/{chunk-OCXCH2ZW.js → chunk-OIKQO73C.js} +7 -7
  265. package/dist/{chunk-QZDBWXZG.js → chunk-OP65D4UR.js} +2 -2
  266. package/dist/{chunk-MCRIT46W.js → chunk-OTH7H3IP.js} +5 -5
  267. package/dist/{chunk-BQQONDW5.js → chunk-OVLNF4AZ.js} +6 -6
  268. package/dist/{chunk-AGYGNNOM.js → chunk-PQECNGDE.js} +2 -2
  269. package/dist/{chunk-IIROZKW5.js → chunk-PRUSQQDT.js} +2 -2
  270. package/dist/{chunk-IPE5FFFD.js → chunk-PUBPZOQJ.js} +2 -2
  271. package/dist/{chunk-FB36IHCE.js → chunk-QFVFHIHE.js} +8 -8
  272. package/dist/{chunk-V5P5Q6HM.js → chunk-QJRDDVZ2.js} +3 -3
  273. package/dist/{chunk-WBKWIFXA.js → chunk-QYNCPS5W.js} +6 -6
  274. package/dist/{chunk-VPHOSIPB.js → chunk-R6SNYC3D.js} +10 -10
  275. package/dist/{chunk-STH66VLA.js → chunk-R7R3LOKW.js} +2 -2
  276. package/dist/{chunk-W2UTDN4T.js → chunk-RBGOGTT2.js} +4 -4
  277. package/dist/chunk-RQWZYD6H.js +1 -0
  278. package/dist/chunk-RQWZYD6H.js.map +1 -0
  279. package/dist/{chunk-VWBWKLXX.js → chunk-SX3V2DLV.js} +4 -4
  280. package/dist/{chunk-P7FQUGED.js → chunk-TNVO2DTB.js} +5 -5
  281. package/dist/{chunk-WTIOCG4M.js → chunk-TOYEP23N.js} +2 -2
  282. package/dist/{chunk-G2IPK2XE.js → chunk-TPLKJHNN.js} +8 -8
  283. package/dist/{chunk-U2AC4AQX.js → chunk-TU5EIKJA.js} +4 -4
  284. package/dist/{chunk-ZGHIHEND.js → chunk-TW3BXVEU.js} +2 -2
  285. package/dist/chunk-TWQYDKCA.js +113 -0
  286. package/dist/chunk-TWQYDKCA.js.map +1 -0
  287. package/dist/{chunk-BGYLL467.js → chunk-TXHJX2NG.js} +4 -4
  288. package/dist/{chunk-6F5IKY32.js → chunk-TYJR4GOF.js} +6 -2
  289. package/dist/{chunk-6F5IKY32.js.map → chunk-TYJR4GOF.js.map} +1 -1
  290. package/dist/{chunk-5RQ7N63M.js → chunk-TZDDL3DR.js} +2 -2
  291. package/dist/{chunk-RPQ3W2C6.js → chunk-U2ZDN2AL.js} +2 -2
  292. package/dist/{chunk-WPZT2JD4.js → chunk-U7Q2Y6WG.js} +2 -2
  293. package/dist/{chunk-E46PG577.js → chunk-URXT5TOY.js} +4 -4
  294. package/dist/chunk-VM3HRSAU.js +79 -0
  295. package/dist/chunk-VM3HRSAU.js.map +1 -0
  296. package/dist/{chunk-P6IPJYCS.js → chunk-VNNG46TS.js} +6 -6
  297. package/dist/{chunk-CXVMD6FE.js → chunk-VON4BFK4.js} +3 -3
  298. package/dist/{chunk-2SWQ6HIK.js → chunk-W3FAKT3D.js} +4 -4
  299. package/dist/{chunk-JDMYD6QC.js → chunk-W4SDVTZC.js} +2 -2
  300. package/dist/{chunk-7MAOQIWA.js → chunk-W4YWU7LQ.js} +2 -2
  301. package/dist/{chunk-Y46RBFBV.js → chunk-W7Y6RA6W.js} +6 -6
  302. package/dist/{chunk-XFU2S6XT.js → chunk-WGRS4PGY.js} +10 -10
  303. package/dist/{chunk-OOGEYCJH.js → chunk-WIT3Y7JT.js} +2 -2
  304. package/dist/{chunk-KT6HWAEN.js → chunk-WQA4LIIK.js} +4 -4
  305. package/dist/{chunk-J2KSG754.js → chunk-WRDPWEIC.js} +5 -5
  306. package/dist/{chunk-RPWEXIAW.js → chunk-X5MPHXG5.js} +6 -6
  307. package/dist/{chunk-UEIVXFUC.js → chunk-XELVDPKL.js} +5 -5
  308. package/dist/{chunk-RRZBATXK.js → chunk-XKV5ZIBG.js} +3 -3
  309. package/dist/{chunk-ZKFYBC6G.js → chunk-XSF6AXEU.js} +2 -2
  310. package/dist/{chunk-R6RVBYTU.js → chunk-XUJG2HFW.js} +3 -3
  311. package/dist/{chunk-S5LE2ARG.js → chunk-YANLN6HP.js} +66 -56
  312. package/dist/chunk-YANLN6HP.js.map +1 -0
  313. package/dist/{chunk-FRQ4HNGF.js → chunk-YJ4HM25H.js} +2 -2
  314. package/dist/{chunk-TVO5STZB.js → chunk-YQ6TNHAC.js} +3 -3
  315. package/dist/{chunk-BNNSO4MC.js → chunk-YTOYMJPM.js} +5 -5
  316. package/dist/{chunk-IH4RSRQA.js → chunk-ZA4U5GDU.js} +6 -6
  317. package/dist/data-display/Alert.js +4 -4
  318. package/dist/data-display/AsyncStateContainer.js +8 -8
  319. package/dist/data-display/Badge.js +3 -3
  320. package/dist/data-display/CardKit.js +13 -13
  321. package/dist/data-display/Chart.js +6 -6
  322. package/dist/data-display/Chip.js +3 -3
  323. package/dist/data-display/DataGrid.js +2 -2
  324. package/dist/data-display/DataViews.js +84 -80
  325. package/dist/data-display/DescriptionItem.js +3 -3
  326. package/dist/data-display/EmptyState.js +2 -2
  327. package/dist/data-display/ErrorState.js +2 -2
  328. package/dist/data-display/FleetMap.js +54 -0
  329. package/dist/data-display/FleetMap.js.map +1 -0
  330. package/dist/data-display/LazyImage.js +4 -4
  331. package/dist/data-display/Lightbox.js +1 -1
  332. package/dist/data-display/LoadingState.js +4 -4
  333. package/dist/data-display/MapPreview.js +7 -7
  334. package/dist/data-display/Progress.js +2 -2
  335. package/dist/data-display/SectionOnboarding.js +3 -3
  336. package/dist/data-display/Sheet.js +3 -3
  337. package/dist/data-display/StatCard.js +4 -4
  338. package/dist/data-display/Table.js +2 -2
  339. package/dist/feedback/ConfirmAction.js +4 -4
  340. package/dist/feedback/Dialog.js +6 -2
  341. package/dist/feedback/TutorialOverlay.js +2 -2
  342. package/dist/form/AddressAutocomplete.js +7 -7
  343. package/dist/form/Autocomplete.js +2 -2
  344. package/dist/form/Button.js +3 -3
  345. package/dist/form/Calendar.js +4 -4
  346. package/dist/form/CategorySelect.js +10 -10
  347. package/dist/form/CepField.js +4 -4
  348. package/dist/form/Checkbox.js +2 -2
  349. package/dist/form/CodeEditor.js +2 -2
  350. package/dist/form/Command.js +2 -2
  351. package/dist/form/DateRangePicker.js +11 -11
  352. package/dist/form/Input.js +3 -3
  353. package/dist/form/Label.js +2 -2
  354. package/dist/form/Menubar.js +5 -5
  355. package/dist/form/PhoneInput.js +3 -3
  356. package/dist/form/Select.js +2 -2
  357. package/dist/form/Switch.js +2 -2
  358. package/dist/form/total-form.js +30 -30
  359. package/dist/icons.js +2 -2
  360. package/dist/layout/Box.js +2 -2
  361. package/dist/layout/Card.js +6 -3
  362. package/dist/layout/Container.js +2 -2
  363. package/dist/layout/ContentToolbar.js +3 -3
  364. package/dist/layout/SettingsLayout.js +2 -2
  365. package/dist/layout/Skeleton.js +3 -3
  366. package/dist/layout/Spacer.js +2 -2
  367. package/dist/layout/Stack.js +3 -3
  368. package/dist/locales.js +4 -4
  369. package/dist/native/chunks/{chunk-HSIND52T.js → chunk-2UFNPDYT.js} +2 -1
  370. package/dist/native/chunks/chunk-2UFNPDYT.js.map +1 -0
  371. package/dist/native/chunks/{chunk-OGWPPQL4.js → chunk-75JQYVDZ.js} +3 -3
  372. package/dist/native/chunks/{chunk-WKMDCNIN.js → chunk-7LTVGW23.js} +2 -2
  373. package/dist/native/chunks/{chunk-QZAUOHDQ.js → chunk-AR5O4BEY.js} +6 -2
  374. package/dist/native/chunks/{chunk-QZAUOHDQ.js.map → chunk-AR5O4BEY.js.map} +1 -1
  375. package/dist/native/chunks/{chunk-RJVM5YDE.js → chunk-ATS7STZJ.js} +4 -4
  376. package/dist/native/chunks/{chunk-YTHR4Y5P.js → chunk-GWGIWQO7.js} +2 -2
  377. package/dist/native/chunks/{chunk-P3PL4WBO.js → chunk-LEMMXZFN.js} +24 -24
  378. package/dist/native/chunks/{chunk-P3PL4WBO.js.map → chunk-LEMMXZFN.js.map} +1 -1
  379. package/dist/native/chunks/chunk-NRN37A5K.js +67 -0
  380. package/dist/native/chunks/chunk-NRN37A5K.js.map +1 -0
  381. package/dist/native/chunks/{chunk-D4EYAXNG.js → chunk-QYUD3S6F.js} +5 -5
  382. package/dist/native/data-display/Alert.js +8 -8
  383. package/dist/native/data-display/Avatar.js +7 -7
  384. package/dist/native/data-display/Badge.js +8 -8
  385. package/dist/native/data-display/Chip.js +4 -4
  386. package/dist/native/data-display/EmptyState.js +11 -11
  387. package/dist/native/data-display/ErrorState.js +11 -11
  388. package/dist/native/data-display/LoadingState.js +7 -7
  389. package/dist/native/data-display/Progress.js +3 -3
  390. package/dist/native/feedback/Dialog.js +496 -0
  391. package/dist/native/feedback/Dialog.js.map +1 -0
  392. package/dist/native/form/Button.js +4 -4
  393. package/dist/native/form/Checkbox.js +5 -5
  394. package/dist/native/form/Input.js +5 -5
  395. package/dist/native/form/Select.js +6 -6
  396. package/dist/native/form/Switch.js +3 -3
  397. package/dist/native/icons.js +4 -4
  398. package/dist/native/layout/Box.js +4 -4
  399. package/dist/native/layout/Card.js +494 -0
  400. package/dist/native/layout/Card.js.map +1 -0
  401. package/dist/native/layout/Container.js +3 -3
  402. package/dist/native/layout/Skeleton.js +6 -6
  403. package/dist/native/layout/Spacer.js +3 -3
  404. package/dist/native/layout/Stack.js +4 -4
  405. package/dist/native/provider.js +2 -2
  406. package/dist/native/tokens.js +1 -1
  407. package/dist/native/typography/Heading.js +3 -3
  408. package/dist/native/typography/Paragraph.js +3 -3
  409. package/dist/native/typography/Text.js +3 -3
  410. package/dist/navigation/AppHeader.js +14 -11
  411. package/dist/navigation/CommandPalette.js +2 -2
  412. package/dist/navigation/Pagination.js +2 -2
  413. package/dist/pt-BR.js +4 -4
  414. package/dist/social-login-button.js +11 -9
  415. package/dist/types/components/data-display/FleetMap/FleetBody.d.ts +22 -0
  416. package/dist/types/components/data-display/FleetMap/FleetBody.d.ts.map +1 -0
  417. package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts +50 -0
  418. package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts.map +1 -0
  419. package/dist/types/components/data-display/FleetMap/FleetMap.d.ts +32 -0
  420. package/dist/types/components/data-display/FleetMap/FleetMap.d.ts.map +1 -0
  421. package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts +23 -0
  422. package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts.map +1 -0
  423. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
  424. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
  425. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts +54 -0
  426. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
  427. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts +145 -0
  428. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts.map +1 -0
  429. package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts +15 -0
  430. package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts.map +1 -0
  431. package/dist/types/components/data-display/FleetMap/index.d.ts +5 -0
  432. package/dist/types/components/data-display/FleetMap/index.d.ts.map +1 -0
  433. package/dist/types/components/data-display/index.d.ts +1 -0
  434. package/dist/types/components/data-display/index.d.ts.map +1 -1
  435. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts +64 -0
  436. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts.map +1 -0
  437. package/dist/types/components/feedback/Dialog/Dialog.d.ts.map +1 -1
  438. package/dist/types/components/feedback/Dialog/Dialog.helpers.d.ts +35 -0
  439. package/dist/types/components/feedback/Dialog/Dialog.helpers.d.ts.map +1 -0
  440. package/dist/types/components/feedback/Dialog/Dialog.metrics.d.ts +133 -0
  441. package/dist/types/components/feedback/Dialog/Dialog.metrics.d.ts.map +1 -0
  442. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts +4 -4
  443. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
  444. package/dist/types/components/feedback/Dialog/Dialog.types.d.ts +8 -41
  445. package/dist/types/components/feedback/Dialog/Dialog.types.d.ts.map +1 -1
  446. package/dist/types/components/feedback/Dialog/index.d.ts +1 -1
  447. package/dist/types/components/feedback/Dialog/index.d.ts.map +1 -1
  448. package/dist/types/components/layout/Card/Card.base.d.ts +77 -0
  449. package/dist/types/components/layout/Card/Card.base.d.ts.map +1 -0
  450. package/dist/types/components/layout/Card/Card.d.ts.map +1 -1
  451. package/dist/types/components/layout/Card/Card.helpers.d.ts +8 -3
  452. package/dist/types/components/layout/Card/Card.helpers.d.ts.map +1 -1
  453. package/dist/types/components/layout/Card/Card.metrics.d.ts +182 -0
  454. package/dist/types/components/layout/Card/Card.metrics.d.ts.map +1 -0
  455. package/dist/types/components/layout/Card/Card.styles.d.ts +2 -2
  456. package/dist/types/components/layout/Card/Card.styles.d.ts.map +1 -1
  457. package/dist/types/components/layout/Card/Card.types.d.ts +10 -44
  458. package/dist/types/components/layout/Card/Card.types.d.ts.map +1 -1
  459. package/dist/types/components/layout/Card/index.d.ts +1 -1
  460. package/dist/types/components/layout/Card/index.d.ts.map +1 -1
  461. package/dist/types/platform/test-id.d.ts +14 -0
  462. package/dist/types/platform/test-id.d.ts.map +1 -1
  463. package/dist/types/tokens/mui-type.d.ts +1 -1
  464. package/dist/types/tokens/mui-type.d.ts.map +1 -1
  465. package/dist/types/tokens/shadow.d.ts +40 -0
  466. package/dist/types/tokens/shadow.d.ts.map +1 -0
  467. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts +64 -0
  468. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts.map +1 -0
  469. package/dist/types-native/components/feedback/Dialog/Dialog.helpers.d.ts +35 -0
  470. package/dist/types-native/components/feedback/Dialog/Dialog.helpers.d.ts.map +1 -0
  471. package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts +44 -0
  472. package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts.map +1 -0
  473. package/dist/types-native/components/feedback/Dialog/Dialog.metrics.d.ts +133 -0
  474. package/dist/types-native/components/feedback/Dialog/Dialog.metrics.d.ts.map +1 -0
  475. package/dist/types-native/components/feedback/Dialog/Dialog.native.d.ts +8 -0
  476. package/dist/types-native/components/feedback/Dialog/Dialog.native.d.ts.map +1 -0
  477. package/dist/types-native/components/feedback/Dialog/Dialog.types.native.d.ts +25 -0
  478. package/dist/types-native/components/feedback/Dialog/Dialog.types.native.d.ts.map +1 -0
  479. package/dist/types-native/components/feedback/Dialog/DialogParts.native.d.ts +39 -0
  480. package/dist/types-native/components/feedback/Dialog/DialogParts.native.d.ts.map +1 -0
  481. package/dist/types-native/components/feedback/Dialog/index.native.d.ts +4 -0
  482. package/dist/types-native/components/feedback/Dialog/index.native.d.ts.map +1 -0
  483. package/dist/types-native/components/layout/Card/Card.base.d.ts +77 -0
  484. package/dist/types-native/components/layout/Card/Card.base.d.ts.map +1 -0
  485. package/dist/types-native/components/layout/Card/Card.helpers.d.ts +11 -0
  486. package/dist/types-native/components/layout/Card/Card.helpers.d.ts.map +1 -0
  487. package/dist/types-native/components/layout/Card/Card.look.native.d.ts +57 -0
  488. package/dist/types-native/components/layout/Card/Card.look.native.d.ts.map +1 -0
  489. package/dist/types-native/components/layout/Card/Card.metrics.d.ts +182 -0
  490. package/dist/types-native/components/layout/Card/Card.metrics.d.ts.map +1 -0
  491. package/dist/types-native/components/layout/Card/Card.native.d.ts +11 -0
  492. package/dist/types-native/components/layout/Card/Card.native.d.ts.map +1 -0
  493. package/dist/types-native/components/layout/Card/Card.types.native.d.ts +28 -0
  494. package/dist/types-native/components/layout/Card/Card.types.native.d.ts.map +1 -0
  495. package/dist/types-native/components/layout/Card/CardParts.native.d.ts +55 -0
  496. package/dist/types-native/components/layout/Card/CardParts.native.d.ts.map +1 -0
  497. package/dist/types-native/components/layout/Card/index.native.d.ts +4 -0
  498. package/dist/types-native/components/layout/Card/index.native.d.ts.map +1 -0
  499. package/dist/types-native/platform/pulse-ring.native.d.ts +35 -0
  500. package/dist/types-native/platform/pulse-ring.native.d.ts.map +1 -0
  501. package/dist/types-native/platform/test-id.d.ts +14 -0
  502. package/dist/types-native/platform/test-id.d.ts.map +1 -1
  503. package/dist/types-native/tokens/mui-type.d.ts +1 -1
  504. package/dist/types-native/tokens/mui-type.d.ts.map +1 -1
  505. package/dist/types-native/tokens/shadow.d.ts +40 -0
  506. package/dist/types-native/tokens/shadow.d.ts.map +1 -0
  507. package/dist/typography/Heading.js +2 -2
  508. package/dist/typography/Paragraph.js +2 -2
  509. package/dist/typography/Text.js +2 -2
  510. package/dist/user-avatar.js +10 -8
  511. package/dist/utility/InfiniteScroll.js +2 -2
  512. package/dist/utility/InstallPrompt.js +2 -2
  513. package/package.json +13 -1
  514. package/src/components/data-display/CardKit/NATIVE-NOTES.md +48 -0
  515. package/src/components/data-display/FleetMap/FleetBody.tsx +96 -0
  516. package/src/components/data-display/FleetMap/FleetCanvas.tsx +80 -0
  517. package/src/components/data-display/FleetMap/FleetMap.fixtures.ts +70 -0
  518. package/src/components/data-display/FleetMap/FleetMap.helpers.ts +85 -0
  519. package/src/components/data-display/FleetMap/FleetMap.hooks.ts +164 -0
  520. package/src/components/data-display/FleetMap/FleetMap.md +182 -0
  521. package/src/components/data-display/FleetMap/FleetMap.tsx +169 -0
  522. package/src/components/data-display/FleetMap/FleetMap.types.ts +148 -0
  523. package/src/components/data-display/FleetMap/FleetRoster.tsx +321 -0
  524. package/src/components/data-display/FleetMap/index.ts +9 -0
  525. package/src/components/data-display/FleetMap/tests.md +79 -0
  526. package/src/components/data-display/FleetMap/track.md +50 -0
  527. package/src/components/data-display/index.ts +1 -0
  528. package/src/components/feedback/ConfirmAction/ConfirmAction.md +10 -4
  529. package/src/components/feedback/Dialog/Dialog.base.ts +69 -0
  530. package/src/components/feedback/Dialog/Dialog.helpers.ts +75 -0
  531. package/src/components/feedback/Dialog/Dialog.look.native.ts +159 -0
  532. package/src/components/feedback/Dialog/Dialog.metrics.ts +140 -0
  533. package/src/components/feedback/Dialog/Dialog.native.tsx +149 -0
  534. package/src/components/feedback/Dialog/Dialog.styles.ts +63 -41
  535. package/src/components/feedback/Dialog/Dialog.tsx +58 -74
  536. package/src/components/feedback/Dialog/Dialog.types.native.ts +46 -0
  537. package/src/components/feedback/Dialog/Dialog.types.ts +24 -41
  538. package/src/components/feedback/Dialog/DialogParts.native.tsx +257 -0
  539. package/src/components/feedback/Dialog/NATIVE-NOTES.md +16 -0
  540. package/src/components/feedback/Dialog/index.native.ts +16 -0
  541. package/src/components/feedback/Dialog/index.ts +8 -2
  542. package/src/components/layout/Card/Card.base.ts +92 -0
  543. package/src/components/layout/Card/Card.helpers.ts +13 -7
  544. package/src/components/layout/Card/Card.look.native.ts +204 -0
  545. package/src/components/layout/Card/Card.metrics.ts +171 -0
  546. package/src/components/layout/Card/Card.native.tsx +130 -0
  547. package/src/components/layout/Card/Card.styles.ts +88 -48
  548. package/src/components/layout/Card/Card.tsx +41 -25
  549. package/src/components/layout/Card/Card.types.native.ts +59 -0
  550. package/src/components/layout/Card/Card.types.ts +30 -45
  551. package/src/components/layout/Card/CardParts.native.tsx +262 -0
  552. package/src/components/layout/Card/NATIVE-NOTES.md +15 -0
  553. package/src/components/layout/Card/index.native.ts +18 -0
  554. package/src/components/layout/Card/index.ts +9 -0
  555. package/src/platform/pulse-ring.native.tsx +82 -0
  556. package/src/platform/test-id.ts +17 -0
  557. package/src/tokens/mui-type.ts +2 -1
  558. package/src/tokens/shadow.ts +59 -0
  559. package/dist/chunk-6PRA45LC.js.map +0 -1
  560. package/dist/chunk-D2IASECY.js.map +0 -1
  561. package/dist/chunk-RI5JZLZL.js.map +0 -1
  562. package/dist/chunk-S5LE2ARG.js.map +0 -1
  563. package/dist/chunk-VMF3UXM4.js +0 -137
  564. package/dist/chunk-VMF3UXM4.js.map +0 -1
  565. package/dist/chunk-X3HL5C6H.js +0 -1
  566. package/dist/native/chunks/chunk-HSIND52T.js.map +0 -1
  567. /package/dist/{chunk-X3HL5C6H.js.map → _internal/components/data-display/FleetMap/FleetBody.js.map} +0 -0
  568. /package/dist/{chunk-NUE774AN.js.map → chunk-25R3ITGZ.js.map} +0 -0
  569. /package/dist/{chunk-Z6UEOSL7.js.map → chunk-2FDBR77W.js.map} +0 -0
  570. /package/dist/{chunk-IFNK5TPI.js.map → chunk-2HPP6RVC.js.map} +0 -0
  571. /package/dist/{chunk-GCXYCDOA.js.map → chunk-2UGJIKVA.js.map} +0 -0
  572. /package/dist/{chunk-26Z7QWID.js.map → chunk-343TTIHD.js.map} +0 -0
  573. /package/dist/{chunk-BRSF5NRT.js.map → chunk-3FLVIVOK.js.map} +0 -0
  574. /package/dist/{chunk-BDVNAU2C.js.map → chunk-4523RYE7.js.map} +0 -0
  575. /package/dist/{chunk-4ETQRBZC.js.map → chunk-46UPILLK.js.map} +0 -0
  576. /package/dist/{chunk-WMALDOF5.js.map → chunk-4G3FGCWX.js.map} +0 -0
  577. /package/dist/{chunk-I3MDKPGG.js.map → chunk-4IVOHL32.js.map} +0 -0
  578. /package/dist/{chunk-SAHQLXNN.js.map → chunk-4LRFGB3K.js.map} +0 -0
  579. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
  580. /package/dist/{chunk-TLX66HCW.js.map → chunk-4OHRZW7U.js.map} +0 -0
  581. /package/dist/{chunk-2QFTAGDH.js.map → chunk-4X4KM4ZB.js.map} +0 -0
  582. /package/dist/{chunk-7ZH7ZB33.js.map → chunk-4XZXLB4I.js.map} +0 -0
  583. /package/dist/{chunk-77F36LQQ.js.map → chunk-5OIH36KX.js.map} +0 -0
  584. /package/dist/{chunk-GDEXYUPF.js.map → chunk-67L7HMEP.js.map} +0 -0
  585. /package/dist/{chunk-ZFPJBKVZ.js.map → chunk-6JGPPTLX.js.map} +0 -0
  586. /package/dist/{chunk-VIK3HAUQ.js.map → chunk-73NJCGQG.js.map} +0 -0
  587. /package/dist/{chunk-D4T646G4.js.map → chunk-7NSX7A5H.js.map} +0 -0
  588. /package/dist/{chunk-QS7ZGRNS.js.map → chunk-7VN7LFBA.js.map} +0 -0
  589. /package/dist/{chunk-3UOHKHOT.js.map → chunk-ACFGEZ4Q.js.map} +0 -0
  590. /package/dist/{chunk-GBNOYRLP.js.map → chunk-AEGXHZQT.js.map} +0 -0
  591. /package/dist/{chunk-BEH4DN63.js.map → chunk-AJGYHDA5.js.map} +0 -0
  592. /package/dist/{chunk-65DLYC4S.js.map → chunk-AVGTTWTE.js.map} +0 -0
  593. /package/dist/{chunk-PXH24VIP.js.map → chunk-B6IURHSZ.js.map} +0 -0
  594. /package/dist/{chunk-XEE7PLDR.js.map → chunk-BZTFPSWT.js.map} +0 -0
  595. /package/dist/{chunk-B3BK2SNS.js.map → chunk-C3CMEDSO.js.map} +0 -0
  596. /package/dist/{chunk-OH3YGJT5.js.map → chunk-CBTY36TU.js.map} +0 -0
  597. /package/dist/{chunk-JIINGMEB.js.map → chunk-CHPZTF34.js.map} +0 -0
  598. /package/dist/{chunk-PWXL3QQ6.js.map → chunk-CJBBGMIA.js.map} +0 -0
  599. /package/dist/{chunk-BPYPUEM5.js.map → chunk-CZJLWCEG.js.map} +0 -0
  600. /package/dist/{chunk-FPWB5ILF.js.map → chunk-DRHIIUDO.js.map} +0 -0
  601. /package/dist/{chunk-BEGWE5O4.js.map → chunk-DTC224UJ.js.map} +0 -0
  602. /package/dist/{chunk-UB76PBDF.js.map → chunk-DVFIE54C.js.map} +0 -0
  603. /package/dist/{chunk-GO4MVQGC.js.map → chunk-DW5FRWRQ.js.map} +0 -0
  604. /package/dist/{chunk-6Z4H2Y77.js.map → chunk-E27Y7FF2.js.map} +0 -0
  605. /package/dist/{chunk-PANMJFDS.js.map → chunk-E55CJV65.js.map} +0 -0
  606. /package/dist/{chunk-JXAYT6LX.js.map → chunk-EJQW2IYW.js.map} +0 -0
  607. /package/dist/{chunk-TPIBJP4S.js.map → chunk-EOHKZGOZ.js.map} +0 -0
  608. /package/dist/{chunk-MSUSZLRE.js.map → chunk-EWT3WMVY.js.map} +0 -0
  609. /package/dist/{chunk-DH75UNF3.js.map → chunk-FGK2C7JR.js.map} +0 -0
  610. /package/dist/{chunk-AD776JPA.js.map → chunk-FR67FG2U.js.map} +0 -0
  611. /package/dist/{chunk-SHQWIDD5.js.map → chunk-GJQYM3PM.js.map} +0 -0
  612. /package/dist/{chunk-7KTU6YMQ.js.map → chunk-GMTM6EN7.js.map} +0 -0
  613. /package/dist/{chunk-WROCSDVL.js.map → chunk-GSFNH4C5.js.map} +0 -0
  614. /package/dist/{chunk-PF5HDFYY.js.map → chunk-GVA5CYKP.js.map} +0 -0
  615. /package/dist/{chunk-Z5ABJLTM.js.map → chunk-HFXTAEYY.js.map} +0 -0
  616. /package/dist/{chunk-FOMK3WPG.js.map → chunk-HLYPI5CO.js.map} +0 -0
  617. /package/dist/{chunk-VR5HDUBK.js.map → chunk-HP2ODXNA.js.map} +0 -0
  618. /package/dist/{chunk-GBRKP5GZ.js.map → chunk-I5SBTNV2.js.map} +0 -0
  619. /package/dist/{chunk-TP4N3X2Q.js.map → chunk-IPVYEPXO.js.map} +0 -0
  620. /package/dist/{chunk-RRO2EOJB.js.map → chunk-JB67KPGM.js.map} +0 -0
  621. /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
  622. /package/dist/{chunk-4HYXEMBP.js.map → chunk-JIKWZDNK.js.map} +0 -0
  623. /package/dist/{chunk-4MLDWACO.js.map → chunk-JM64OEU6.js.map} +0 -0
  624. /package/dist/{chunk-2QLVUVVR.js.map → chunk-JSH3HFDQ.js.map} +0 -0
  625. /package/dist/{chunk-TZ4SFX3M.js.map → chunk-JWW2Z3RH.js.map} +0 -0
  626. /package/dist/{chunk-QFHH2NU5.js.map → chunk-JXNT5TUP.js.map} +0 -0
  627. /package/dist/{chunk-FINCVAAR.js.map → chunk-KHWCX4LI.js.map} +0 -0
  628. /package/dist/{chunk-THZ2NAA4.js.map → chunk-KW7H5O3K.js.map} +0 -0
  629. /package/dist/{chunk-XLJJ2ZAP.js.map → chunk-L4U23SBX.js.map} +0 -0
  630. /package/dist/{chunk-ZXLIWOXC.js.map → chunk-LS4FMSHY.js.map} +0 -0
  631. /package/dist/{chunk-SFAP5EH5.js.map → chunk-LUMF63BM.js.map} +0 -0
  632. /package/dist/{chunk-CZPU5TW3.js.map → chunk-LYSSO6WC.js.map} +0 -0
  633. /package/dist/{chunk-736HP6BL.js.map → chunk-M4LQRQFL.js.map} +0 -0
  634. /package/dist/{chunk-426FTCMF.js.map → chunk-MESRKY67.js.map} +0 -0
  635. /package/dist/{chunk-B5PYBEXO.js.map → chunk-MP4VSWHK.js.map} +0 -0
  636. /package/dist/{chunk-UOPQOBQZ.js.map → chunk-MYGNIFZC.js.map} +0 -0
  637. /package/dist/{chunk-6RGWDKUL.js.map → chunk-N2TUX4A5.js.map} +0 -0
  638. /package/dist/{chunk-VWGR5XUP.js.map → chunk-NWNSUHEB.js.map} +0 -0
  639. /package/dist/{chunk-4K7FDVAB.js.map → chunk-O3336DJ6.js.map} +0 -0
  640. /package/dist/{chunk-YCCKY5VW.js.map → chunk-OFOYMZRY.js.map} +0 -0
  641. /package/dist/{chunk-OCXCH2ZW.js.map → chunk-OIKQO73C.js.map} +0 -0
  642. /package/dist/{chunk-QZDBWXZG.js.map → chunk-OP65D4UR.js.map} +0 -0
  643. /package/dist/{chunk-MCRIT46W.js.map → chunk-OTH7H3IP.js.map} +0 -0
  644. /package/dist/{chunk-BQQONDW5.js.map → chunk-OVLNF4AZ.js.map} +0 -0
  645. /package/dist/{chunk-AGYGNNOM.js.map → chunk-PQECNGDE.js.map} +0 -0
  646. /package/dist/{chunk-IIROZKW5.js.map → chunk-PRUSQQDT.js.map} +0 -0
  647. /package/dist/{chunk-IPE5FFFD.js.map → chunk-PUBPZOQJ.js.map} +0 -0
  648. /package/dist/{chunk-FB36IHCE.js.map → chunk-QFVFHIHE.js.map} +0 -0
  649. /package/dist/{chunk-V5P5Q6HM.js.map → chunk-QJRDDVZ2.js.map} +0 -0
  650. /package/dist/{chunk-WBKWIFXA.js.map → chunk-QYNCPS5W.js.map} +0 -0
  651. /package/dist/{chunk-VPHOSIPB.js.map → chunk-R6SNYC3D.js.map} +0 -0
  652. /package/dist/{chunk-STH66VLA.js.map → chunk-R7R3LOKW.js.map} +0 -0
  653. /package/dist/{chunk-W2UTDN4T.js.map → chunk-RBGOGTT2.js.map} +0 -0
  654. /package/dist/{chunk-VWBWKLXX.js.map → chunk-SX3V2DLV.js.map} +0 -0
  655. /package/dist/{chunk-P7FQUGED.js.map → chunk-TNVO2DTB.js.map} +0 -0
  656. /package/dist/{chunk-WTIOCG4M.js.map → chunk-TOYEP23N.js.map} +0 -0
  657. /package/dist/{chunk-G2IPK2XE.js.map → chunk-TPLKJHNN.js.map} +0 -0
  658. /package/dist/{chunk-U2AC4AQX.js.map → chunk-TU5EIKJA.js.map} +0 -0
  659. /package/dist/{chunk-ZGHIHEND.js.map → chunk-TW3BXVEU.js.map} +0 -0
  660. /package/dist/{chunk-BGYLL467.js.map → chunk-TXHJX2NG.js.map} +0 -0
  661. /package/dist/{chunk-5RQ7N63M.js.map → chunk-TZDDL3DR.js.map} +0 -0
  662. /package/dist/{chunk-RPQ3W2C6.js.map → chunk-U2ZDN2AL.js.map} +0 -0
  663. /package/dist/{chunk-WPZT2JD4.js.map → chunk-U7Q2Y6WG.js.map} +0 -0
  664. /package/dist/{chunk-E46PG577.js.map → chunk-URXT5TOY.js.map} +0 -0
  665. /package/dist/{chunk-P6IPJYCS.js.map → chunk-VNNG46TS.js.map} +0 -0
  666. /package/dist/{chunk-CXVMD6FE.js.map → chunk-VON4BFK4.js.map} +0 -0
  667. /package/dist/{chunk-2SWQ6HIK.js.map → chunk-W3FAKT3D.js.map} +0 -0
  668. /package/dist/{chunk-JDMYD6QC.js.map → chunk-W4SDVTZC.js.map} +0 -0
  669. /package/dist/{chunk-7MAOQIWA.js.map → chunk-W4YWU7LQ.js.map} +0 -0
  670. /package/dist/{chunk-Y46RBFBV.js.map → chunk-W7Y6RA6W.js.map} +0 -0
  671. /package/dist/{chunk-XFU2S6XT.js.map → chunk-WGRS4PGY.js.map} +0 -0
  672. /package/dist/{chunk-OOGEYCJH.js.map → chunk-WIT3Y7JT.js.map} +0 -0
  673. /package/dist/{chunk-KT6HWAEN.js.map → chunk-WQA4LIIK.js.map} +0 -0
  674. /package/dist/{chunk-J2KSG754.js.map → chunk-WRDPWEIC.js.map} +0 -0
  675. /package/dist/{chunk-RPWEXIAW.js.map → chunk-X5MPHXG5.js.map} +0 -0
  676. /package/dist/{chunk-UEIVXFUC.js.map → chunk-XELVDPKL.js.map} +0 -0
  677. /package/dist/{chunk-RRZBATXK.js.map → chunk-XKV5ZIBG.js.map} +0 -0
  678. /package/dist/{chunk-ZKFYBC6G.js.map → chunk-XSF6AXEU.js.map} +0 -0
  679. /package/dist/{chunk-R6RVBYTU.js.map → chunk-XUJG2HFW.js.map} +0 -0
  680. /package/dist/{chunk-FRQ4HNGF.js.map → chunk-YJ4HM25H.js.map} +0 -0
  681. /package/dist/{chunk-TVO5STZB.js.map → chunk-YQ6TNHAC.js.map} +0 -0
  682. /package/dist/{chunk-BNNSO4MC.js.map → chunk-YTOYMJPM.js.map} +0 -0
  683. /package/dist/{chunk-IH4RSRQA.js.map → chunk-ZA4U5GDU.js.map} +0 -0
  684. /package/dist/native/chunks/{chunk-OGWPPQL4.js.map → chunk-75JQYVDZ.js.map} +0 -0
  685. /package/dist/native/chunks/{chunk-WKMDCNIN.js.map → chunk-7LTVGW23.js.map} +0 -0
  686. /package/dist/native/chunks/{chunk-RJVM5YDE.js.map → chunk-ATS7STZJ.js.map} +0 -0
  687. /package/dist/native/chunks/{chunk-YTHR4Y5P.js.map → chunk-GWGIWQO7.js.map} +0 -0
  688. /package/dist/native/chunks/{chunk-D4EYAXNG.js.map → chunk-QYUD3S6F.js.map} +0 -0
@@ -0,0 +1,148 @@
1
+ import type { MapPreviewCopy } from '../../../copy';
2
+
3
+ /**
4
+ * One tracked unit's newest position, as the caller resolved it.
5
+ *
6
+ * Deliberately says nothing about WHAT is being tracked. A courier, a service
7
+ * van, a field engineer — the component draws a labelled dot with a freshness,
8
+ * and every word that names the domain arrives through {@link FleetMapCopy}.
9
+ */
10
+ export interface FleetUnit {
11
+ id: string;
12
+ /** The name a human reads, on the pin and in the roster. */
13
+ label: string;
14
+ latitude: number;
15
+ longitude: number;
16
+ /**
17
+ * The fix's accuracy radius in metres, when the platform reported one.
18
+ *
19
+ * Kept because it is what separates a rooftop GPS fix from a cell-tower guess
20
+ * three blocks wide, and a map that draws both identically tells its reader
21
+ * something false.
22
+ */
23
+ accuracyM?: number | null;
24
+ /**
25
+ * Seconds since the fix was ACCEPTED, on the server's clock.
26
+ *
27
+ * The caller computes it, and the distinction matters: a device whose own
28
+ * clock is an hour slow would otherwise report itself as an hour stale while
29
+ * reporting perfectly.
30
+ */
31
+ staleSeconds: number;
32
+ /** A short pre-formatted badge beside the name, e.g. `"2 entregas"`. */
33
+ badge?: string;
34
+ }
35
+
36
+ /** How current a unit's newest fix is, derived from the thresholds below. */
37
+ export type FleetFreshness = 'live' | 'lagging' | 'stale';
38
+
39
+ /**
40
+ * Every word the board prints, and the two it FORMATS.
41
+ *
42
+ * `lastSeen` and `accuracy` are functions rather than strings because a
43
+ * duration and a distance are locale rules, and this package holds the same
44
+ * line `StatCard` does: presentation only, the caller owns the formatting. A
45
+ * `lastSeenMinutes: string` template would have made "há 2 min" the only
46
+ * shape any consumer could ever render.
47
+ */
48
+ export interface FleetMapCopy {
49
+ /** The panel's heading. */
50
+ title: string;
51
+ /** What the roster says when nobody is reporting. */
52
+ emptyTitle: string;
53
+ emptyDescription?: string;
54
+ /** The roster list's accessible name — it is the map's readable half. */
55
+ rosterLabel: string;
56
+ /**
57
+ * What a screen reader hears while the roster reloads, e.g. "Atualizando a
58
+ * frota". OPTIONAL, and silence is the honest default: `aria-busy` marks the
59
+ * region stale without uttering anything, the skeletons are `aria-hidden`,
60
+ * and this component cannot invent the sentence in the reader's language.
61
+ * Set it and the panel announces politely; leave it and it stays quiet.
62
+ *
63
+ * Announced on a TRANSITION into loading. A board mounted already loading is
64
+ * silent — as any live region is at mount, since there is no change for a
65
+ * reader to observe.
66
+ */
67
+ loading?: string;
68
+ /**
69
+ * The map region's accessible name.
70
+ *
71
+ * The map is NOT `aria-hidden`, and that is deliberate rather than an
72
+ * oversight: it carries focusable controls (zoom, centre, map type), and
73
+ * `aria-hidden` over a focusable subtree is the `aria-hidden-focus`
74
+ * violation — a keyboard user tabs into a region a screen reader insists is
75
+ * not there. So it is a NAMED region a reader can skip past instead, and the
76
+ * roster beside it carries every fact a pin does.
77
+ *
78
+ * Skipping it does not silence it: `MapPreview` carries its own
79
+ * `aria-live="polite"` and announces its centre in English on every
80
+ * re-centre. See `FleetCanvas` for why that is stated rather than fixed here.
81
+ */
82
+ mapLabel: string;
83
+ /** The three freshness words, as a reader sees them on a row. */
84
+ freshness: Record<FleetFreshness, string>;
85
+ /** `(seconds) => "há 2 min"`. */
86
+ lastSeen: (staleSeconds: number) => string;
87
+ /** `(metres) => "±12 m"`. A unit with no accuracy renders none. */
88
+ accuracy: (metres: number) => string;
89
+ /** The map control bar's own six names. */
90
+ map: MapPreviewCopy;
91
+ }
92
+
93
+ /** Props for the {@link FleetMap} live board. */
94
+ export interface FleetMapProps {
95
+ /** Everyone currently reporting. An empty array renders the empty state. */
96
+ units: readonly FleetUnit[];
97
+ copy: FleetMapCopy;
98
+ /**
99
+ * Which unit is highlighted: the map centres on it and the roster marks it
100
+ * selected. `null` selects nobody and centres on the whole fleet.
101
+ *
102
+ * PASSING IT AT ALL IS THE DECISION. Present on the first render — `null`
103
+ * included — and the board is controlled for life: it renders what you pass
104
+ * and never moves the selection itself. Absent on the first render and it
105
+ * keeps its own, reporting each change through {@link onSelect}. The mode is
106
+ * latched on that first render, the way React latches an `<input>`, so the
107
+ * component cannot change its own semantics halfway through a session.
108
+ *
109
+ * A controlled board reads `undefined` as "nobody is selected", so
110
+ * `useState<string>()` in the caller behaves: clearing it clears the roster.
111
+ */
112
+ selectedId?: string | null;
113
+ /**
114
+ * A click on a row or a pin, and each arrow-key move. Fires in both modes, so
115
+ * an uncontrolled board can still be observed.
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
+ /** Map height, any CSS length. */
134
+ height?: string;
135
+ /**
136
+ * While true the map and roster are marked `aria-busy`, and the roster renders
137
+ * skeletons IF no units have landed yet — a poll over a populated roster keeps
138
+ * the list, because unmounting it throws away the focus inside it.
139
+ *
140
+ * It only ANNOUNCES if {@link FleetMapCopy.loading} is set — `aria-busy` is a
141
+ * state, not an utterance. The panel root is deliberately not the busy
142
+ * element, so that announcement sits outside the busy subtree.
143
+ */
144
+ loading?: boolean;
145
+ className?: string;
146
+ /** Test id for the panel root; every child id is derived from it. */
147
+ dataTestId?: string;
148
+ }
@@ -0,0 +1,321 @@
1
+ import Box from '@mui/material/Box/index.js';
2
+ import Stack from '@mui/material/Stack/index.js';
3
+ import Typography from '@mui/material/Typography/index.js';
4
+ import { useTheme, type SxProps, type Theme } from '@mui/material/styles/index.js';
5
+ import React from 'react';
6
+
7
+ import { Skeleton } from '../../layout/Skeleton/Skeleton';
8
+
9
+ import { freshnessOf } from './FleetMap.helpers';
10
+ import type { FleetFreshness, FleetMapCopy, FleetUnit } from './FleetMap.types';
11
+
12
+ /**
13
+ * The roster beside the map — and the ACCESSIBLE half of this component.
14
+ *
15
+ * A map is a picture of positions and a screen reader cannot read a picture, so
16
+ * the panel's information is carried by this list. That is not a consolation
17
+ * prize: the list answers the questions a dispatcher actually asks — who is
18
+ * reporting, how recently, and what are they carrying — and it answers them in
19
+ * an order the map cannot express.
20
+ *
21
+ * The map beside it is a NAMED LANDMARK rather than an `aria-hidden` one, so a
22
+ * reader can skip it in one gesture — see `FleetCanvas`, which carries the
23
+ * reason it must not be hidden.
24
+ */
25
+
26
+ /** Each freshness draws from the semantic palette, never a hardcoded hex. */
27
+ function freshnessColor(freshness: FleetFreshness, theme: Theme): string {
28
+ if (freshness === 'live') return theme.palette.success.main;
29
+ if (freshness === 'lagging') return theme.palette.warning.main;
30
+ return theme.palette.text.disabled;
31
+ }
32
+
33
+ /**
34
+ * A row's two lines of text — the name, and the one-line summary under it.
35
+ *
36
+ * Split out of `FleetRow` to keep that function under the size gate, and the
37
+ * seam is the natural one: everything here is READ, nothing is interactive.
38
+ */
39
+ function RowText({
40
+ unit,
41
+ copy,
42
+ freshness,
43
+ testId,
44
+ }: Pick<RowProps, 'unit' | 'copy' | 'freshness' | 'testId'>): React.JSX.Element {
45
+ const theme = useTheme();
46
+
47
+ // Dropped rather than rendered empty: a phone that reports no accuracy radius
48
+ // would otherwise print a trailing separator with nothing after it.
49
+ const meta = [
50
+ copy.freshness[freshness],
51
+ copy.lastSeen(unit.staleSeconds),
52
+ unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM),
53
+ ]
54
+ .filter((part): part is string => Boolean(part))
55
+ .join(' · ');
56
+
57
+ return (
58
+ <Stack sx={{ minWidth: 0, flexGrow: 1 }}>
59
+ <Typography
60
+ variant="body2"
61
+ component="p"
62
+ data-testid={`${testId}-label`}
63
+ sx={{ fontWeight: theme.typography.fontWeightMedium, overflowWrap: 'anywhere' }}
64
+ >
65
+ {unit.label}
66
+ </Typography>
67
+ <Typography
68
+ variant="caption"
69
+ component="p"
70
+ data-testid={`${testId}-meta`}
71
+ sx={{ color: theme.palette.text.secondary }}
72
+ >
73
+ {meta}
74
+ </Typography>
75
+ </Stack>
76
+ );
77
+ }
78
+
79
+ /**
80
+ * Keep the selected row visible INSIDE the roster.
81
+ *
82
+ * The roster caps its own height, so a dispatcher arrowing through a fleet of
83
+ * thirty otherwise walks the selection below the fold with nothing moving —
84
+ * `aria-activedescendant` follows, and a SIGHTED keyboard user sees no feedback
85
+ * at all.
86
+ *
87
+ * Watches the row's POSITION as well as its selectedness, because the roster
88
+ * re-sorts on every poll: a rider who stays selected while their staleness
89
+ * moves them down the list would otherwise slide out of view with the effect
90
+ * never re-running.
91
+ *
92
+ * Arithmetic rather than `scrollIntoView({ block: 'nearest' })` because that
93
+ * walks every scrollable ancestor, the document included, and `nearest` only
94
+ * spares an ancestor the row is already visible in — which is exactly false
95
+ * when the panel is off screen. Re-running on every re-sort, it would yank the
96
+ * whole page back to the map on a timer, and drag it there on mount for any
97
+ * board rendered below the fold with a selection already set.
98
+ */
99
+ function useKeptInView(
100
+ selected: boolean,
101
+ position: number,
102
+ ): React.RefObject<HTMLDivElement | null> {
103
+ const row = React.useRef<HTMLDivElement>(null);
104
+
105
+ React.useEffect(() => {
106
+ const box = row.current;
107
+ const list = box?.parentElement;
108
+ if (!selected || !box || !list) return;
109
+ const top = box.offsetTop - list.offsetTop;
110
+ if (top < list.scrollTop) {
111
+ list.scrollTop = top;
112
+ } else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {
113
+ list.scrollTop = top + box.offsetHeight - list.clientHeight;
114
+ }
115
+ }, [selected, position]);
116
+
117
+ return row;
118
+ }
119
+
120
+ /**
121
+ * A row's own box, selected or not.
122
+ *
123
+ * Out of line because the hover rule needs the explanation more than the JSX
124
+ * has room for: hover must never WEAKEN the selection. Written flat as
125
+ * `'&:hover': { backgroundColor: action.hover }`, the pseudo-class wins on
126
+ * specificity and repaints the selected row with the hover tint — measured at
127
+ * `rgba(0,0,0,0.08)` idle against `rgba(0,0,0,0.04)` hovered, so pointing at
128
+ * the selected row visually DESELECTED it and made it indistinguishable from
129
+ * any other row under the cursor.
130
+ */
131
+ function rowSx(theme: Theme, selected: boolean): SxProps<Theme> {
132
+ const resting = selected ? theme.palette.action.selected : 'transparent';
133
+ return {
134
+ display: 'flex',
135
+ alignItems: 'center',
136
+ gap: theme.spacing(1.5),
137
+ padding: theme.spacing(1, 1.5),
138
+ // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as
139
+ // a multiple of `theme.shape.borderRadius`, so dividing the theme value out
140
+ // and letting `sx` multiply it back in is quadratic: measured 4px on the
141
+ // default theme — which is why this looked right — and 36px on a host that
142
+ // sets its own radius to 12. In a package whose whole premise is being
143
+ // re-themed, only the multiple is portable.
144
+ borderRadius: 1,
145
+ cursor: 'pointer',
146
+ backgroundColor: resting,
147
+ '&:hover': {
148
+ backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover,
149
+ },
150
+ };
151
+ }
152
+
153
+ interface RowProps {
154
+ unit: FleetUnit;
155
+ copy: FleetMapCopy;
156
+ freshness: FleetFreshness;
157
+ selected: boolean;
158
+ onSelect: (id: string) => void;
159
+ /** The row's DOM id, which `aria-activedescendant` points at. */
160
+ optionId: string;
161
+ /** Where the row sits in the re-sorted roster — see the scroll effect. */
162
+ position: number;
163
+ testId: string;
164
+ }
165
+
166
+ function FleetRow({
167
+ unit,
168
+ copy,
169
+ freshness,
170
+ selected,
171
+ onSelect,
172
+ optionId,
173
+ position,
174
+ testId,
175
+ }: RowProps): React.JSX.Element {
176
+ const theme = useTheme();
177
+ const color = freshnessColor(freshness, theme);
178
+ const row = useKeptInView(selected, position);
179
+
180
+ return (
181
+ <Box
182
+ ref={row}
183
+ role="option"
184
+ aria-selected={selected}
185
+ id={optionId}
186
+ data-testid={testId}
187
+ data-freshness={freshness}
188
+ onClick={() => onSelect(unit.id)}
189
+ sx={rowSx(theme, selected)}
190
+ >
191
+ {/* The dot repeats what the freshness word beside it already says, so it
192
+ is hidden rather than read twice — and colour is never the only
193
+ carrier of the state. */}
194
+ <Box
195
+ aria-hidden="true"
196
+ data-testid={`${testId}-dot`}
197
+ sx={{
198
+ width: 10,
199
+ height: 10,
200
+ borderRadius: '50%',
201
+ flexShrink: 0,
202
+ backgroundColor: color,
203
+ }}
204
+ />
205
+ <RowText unit={unit} copy={copy} freshness={freshness} testId={testId} />
206
+ {unit.badge && (
207
+ <Typography
208
+ variant="caption"
209
+ component="span"
210
+ data-testid={`${testId}-badge`}
211
+ sx={{ color: theme.palette.text.secondary, flexShrink: 0 }}
212
+ >
213
+ {unit.badge}
214
+ </Typography>
215
+ )}
216
+ </Box>
217
+ );
218
+ }
219
+
220
+ /**
221
+ * What stands in for the roster before any unit has landed.
222
+ *
223
+ * `aria-hidden`, because three grey bars are not information — the panel's
224
+ * `aria-busy` and its optional announcement carry that. The radius is the same
225
+ * MULTIPLE a real row uses rather than a raw pixel count: `Skeleton` forwards
226
+ * the number into `sx`, where it scales with `theme.shape.borderRadius`, so a
227
+ * literal `4` drew 16px against the rows' 4px on the default theme and 48px
228
+ * against 12px on a re-themed host.
229
+ */
230
+ function FirstLoad({ testId }: { testId: string }): React.JSX.Element {
231
+ return (
232
+ <Stack spacing={1} data-testid={`${testId}-skeleton`} aria-hidden="true">
233
+ {[0, 1, 2].map((row) => (
234
+ <Skeleton key={row} variant="rectangular" height={44} borderRadius={1} />
235
+ ))}
236
+ </Stack>
237
+ );
238
+ }
239
+
240
+ export interface FleetRosterProps {
241
+ units: readonly FleetUnit[];
242
+ copy: FleetMapCopy;
243
+ selectedId: string | null | undefined;
244
+ onSelect: (id: string) => void;
245
+ laggingAfterSeconds: number;
246
+ staleAfterSeconds: number;
247
+ loading: boolean;
248
+ testId: string;
249
+ onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;
250
+ }
251
+
252
+ export function FleetRoster({
253
+ units,
254
+ copy,
255
+ selectedId,
256
+ onSelect,
257
+ laggingAfterSeconds,
258
+ staleAfterSeconds,
259
+ loading,
260
+ testId,
261
+ onKeyDown,
262
+ }: FleetRosterProps): React.JSX.Element {
263
+ const theme = useTheme();
264
+ // Generated, not derived from `dataTestId`: two boards on one page filtered
265
+ // from the same fleet would otherwise emit duplicate DOM ids and an ambiguous
266
+ // `aria-activedescendant`. Same reason the heading uses one.
267
+ const rowIdPrefix = React.useId();
268
+ const optionId = (id: string): string => `${rowIdPrefix}-${id}`;
269
+
270
+ // The selection is CONTROLLED, so it can name a unit that has since dropped
271
+ // out of the freshness window — a courier ending their shift mid-poll. The
272
+ // attribute must then be absent rather than pointing at an element that no
273
+ // longer renders, which announces nothing and fails an axe audit. `mapCentre`
274
+ // and `nextSelection` both handle the same case; this is the third place.
275
+ const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;
276
+
277
+ // Only when there is nothing to show yet. Unmounting a populated listbox on
278
+ // every poll destroys the focus inside it, so a dispatcher arrowing through
279
+ // the roster is thrown back to the top of the page each time the data
280
+ // refreshes — and the rows they were reading vanish and return.
281
+ if (loading && units.length === 0) return <FirstLoad testId={testId} />;
282
+
283
+ return (
284
+ <Box
285
+ role="listbox"
286
+ // A single tab stop with arrow keys inside, which is the listbox pattern:
287
+ // a dispatcher tabbing past a fleet of thirty should not have to press it
288
+ // thirty times to reach the map.
289
+ tabIndex={0}
290
+ aria-label={copy.rosterLabel}
291
+ aria-activedescendant={active ? optionId(active) : undefined}
292
+ data-testid={`${testId}-roster`}
293
+ onKeyDown={onKeyDown}
294
+ sx={{
295
+ display: 'flex',
296
+ flexDirection: 'column',
297
+ gap: theme.spacing(0.5),
298
+ overflowY: 'auto',
299
+ minWidth: 0,
300
+ '&:focus-visible': {
301
+ outline: `2px solid ${theme.palette.primary.main}`,
302
+ outlineOffset: 2,
303
+ },
304
+ }}
305
+ >
306
+ {units.map((unit, index) => (
307
+ <FleetRow
308
+ key={unit.id}
309
+ unit={unit}
310
+ copy={copy}
311
+ freshness={freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds)}
312
+ selected={unit.id === active}
313
+ onSelect={onSelect}
314
+ optionId={optionId(unit.id)}
315
+ position={index}
316
+ testId={`${testId}-${unit.id}`}
317
+ />
318
+ ))}
319
+ </Box>
320
+ );
321
+ }
@@ -0,0 +1,9 @@
1
+ export { FleetMap } from './FleetMap';
2
+ export { freshnessOf, mapCentre, nextSelection, rosterOrder } from './FleetMap.helpers';
3
+ export type { LatLng } from './FleetMap.helpers';
4
+ export type {
5
+ FleetFreshness,
6
+ FleetMapCopy,
7
+ FleetMapProps,
8
+ FleetUnit,
9
+ } from './FleetMap.types';
@@ -0,0 +1,79 @@
1
+ # FleetMap Test Status Tracking
2
+
3
+ ## Test Files Status
4
+
5
+ - [x] `FleetMap.test.stories.tsx` created
6
+ - [x] `__tests__/fleet-map-helpers.test.ts` created — the four pure decisions,
7
+ at their boundaries, where a story is expensive to stage and an
8
+ off-by-one reads identically on screen
9
+ - [x] `__tests__/fleet-map-hook.test.ts` created — the two decisions the DOM
10
+ cannot show: `centre`'s IDENTITY across a poll, and who owns the
11
+ selection across a re-render
12
+ - [x] `__tests__/fleet-map-guards.test.tsx` created — the behaviours the review
13
+ rounds added guards for, in the suite CI actually runs (`test-storybook`
14
+ is deliberately not wired into this repo's CI)
15
+ - [x] `__tests__/fleet-map-theme.test.tsx` created — the row and its first-load
16
+ skeleton under two host themes, because a radius that looks right on the
17
+ default one is not evidence in a package built to be re-themed
18
+ - [x] All applicable test categories implemented
19
+
20
+ ## Storybook Tests Status
21
+
22
+ ### Test Results
23
+
24
+ | Test Name | Status | Pass/Fail | Notes |
25
+ | --- | --- | --- | --- |
26
+ | Basic Interaction | Running | PASS | rows render, roster ordered freshest first |
27
+ | Freshness | Running | PASS | three states, words not colour, caller formats |
28
+ | Thresholds are props | Running | PASS | same fleet reads differently on tighter bounds |
29
+ | Selection | Running | PASS | click reports, `aria-selected` on one row only |
30
+ | Keyboard Navigation | Running | PASS | one tab stop, arrows move and wrap |
31
+ | Screen Reader | Running | PASS | region, named listbox, map named not hidden |
32
+ | Empty State | Running | PASS | empty state renders, no map canvas |
33
+ | Loading State | Running | PASS | busy, skeletons, NOT the empty state, and silent |
34
+ | Edge Cases | Running | PASS | one unit, long name, no badge, zero seconds |
35
+ | Active Descendant | Running | PASS | points at a row that exists, id is generated |
36
+ | Stale Selection | Running | PASS | a selection that left the fleet dangles nothing |
37
+ | Loading Announcement | Running | PASS | `role="status"` carries `copy.loading` |
38
+ | Loading Keeps Roster | Running | PASS | a poll over a populated roster keeps the listbox |
39
+ | Uncontrolled Selection | Running | PASS | works with neither selection prop passed |
40
+ | Controlled Without Handler | Running | PASS | arrows left un-prevented for the page |
41
+ | Idle Announcement Region | Running | PASS | the live region exists, and is empty, while idle |
42
+
43
+ Legend: Pending | Running | PASS | FAIL
44
+
45
+ Not implemented, and why: **Form Interaction** — the component has no form.
46
+ **Focus Management** — covered inside Keyboard Navigation, since the listbox's
47
+ single tab stop IS its focus contract. **Performance** — the roster is a short
48
+ list by construction (a fleet is people, not rows), so a render benchmark would
49
+ measure the fixture rather than the component.
50
+
51
+ ## Static Stories Status
52
+
53
+ - [x] Default story
54
+ - [x] Empty state
55
+ - [x] Loading state
56
+ - [x] One unit
57
+ - [x] All stale
58
+ - [x] Tight thresholds
59
+ - [x] Long names / no accuracy
60
+ - [x] Selectable (controlled)
61
+ - [x] Compact height
62
+
63
+ ## Lint Status
64
+
65
+ - [x] No lint errors
66
+ - [x] No warnings
67
+ - [x] Clean under `eslint.flakiness.config.mjs`
68
+
69
+ ## TypeCheck Status
70
+
71
+ - [x] No type errors
72
+ - [x] All props properly typed, no `any`
73
+
74
+ ## Overall Component Status
75
+
76
+ - [x] Lint clean
77
+ - [x] TypeCheck clean
78
+ - [x] Stories working
79
+ - [x] Unit tests passing (35: 16 helpers + 8 hook + 9 guards + 2 theme)
@@ -0,0 +1,50 @@
1
+ # FleetMap
2
+
3
+ Where a set of tracked units is right now: a map beside the roster that reads
4
+ it. Product-free — it draws labelled dots with a freshness, and every word plus
5
+ the two formatters arrive through `copy`. Built for a delivery fleet and
6
+ deliberately not named after one.
7
+
8
+ ## Props
9
+
10
+ | prop | effect |
11
+ | --- | --- |
12
+ | `units` | who is reporting; empty renders the empty state rather than an empty map |
13
+ | `copy` | every word, and the `lastSeen` / `accuracy` formatters |
14
+ | `selectedId` | controlled selection; the map centres on it |
15
+ | `onSelect` | fired by a row click, each arrow-key move, and a pin click (mouse only — the pin is not focusable) |
16
+ | `laggingAfterSeconds` | when a unit stops reading as `live` |
17
+ | `staleAfterSeconds` | when it stops reading as `lagging` |
18
+ | `height` | the map's height |
19
+ | `loading` | first-load skeletons, map and roster `aria-busy` |
20
+ | `className` | on the panel root |
21
+ | `dataTestId` | root TEST id; DOM ids are generated separately |
22
+
23
+ ## Lint
24
+
25
+ Clean, including the flakiness config.
26
+
27
+ ## Type Errors
28
+
29
+ None.
30
+
31
+ ## Testing Scenarios
32
+
33
+ Freshness at both thresholds and at their collapse; the centroid fallback and
34
+ the Atlantic-null for an empty fleet; roster order and its tie-break; selection
35
+ wrapping at both ends and a selection that has left the fleet; the empty state
36
+ against the loading state, which are opposite messages.
37
+
38
+ ## Storybook Tests List
39
+
40
+ `BasicInteraction`, `FreshnessTest`, `ThresholdsAreProps`, `SelectionTest`,
41
+ `KeyboardNavigationTest`, `ControlledWithoutHandlerTest`, `ScreenReaderTest`,
42
+ `ActiveDescendantTest`, `StaleSelectionTest`, `EmptyStateTest`,
43
+ `LoadingStateTest`, `IdleAnnouncementRegionTest`, `LoadingAnnouncementTest`,
44
+ `LoadingKeepsThePopulatedRosterTest`, `UncontrolledSelectionTest`,
45
+ `EdgeCaseTest`.
46
+
47
+ ## Current
48
+
49
+ Shipped. Its first consumer is an adopter's courier-tracking panel, which
50
+ composes it with its own transport and its own words.
@@ -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';
@@ -61,13 +61,19 @@ escape hatch for the same button in a context where the action is harmless.
61
61
  Refs are not forwarded (the HOC renders trigger + popup as a fragment, so there
62
62
  is no single node to hand back). Use `<ConfirmAction>` where a ref is needed.
63
63
 
64
- ### `ConfirmButton` — the HOC, pre-applied
64
+ ### `createConfirmButton` — the HOC, pre-applied
65
65
 
66
- `withConfirmation(Button)` with the shared wording already in place. Use it when
67
- you just want a guarded button and have no reason to build your own wrapper.
66
+ `withConfirmation(Button)`, wrapped up for you. Use it when you just want a
67
+ guarded button and have no reason to build your own wrapper.
68
+
69
+ A FACTORY rather than a ready-made component, because the wording it bakes in is
70
+ the caller's: it takes the host's `ConfirmActionCopy` and its error sentence, and
71
+ returns the button. Build it once at module scope and use it like any other.
68
72
 
69
73
  ```tsx
70
- import { ConfirmButton } from '@12-apps/ui/feedback/ConfirmAction';
74
+ import { createConfirmButton } from '@12-apps/ui/feedback/ConfirmAction';
75
+
76
+ const ConfirmButton = createConfirmButton(PT_BR_CONFIRM_ACTION_COPY, 'Algo deu errado.');
71
77
 
72
78
  <ConfirmButton
73
79
  color="danger"