@12-apps/ui 6.23.0 → 6.24.1

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 (208) hide show
  1. package/NATIVE.md +2 -1
  2. package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
  3. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  4. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  5. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  6. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  7. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  8. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  9. package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
  10. package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
  11. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +6 -4
  12. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +24 -24
  13. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +30 -30
  14. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
  15. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
  16. package/dist/_internal/components/data-display/DataViews/base-list-card.js +6 -6
  17. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
  18. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +4 -4
  19. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
  20. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +21 -21
  21. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
  23. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +5 -5
  24. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +3 -3
  25. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  26. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
  27. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +2 -2
  28. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
  29. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  30. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  31. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +4 -3
  32. package/dist/_internal/components/data-display/FleetMap/FleetMap.base.js +1 -0
  33. package/dist/_internal/components/data-display/FleetMap/FleetMap.base.js.map +1 -0
  34. package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js +1 -1
  35. package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js +2 -2
  36. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +6 -5
  37. package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.js +20 -0
  38. package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.js.map +1 -0
  39. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -2
  40. package/dist/_internal/components/data-display/index.js +26 -25
  41. package/dist/_internal/components/index.js +26 -25
  42. package/dist/_internal/platform/aria.js.map +1 -1
  43. package/dist/_internal/user-avatar/user-avatar.js +4 -4
  44. package/dist/charts.js +10 -10
  45. package/dist/{chunk-WGRS4PGY.js → chunk-2C47DEVU.js} +4 -4
  46. package/dist/{chunk-KHWCX4LI.js → chunk-6LGWJFQK.js} +2 -2
  47. package/dist/{chunk-XSF6AXEU.js → chunk-6RZDDUSM.js} +2 -2
  48. package/dist/{chunk-3FLVIVOK.js → chunk-BHIGHSXA.js} +2 -2
  49. package/dist/{chunk-VNNG46TS.js → chunk-BPLFM2GL.js} +6 -6
  50. package/dist/chunk-BTQZ3EX3.js +45 -0
  51. package/dist/chunk-BTQZ3EX3.js.map +1 -0
  52. package/dist/{chunk-LYSSO6WC.js → chunk-CZPU5TW3.js} +4 -4
  53. package/dist/{chunk-BZTFPSWT.js → chunk-DFLTUI7W.js} +7 -7
  54. package/dist/{chunk-URXT5TOY.js → chunk-E46PG577.js} +4 -4
  55. package/dist/{chunk-X5MPHXG5.js → chunk-EZ5Z5UFI.js} +9 -7
  56. package/dist/{chunk-X5MPHXG5.js.map → chunk-EZ5Z5UFI.js.map} +1 -1
  57. package/dist/{chunk-DRHIIUDO.js → chunk-FPWB5ILF.js} +5 -5
  58. package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
  59. package/dist/{chunk-MQNKRIGC.js → chunk-HMV4QMXS.js} +25 -11
  60. package/dist/chunk-HMV4QMXS.js.map +1 -0
  61. package/dist/{chunk-N2TUX4A5.js → chunk-I3E2QHTH.js} +3 -3
  62. package/dist/{chunk-4XZXLB4I.js → chunk-JQ45NDBS.js} +3 -3
  63. package/dist/{chunk-I7HYGIEJ.js → chunk-JUHUKZGU.js} +2 -2
  64. package/dist/{chunk-TWQYDKCA.js → chunk-JZXWCEH5.js} +12 -9
  65. package/dist/chunk-JZXWCEH5.js.map +1 -0
  66. package/dist/{chunk-WQA4LIIK.js → chunk-KT6HWAEN.js} +4 -4
  67. package/dist/{chunk-2UGJIKVA.js → chunk-MZQTHSLN.js} +3 -3
  68. package/dist/{chunk-4SQFO4GW.js → chunk-NA7MIEG6.js} +7 -7
  69. package/dist/{chunk-MYGNIFZC.js → chunk-O4VCZTK4.js} +2 -2
  70. package/dist/{chunk-LS4FMSHY.js → chunk-OAYX4XN7.js} +4 -4
  71. package/dist/{chunk-Y5UCOBQN.js → chunk-OGGHD64H.js} +4 -4
  72. package/dist/{chunk-CBTY36TU.js → chunk-OH3YGJT5.js} +2 -2
  73. package/dist/{chunk-VON4BFK4.js → chunk-PN5CQKA2.js} +2 -2
  74. package/dist/{chunk-CF3FAAPC.js → chunk-RP5FK3SO.js} +2 -2
  75. package/dist/{chunk-L4U23SBX.js → chunk-TSYWI3NP.js} +13 -13
  76. package/dist/{chunk-YQ6TNHAC.js → chunk-TTLI6PF7.js} +5 -5
  77. package/dist/{chunk-OIKQO73C.js → chunk-TX5V42AY.js} +5 -5
  78. package/dist/{chunk-AJGYHDA5.js → chunk-U2YJCNRU.js} +4 -4
  79. package/dist/{chunk-W7Y6RA6W.js → chunk-WR5JFDQ5.js} +4 -4
  80. package/dist/{chunk-ACFGEZ4Q.js → chunk-XO753WHD.js} +3 -3
  81. package/dist/{chunk-5V4UPOWK.js → chunk-XPMGFAJ3.js} +1 -1
  82. package/dist/chunk-XPMGFAJ3.js.map +1 -0
  83. package/dist/{chunk-AEGXHZQT.js → chunk-YW5T6KZ5.js} +7 -7
  84. package/dist/{chunk-F7VBGS4C.js → chunk-ZCPSND5Y.js} +2 -2
  85. package/dist/chunk-ZCPSND5Y.js.map +1 -0
  86. package/dist/{chunk-4LRFGB3K.js → chunk-ZRPGVHTR.js} +2 -2
  87. package/dist/data-display/Avatar.js +3 -3
  88. package/dist/data-display/Badge.js +2 -2
  89. package/dist/data-display/CardKit.js +10 -10
  90. package/dist/data-display/Chart.js +10 -10
  91. package/dist/data-display/Chip.js +3 -3
  92. package/dist/data-display/DataGrid.js +2 -2
  93. package/dist/data-display/DataViews.js +48 -48
  94. package/dist/data-display/FleetMap.js +6 -5
  95. package/dist/native/chunks/{chunk-T6BJPP3E.js → chunk-DN73KYIZ.js} +1 -1
  96. package/dist/native/chunks/chunk-DN73KYIZ.js.map +1 -0
  97. package/dist/native/chunks/chunk-GW7TQ7HO.js +215 -0
  98. package/dist/native/chunks/chunk-GW7TQ7HO.js.map +1 -0
  99. package/dist/native/chunks/chunk-MJVSQXOD.js +9 -0
  100. package/dist/native/chunks/chunk-MJVSQXOD.js.map +1 -0
  101. package/dist/native/chunks/chunk-ZAQ3AZJM.js +292 -0
  102. package/dist/native/chunks/chunk-ZAQ3AZJM.js.map +1 -0
  103. package/dist/native/data-display/Alert.js +4 -4
  104. package/dist/native/data-display/Avatar.js +3 -3
  105. package/dist/native/data-display/Badge.js +4 -4
  106. package/dist/native/data-display/Chip.js +3 -5
  107. package/dist/native/data-display/Chip.js.map +1 -1
  108. package/dist/native/data-display/EmptyState.js +9 -286
  109. package/dist/native/data-display/EmptyState.js.map +1 -1
  110. package/dist/native/data-display/ErrorState.js +6 -6
  111. package/dist/native/data-display/FleetMap.js +498 -0
  112. package/dist/native/data-display/FleetMap.js.map +1 -0
  113. package/dist/native/data-display/LoadingState.js +3 -3
  114. package/dist/native/feedback/Dialog.js +3 -3
  115. package/dist/native/form/Checkbox.js +1 -1
  116. package/dist/native/form/Input.js +1 -1
  117. package/dist/native/form/Select.js +1 -1
  118. package/dist/native/form/Switch.js +1 -1
  119. package/dist/native/layout/Card.js +3 -3
  120. package/dist/native/layout/Skeleton.js +6 -209
  121. package/dist/native/layout/Skeleton.js.map +1 -1
  122. package/dist/types/components/data-display/DataGrid/DataGrid.d.ts +11 -0
  123. package/dist/types/components/data-display/DataGrid/DataGrid.d.ts.map +1 -1
  124. package/dist/types/components/data-display/FleetMap/FleetMap.base.d.ts +141 -0
  125. package/dist/types/components/data-display/FleetMap/FleetMap.base.d.ts.map +1 -0
  126. package/dist/types/components/data-display/FleetMap/FleetMap.d.ts.map +1 -1
  127. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts +1 -1
  128. package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -1
  129. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts +20 -3
  130. package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -1
  131. package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
  132. package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
  133. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts +13 -113
  134. package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts.map +1 -1
  135. package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts.map +1 -1
  136. package/dist/types/platform/aria.d.ts +13 -0
  137. package/dist/types/platform/aria.d.ts.map +1 -1
  138. package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts +141 -0
  139. package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts.map +1 -0
  140. package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
  141. package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
  142. package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts +71 -0
  143. package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
  144. package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
  145. package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
  146. package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts +30 -0
  147. package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts.map +1 -0
  148. package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts +36 -0
  149. package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts.map +1 -0
  150. package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts +17 -0
  151. package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts.map +1 -0
  152. package/dist/types-native/components/data-display/FleetMap/index.native.d.ts +4 -0
  153. package/dist/types-native/components/data-display/FleetMap/index.native.d.ts.map +1 -0
  154. package/dist/types-native/platform/aria.d.ts +13 -0
  155. package/dist/types-native/platform/aria.d.ts.map +1 -1
  156. package/dist/user-avatar.js +4 -4
  157. package/package.json +5 -1
  158. package/src/components/data-display/DataGrid/DataGrid.tsx +5 -1
  159. package/src/components/data-display/FleetMap/FleetMap.base.ts +144 -0
  160. package/src/components/data-display/FleetMap/FleetMap.helpers.ts +1 -1
  161. package/src/components/data-display/FleetMap/FleetMap.hooks.ts +23 -4
  162. package/src/components/data-display/FleetMap/FleetMap.md +15 -8
  163. package/src/components/data-display/FleetMap/FleetMap.metrics.ts +81 -0
  164. package/src/components/data-display/FleetMap/FleetMap.native.tsx +185 -0
  165. package/src/components/data-display/FleetMap/FleetMap.tsx +8 -14
  166. package/src/components/data-display/FleetMap/FleetMap.types.native.ts +44 -0
  167. package/src/components/data-display/FleetMap/FleetMap.types.ts +19 -114
  168. package/src/components/data-display/FleetMap/FleetRoster.native.tsx +382 -0
  169. package/src/components/data-display/FleetMap/FleetRoster.tsx +17 -11
  170. package/src/components/data-display/FleetMap/NATIVE-NOTES.md +14 -0
  171. package/src/components/data-display/FleetMap/index.native.ts +10 -0
  172. package/src/components/data-display/FleetMap/tests.md +6 -1
  173. package/src/platform/aria.ts +13 -0
  174. package/dist/chunk-5V4UPOWK.js.map +0 -1
  175. package/dist/chunk-F7VBGS4C.js.map +0 -1
  176. package/dist/chunk-MQNKRIGC.js.map +0 -1
  177. package/dist/chunk-TWQYDKCA.js.map +0 -1
  178. package/dist/native/chunks/chunk-T6BJPP3E.js.map +0 -1
  179. /package/dist/{chunk-WGRS4PGY.js.map → chunk-2C47DEVU.js.map} +0 -0
  180. /package/dist/{chunk-KHWCX4LI.js.map → chunk-6LGWJFQK.js.map} +0 -0
  181. /package/dist/{chunk-XSF6AXEU.js.map → chunk-6RZDDUSM.js.map} +0 -0
  182. /package/dist/{chunk-3FLVIVOK.js.map → chunk-BHIGHSXA.js.map} +0 -0
  183. /package/dist/{chunk-VNNG46TS.js.map → chunk-BPLFM2GL.js.map} +0 -0
  184. /package/dist/{chunk-LYSSO6WC.js.map → chunk-CZPU5TW3.js.map} +0 -0
  185. /package/dist/{chunk-BZTFPSWT.js.map → chunk-DFLTUI7W.js.map} +0 -0
  186. /package/dist/{chunk-URXT5TOY.js.map → chunk-E46PG577.js.map} +0 -0
  187. /package/dist/{chunk-DRHIIUDO.js.map → chunk-FPWB5ILF.js.map} +0 -0
  188. /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
  189. /package/dist/{chunk-N2TUX4A5.js.map → chunk-I3E2QHTH.js.map} +0 -0
  190. /package/dist/{chunk-4XZXLB4I.js.map → chunk-JQ45NDBS.js.map} +0 -0
  191. /package/dist/{chunk-I7HYGIEJ.js.map → chunk-JUHUKZGU.js.map} +0 -0
  192. /package/dist/{chunk-WQA4LIIK.js.map → chunk-KT6HWAEN.js.map} +0 -0
  193. /package/dist/{chunk-2UGJIKVA.js.map → chunk-MZQTHSLN.js.map} +0 -0
  194. /package/dist/{chunk-4SQFO4GW.js.map → chunk-NA7MIEG6.js.map} +0 -0
  195. /package/dist/{chunk-MYGNIFZC.js.map → chunk-O4VCZTK4.js.map} +0 -0
  196. /package/dist/{chunk-LS4FMSHY.js.map → chunk-OAYX4XN7.js.map} +0 -0
  197. /package/dist/{chunk-Y5UCOBQN.js.map → chunk-OGGHD64H.js.map} +0 -0
  198. /package/dist/{chunk-CBTY36TU.js.map → chunk-OH3YGJT5.js.map} +0 -0
  199. /package/dist/{chunk-VON4BFK4.js.map → chunk-PN5CQKA2.js.map} +0 -0
  200. /package/dist/{chunk-CF3FAAPC.js.map → chunk-RP5FK3SO.js.map} +0 -0
  201. /package/dist/{chunk-L4U23SBX.js.map → chunk-TSYWI3NP.js.map} +0 -0
  202. /package/dist/{chunk-YQ6TNHAC.js.map → chunk-TTLI6PF7.js.map} +0 -0
  203. /package/dist/{chunk-OIKQO73C.js.map → chunk-TX5V42AY.js.map} +0 -0
  204. /package/dist/{chunk-AJGYHDA5.js.map → chunk-U2YJCNRU.js.map} +0 -0
  205. /package/dist/{chunk-W7Y6RA6W.js.map → chunk-WR5JFDQ5.js.map} +0 -0
  206. /package/dist/{chunk-ACFGEZ4Q.js.map → chunk-XO753WHD.js.map} +0 -0
  207. /package/dist/{chunk-AEGXHZQT.js.map → chunk-YW5T6KZ5.js.map} +0 -0
  208. /package/dist/{chunk-4LRFGB3K.js.map → chunk-ZRPGVHTR.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MoreGroup,
3
3
  fieldClearing
4
- } from "./chunk-MYGNIFZC.js";
4
+ } from "./chunk-O4VCZTK4.js";
5
5
  import {
6
6
  useDataViewsCopy
7
7
  } from "./chunk-KHG57NAE.js";
@@ -180,4 +180,4 @@ function MoreFilters({
180
180
  export {
181
181
  MoreFilters
182
182
  };
183
- //# sourceMappingURL=chunk-KHWCX4LI.js.map
183
+ //# sourceMappingURL=chunk-6LGWJFQK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GridToolbar
3
- } from "./chunk-WGRS4PGY.js";
3
+ } from "./chunk-2C47DEVU.js";
4
4
 
5
5
  // src/components/data-display/DataViews/data-views-shell-toolbar.tsx
6
6
  import { jsx } from "react/jsx-runtime";
@@ -64,4 +64,4 @@ function ShellToolbar({
64
64
  export {
65
65
  ShellToolbar
66
66
  };
67
- //# sourceMappingURL=chunk-XSF6AXEU.js.map
67
+ //# sourceMappingURL=chunk-6RZDDUSM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RAIL_GAP_PX
3
- } from "./chunk-LYSSO6WC.js";
3
+ } from "./chunk-CZPU5TW3.js";
4
4
  import {
5
5
  DescriptionItem
6
6
  } from "./chunk-M4LQRQFL.js";
@@ -222,4 +222,4 @@ export {
222
222
  ListCardActions,
223
223
  ListCardTail
224
224
  };
225
- //# sourceMappingURL=chunk-3FLVIVOK.js.map
225
+ //# sourceMappingURL=chunk-BHIGHSXA.js.map
@@ -4,12 +4,9 @@ import {
4
4
  import {
5
5
  SelectAllStrip
6
6
  } from "./chunk-XKV5ZIBG.js";
7
- import {
8
- cardGridTracks
9
- } from "./chunk-U2ZDN2AL.js";
10
7
  import {
11
8
  ListCardGroup
12
- } from "./chunk-LYSSO6WC.js";
9
+ } from "./chunk-CZPU5TW3.js";
13
10
  import {
14
11
  DENSITY_BOARD_SCALE,
15
12
  DENSITY_ROW_PADDING,
@@ -17,12 +14,15 @@ import {
17
14
  cardTargetWidthFor,
18
15
  useDataViewsLayout
19
16
  } from "./chunk-ZPIMPOHV.js";
17
+ import {
18
+ cardGridTracks
19
+ } from "./chunk-U2ZDN2AL.js";
20
20
  import {
21
21
  useDataViewsCopy
22
22
  } from "./chunk-KHG57NAE.js";
23
23
  import {
24
24
  DataGrid
25
- } from "./chunk-X5MPHXG5.js";
25
+ } from "./chunk-EZ5Z5UFI.js";
26
26
  import {
27
27
  default as default2
28
28
  } from "./chunk-6DPAWXZ3.js";
@@ -264,4 +264,4 @@ function GridMain(props) {
264
264
  export {
265
265
  GridMain
266
266
  };
267
- //# sourceMappingURL=chunk-VNNG46TS.js.map
267
+ //# sourceMappingURL=chunk-BPLFM2GL.js.map
@@ -0,0 +1,45 @@
1
+ // src/components/data-display/FleetMap/FleetMap.metrics.ts
2
+ var FLEET_PANEL = {
3
+ /** Between the heading, the status region and the body. */
4
+ gapUnits: 1.5
5
+ };
6
+ var FLEET_ROSTER = {
7
+ /** Between rows. */
8
+ gapUnits: 0.5,
9
+ /** `:focus-visible` ring on the web; a device has no focus ring to draw. */
10
+ focusRingWidth: 2,
11
+ focusRingOffset: 2
12
+ };
13
+ var FLEET_ROW = {
14
+ /** Between the dot, the text block and the badge. */
15
+ gapUnits: 1.5,
16
+ /** `theme.spacing(y, x)`. */
17
+ paddingYUnits: 1,
18
+ paddingXUnits: 1.5,
19
+ /** A MULTIPLE of `theme.shape.borderRadius` — see the note above. */
20
+ radiusMultiple: 1
21
+ };
22
+ var FLEET_DOT = {
23
+ size: 10
24
+ };
25
+ var FLEET_SKELETON = {
26
+ /** Three bars, the height of a row with its padding. */
27
+ rows: 3,
28
+ height: 44,
29
+ /** A MULTIPLE, for the same reason the row's is. */
30
+ radiusMultiple: 1,
31
+ gapUnits: 1
32
+ };
33
+ var FLEET_DEFAULT_LAGGING_AFTER_SECONDS = 90;
34
+ var FLEET_DEFAULT_STALE_AFTER_SECONDS = 300;
35
+
36
+ export {
37
+ FLEET_PANEL,
38
+ FLEET_ROSTER,
39
+ FLEET_ROW,
40
+ FLEET_DOT,
41
+ FLEET_SKELETON,
42
+ FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
43
+ FLEET_DEFAULT_STALE_AFTER_SECONDS
44
+ };
45
+ //# sourceMappingURL=chunk-BTQZ3EX3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/FleetMap/FleetMap.metrics.ts"],"sourcesContent":["/**\n * THE NUMBERS BOTH `FleetMap` RENDERERS DRAW WITH.\n *\n * `FleetRoster.tsx` / `FleetMap.tsx` (web, MUI `sx`) and `FleetRoster.native.tsx`\n * / `FleetMap.native.tsx` (React Native) read this one table. The web hands the\n * spacing UNITS to `theme.spacing()` and the radius MULTIPLES to `sx`; native\n * multiplies the units by the theme's own spacing step and the multiples by\n * `shape.borderRadius`.\n *\n * Nothing here imports a renderer, a theme or a colour: a freshness dot's\n * COLOUR is the theme's (`success.main`, `warning.main`, `text.disabled`), and\n * the two sides reach the same palette through different doors.\n *\n * ## Why the radii are MULTIPLES and never pixels\n *\n * MUI's `sx` reads a bare number for `borderRadius` as a multiple of\n * `theme.shape.borderRadius`, so a value that already had the theme's radius\n * divided out of it is applied twice. Measured: `theme.shape.borderRadius / 4`\n * drew 4px on the default theme — which is why it looked right — and 36px on a\n * host that sets its own radius to 12. In a package whose whole premise is\n * being re-themed, only the multiple is portable, and it is the multiple that\n * both renderers store here.\n */\n\n/** `theme.spacing(n)` for the panel's own stack. */\nexport const FLEET_PANEL = {\n /** Between the heading, the status region and the body. */\n gapUnits: 1.5,\n} as const;\n\n/** The roster list box. */\nexport const FLEET_ROSTER = {\n /** Between rows. */\n gapUnits: 0.5,\n /** `:focus-visible` ring on the web; a device has no focus ring to draw. */\n focusRingWidth: 2,\n focusRingOffset: 2,\n} as const;\n\n/** One roster row. */\nexport const FLEET_ROW = {\n /** Between the dot, the text block and the badge. */\n gapUnits: 1.5,\n /** `theme.spacing(y, x)`. */\n paddingYUnits: 1,\n paddingXUnits: 1.5,\n /** A MULTIPLE of `theme.shape.borderRadius` — see the note above. */\n radiusMultiple: 1,\n} as const;\n\n/**\n * The freshness dot.\n *\n * A perfect circle, so the radius is half the box on both sides rather than\n * the web's `50%`: React Native resolves a percentage radius against the box\n * it is given, and a square box makes the two spellings agree.\n */\nexport const FLEET_DOT = {\n size: 10,\n} as const;\n\n/** What stands in for the roster before any unit has landed. */\nexport const FLEET_SKELETON = {\n /** Three bars, the height of a row with its padding. */\n rows: 3,\n height: 44,\n /** A MULTIPLE, for the same reason the row's is. */\n radiusMultiple: 1,\n gapUnits: 1,\n} as const;\n\n/**\n * How long a fix stays `live`, and then `lagging`, when the caller says nothing.\n *\n * Ninety seconds and five minutes: sized for a phone reporting every twenty\n * seconds, which is the densest cadence a battery tolerates all day. They are\n * DEFAULTS and not a rule — a fleet on five-minute trackers passes its own, and\n * the props exist so it can.\n */\nexport const FLEET_DEFAULT_LAGGING_AFTER_SECONDS = 90;\nexport const FLEET_DEFAULT_STALE_AFTER_SECONDS = 300;\n"],"mappings":";AAyBO,IAAM,cAAc;AAAA;AAAA,EAEzB,UAAU;AACZ;AAGO,IAAM,eAAe;AAAA;AAAA,EAE1B,UAAU;AAAA;AAAA,EAEV,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAGO,IAAM,YAAY;AAAA;AAAA,EAEvB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA,EACf,eAAe;AAAA;AAAA,EAEf,gBAAgB;AAClB;AASO,IAAM,YAAY;AAAA,EACvB,MAAM;AACR;AAGO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAER,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAUO,IAAM,sCAAsC;AAC5C,IAAM,oCAAoC;","names":[]}
@@ -1,10 +1,10 @@
1
- import {
2
- DENSITY_ROW_PADDING
3
- } from "./chunk-ZPIMPOHV.js";
4
1
  import {
5
2
  CellConfigProvider,
6
3
  cellTracks
7
4
  } from "./chunk-6VP2L3DJ.js";
5
+ import {
6
+ DENSITY_ROW_PADDING
7
+ } from "./chunk-ZPIMPOHV.js";
8
8
  import {
9
9
  default as default2
10
10
  } from "./chunk-6DPAWXZ3.js";
@@ -129,4 +129,4 @@ export {
129
129
  cellRailCount,
130
130
  ListCardGroup
131
131
  };
132
- //# sourceMappingURL=chunk-LYSSO6WC.js.map
132
+ //# sourceMappingURL=chunk-CZPU5TW3.js.map
@@ -1,9 +1,3 @@
1
- import {
2
- RangePresets
3
- } from "./chunk-F4RR4666.js";
4
- import {
5
- presetsFor
6
- } from "./chunk-CBOB5AV6.js";
7
1
  import {
8
2
  NumberBoundInput
9
3
  } from "./chunk-FV36LFPX.js";
@@ -13,6 +7,12 @@ import {
13
7
  numericRange,
14
8
  rangeChipLabel
15
9
  } from "./chunk-GCZJH4XL.js";
10
+ import {
11
+ RangePresets
12
+ } from "./chunk-F4RR4666.js";
13
+ import {
14
+ presetsFor
15
+ } from "./chunk-CBOB5AV6.js";
16
16
  import {
17
17
  useDataViewsCopy
18
18
  } from "./chunk-KHG57NAE.js";
@@ -279,4 +279,4 @@ export {
279
279
  RangePill,
280
280
  PanelRangeField
281
281
  };
282
- //# sourceMappingURL=chunk-BZTFPSWT.js.map
282
+ //# sourceMappingURL=chunk-DFLTUI7W.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- chipKeyAction
3
- } from "./chunk-BF4FYOAR.js";
4
1
  import {
5
2
  CHIP_SIZES,
6
3
  CHIP_TRANSITION_EASING,
@@ -8,6 +5,9 @@ import {
8
5
  HOVER_LIFT_PX,
9
6
  HOVER_SHADOW
10
7
  } from "./chunk-KU6VHNRV.js";
8
+ import {
9
+ chipKeyAction
10
+ } from "./chunk-BF4FYOAR.js";
11
11
 
12
12
  // src/components/data-display/Chip/Chip.styles.tsx
13
13
  import Avatar from "@mui/material/Avatar/index.js";
@@ -75,4 +75,4 @@ export {
75
75
  chipStyles,
76
76
  iconWithTestId
77
77
  };
78
- //# sourceMappingURL=chunk-URXT5TOY.js.map
78
+ //# sourceMappingURL=chunk-E46PG577.js.map
@@ -1,3 +1,8 @@
1
+ import {
2
+ DataGridEmpty,
3
+ DataGridError,
4
+ DataGridLoading
5
+ } from "./chunk-5E3XZAED.js";
1
6
  import {
2
7
  useDataGridModel
3
8
  } from "./chunk-DLJGBJZW.js";
@@ -5,11 +10,6 @@ import {
5
10
  GridBody,
6
11
  GridHeader
7
12
  } from "./chunk-KZLLTOB2.js";
8
- import {
9
- DataGridEmpty,
10
- DataGridError,
11
- DataGridLoading
12
- } from "./chunk-5E3XZAED.js";
13
13
 
14
14
  // src/components/data-display/DataGrid/DataGrid.tsx
15
15
  import Paper from "@mui/material/Paper/index.js";
@@ -101,6 +101,7 @@ var GRID_ONLY_PROPS = [
101
101
  "loading",
102
102
  "error",
103
103
  "emptyState",
104
+ "emptyText",
104
105
  "onRequestData",
105
106
  "ariaLabel",
106
107
  "ariaDescription"
@@ -113,6 +114,7 @@ function omitGridProps(rest) {
113
114
  DataGrid.displayName = "DataGrid";
114
115
 
115
116
  export {
116
- DataGrid
117
+ DataGrid,
118
+ GRID_ONLY_PROPS
117
119
  };
118
- //# sourceMappingURL=chunk-X5MPHXG5.js.map
120
+ //# sourceMappingURL=chunk-EZ5Z5UFI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/data-display/DataGrid/DataGrid.tsx"],"sourcesContent":["/**\n * `DataGrid` — the shell.\n *\n * Everything that is not \"which of the four renders is this, and what wraps the\n * table\" lives beside it: the state in `DataGrid.model.ts`, the client-mode row\n * pipeline in `DataGrid.rows.ts`, the cells and rows in `DataGrid.cells.tsx`,\n * the head/body in `DataGrid.body.tsx`, and the loading/error/empty renders in\n * `DataGrid.states.tsx`.\n *\n * All FOUR renders carry the caller's `data-testid`. It used to be applied only\n * on the populated one, so a grid whose first paint had no rows could not be\n * found by a test at all — see `DataGrid.states.tsx` for the full story.\n */\nimport Paper from '@mui/material/Paper/index.js';\nimport Table from '@mui/material/Table/index.js';\nimport TableContainer from '@mui/material/TableContainer/index.js';\nimport type React from 'react';\n\nimport { GridBody, GridHeader } from './DataGrid.body';\nimport { useDataGridModel } from './DataGrid.model';\nimport { DataGridEmpty, DataGridError, DataGridLoading } from './DataGrid.states';\nimport type { DataGridProps } from './DataGrid.types';\n\n/**\n * The chrome every render needs, with the defaults resolved ONCE.\n *\n * Extracted from the component body because a dozen destructuring defaults are\n * a dozen branches: the gate counted them, correctly, as complexity the render\n * did not need to carry.\n */\nfunction resolveChrome<T extends Record<string, unknown>>(props: DataGridProps<T>): {\n dataAttrs: Record<string, unknown>;\n placeholder: {\n dataTestId?: string;\n ariaLabel: string;\n className?: string;\n style?: React.CSSProperties;\n htmlProps: React.HTMLAttributes<HTMLElement>;\n };\n} {\n const { className, style, 'data-testid': dataTestId, ...rest } = props;\n const stickyHeader = props.stickyHeader ?? true;\n return {\n dataAttrs: {\n 'data-ui': 'datagrid',\n 'data-density': props.density ?? 'comfortable',\n 'data-size-mode': props.sizeMode ?? 'auto',\n 'data-virtual-rows': props.virtualizeRows ?? true,\n 'data-virtual-cols': props.virtualizeColumns ?? false,\n 'data-sticky-header': stickyHeader,\n },\n placeholder: {\n dataTestId,\n ariaLabel: props.ariaLabel ?? 'Data grid',\n className,\n style,\n // Only the DOM-safe leftovers reach the element: every grid-specific prop\n // is named in `GRID_ONLY_PROPS`, so this cannot smuggle `rows` onto a div.\n htmlProps: omitGridProps(rest as Record<string, unknown>),\n },\n };\n}\n\nexport const DataGrid = <T extends Record<string, unknown> = Record<string, unknown>>(\n props: DataGridProps<T>,\n): React.JSX.Element => {\n const model = useDataGridModel(props);\n const { dataAttrs, placeholder } = resolveChrome(props);\n\n if (props.loading) return <DataGridLoading {...placeholder} />;\n if (props.error) return <DataGridError {...placeholder} error={props.error} />;\n if (model.processedRows.length === 0) {\n return <DataGridEmpty {...placeholder} emptyState={props.emptyState} emptyText={props.emptyText} />;\n }\n\n const leadingColumns = (props.selection?.mode ?? 'none') !== 'none' ? 1 : 0;\n const totalColumns =\n model.visibleColumns.length + leadingColumns + (props.expansion ? 1 : 0);\n const section = { model, props, totalColumns };\n\n return (\n <Paper\n ref={model.containerRef}\n {...dataAttrs}\n data-testid={placeholder.dataTestId}\n className={placeholder.className}\n style={placeholder.style}\n role=\"grid\"\n aria-label={placeholder.ariaLabel}\n aria-description={props.ariaDescription}\n aria-rowcount={model.processedRows.length + 1} // +1 for the header row\n aria-colcount={totalColumns}\n sx={{ height: '100%', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}\n {...placeholder.htmlProps}\n >\n <TableContainer\n sx={{ flex: 1, overflow: 'auto', position: 'relative' }}\n onScroll={model.onScroll}\n >\n <Table stickyHeader={props.stickyHeader ?? true}>\n <GridHeader {...section} />\n <GridBody {...section} />\n </Table>\n </TableContainer>\n </Paper>\n );\n};\n\n/**\n * The grid props that are NOT HTML attributes.\n *\n * `DataGridProps` extends `HTMLAttributes`, so the rest-spread carries the\n * grid's own configuration too. React would warn (or worse, serialize an array\n * of rows into an attribute) if any of it reached the DOM.\n */\nconst GRID_ONLY_PROPS = [\n 'rows',\n 'columns',\n 'getRowId',\n 'sizeMode',\n 'density',\n 'rowHeight',\n 'headerHeight',\n 'footerHeight',\n 'selection',\n 'pagination',\n 'sorting',\n 'filtering',\n 'expansion',\n 'editing',\n 'virtualizeRows',\n 'virtualizeColumns',\n 'stickyHeader',\n 'stickyFooter',\n 'loading',\n 'error',\n 'emptyState',\n 'onRequestData',\n 'ariaLabel',\n 'ariaDescription',\n] as const;\n\nfunction omitGridProps(rest: Record<string, unknown>): React.HTMLAttributes<HTMLElement> {\n const html: Record<string, unknown> = { ...rest };\n for (const key of GRID_ONLY_PROPS) delete html[key];\n return html as React.HTMLAttributes<HTMLElement>;\n}\n\nDataGrid.displayName = 'DataGrid';\n"],"mappings":";;;;;;;;;;;;;;AAaA,OAAO,WAAW;AAClB,OAAO,WAAW;AAClB,OAAO,oBAAoB;AAsDC,cA8BpB,YA9BoB;AAvC5B,SAAS,cAAiD,OASxD;AACA,QAAM,EAAE,WAAW,OAAO,eAAe,YAAY,GAAG,KAAK,IAAI;AACjE,QAAM,eAAe,MAAM,gBAAgB;AAC3C,SAAO;AAAA,IACL,WAAW;AAAA,MACT,WAAW;AAAA,MACX,gBAAgB,MAAM,WAAW;AAAA,MACjC,kBAAkB,MAAM,YAAY;AAAA,MACpC,qBAAqB,MAAM,kBAAkB;AAAA,MAC7C,qBAAqB,MAAM,qBAAqB;AAAA,MAChD,sBAAsB;AAAA,IACxB;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA,WAAW,MAAM,aAAa;AAAA,MAC9B;AAAA,MACA;AAAA;AAAA;AAAA,MAGA,WAAW,cAAc,IAA+B;AAAA,IAC1D;AAAA,EACF;AACF;AAEO,IAAM,WAAW,CACtB,UACsB;AACtB,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,EAAE,WAAW,YAAY,IAAI,cAAc,KAAK;AAEtD,MAAI,MAAM,QAAS,QAAO,oBAAC,mBAAiB,GAAG,aAAa;AAC5D,MAAI,MAAM,MAAO,QAAO,oBAAC,iBAAe,GAAG,aAAa,OAAO,MAAM,OAAO;AAC5E,MAAI,MAAM,cAAc,WAAW,GAAG;AACpC,WAAO,oBAAC,iBAAe,GAAG,aAAa,YAAY,MAAM,YAAY,WAAW,MAAM,WAAW;AAAA,EACnG;AAEA,QAAM,kBAAkB,MAAM,WAAW,QAAQ,YAAY,SAAS,IAAI;AAC1E,QAAM,eACJ,MAAM,eAAe,SAAS,kBAAkB,MAAM,YAAY,IAAI;AACxE,QAAM,UAAU,EAAE,OAAO,OAAO,aAAa;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,MAAM;AAAA,MACV,GAAG;AAAA,MACJ,eAAa,YAAY;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,MAAK;AAAA,MACL,cAAY,YAAY;AAAA,MACxB,oBAAkB,MAAM;AAAA,MACxB,iBAAe,MAAM,cAAc,SAAS;AAAA,MAC5C,iBAAe;AAAA,MACf,IAAI,EAAE,QAAQ,QAAQ,UAAU,UAAU,SAAS,QAAQ,eAAe,SAAS;AAAA,MAClF,GAAG,YAAY;AAAA,MAEhB;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,UAAU,WAAW;AAAA,UACtD,UAAU,MAAM;AAAA,UAEhB,+BAAC,SAAM,cAAc,MAAM,gBAAgB,MACzC;AAAA,gCAAC,cAAY,GAAG,SAAS;AAAA,YACzB,oBAAC,YAAU,GAAG,SAAS;AAAA,aACzB;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AASA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,MAAkE;AACvF,QAAM,OAAgC,EAAE,GAAG,KAAK;AAChD,aAAW,OAAO,gBAAiB,QAAO,KAAK,GAAG;AAClD,SAAO;AACT;AAEA,SAAS,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/components/data-display/DataGrid/DataGrid.tsx"],"sourcesContent":["/**\n * `DataGrid` — the shell.\n *\n * Everything that is not \"which of the four renders is this, and what wraps the\n * table\" lives beside it: the state in `DataGrid.model.ts`, the client-mode row\n * pipeline in `DataGrid.rows.ts`, the cells and rows in `DataGrid.cells.tsx`,\n * the head/body in `DataGrid.body.tsx`, and the loading/error/empty renders in\n * `DataGrid.states.tsx`.\n *\n * All FOUR renders carry the caller's `data-testid`. It used to be applied only\n * on the populated one, so a grid whose first paint had no rows could not be\n * found by a test at all — see `DataGrid.states.tsx` for the full story.\n */\nimport Paper from '@mui/material/Paper/index.js';\nimport Table from '@mui/material/Table/index.js';\nimport TableContainer from '@mui/material/TableContainer/index.js';\nimport type React from 'react';\n\nimport { GridBody, GridHeader } from './DataGrid.body';\nimport { useDataGridModel } from './DataGrid.model';\nimport { DataGridEmpty, DataGridError, DataGridLoading } from './DataGrid.states';\nimport type { DataGridProps } from './DataGrid.types';\n\n/**\n * The chrome every render needs, with the defaults resolved ONCE.\n *\n * Extracted from the component body because a dozen destructuring defaults are\n * a dozen branches: the gate counted them, correctly, as complexity the render\n * did not need to carry.\n */\nfunction resolveChrome<T extends Record<string, unknown>>(props: DataGridProps<T>): {\n dataAttrs: Record<string, unknown>;\n placeholder: {\n dataTestId?: string;\n ariaLabel: string;\n className?: string;\n style?: React.CSSProperties;\n htmlProps: React.HTMLAttributes<HTMLElement>;\n };\n} {\n const { className, style, 'data-testid': dataTestId, ...rest } = props;\n const stickyHeader = props.stickyHeader ?? true;\n return {\n dataAttrs: {\n 'data-ui': 'datagrid',\n 'data-density': props.density ?? 'comfortable',\n 'data-size-mode': props.sizeMode ?? 'auto',\n 'data-virtual-rows': props.virtualizeRows ?? true,\n 'data-virtual-cols': props.virtualizeColumns ?? false,\n 'data-sticky-header': stickyHeader,\n },\n placeholder: {\n dataTestId,\n ariaLabel: props.ariaLabel ?? 'Data grid',\n className,\n style,\n // Only the DOM-safe leftovers reach the element: every grid-specific prop\n // is named in `GRID_ONLY_PROPS`, so this cannot smuggle `rows` onto a div.\n htmlProps: omitGridProps(rest as Record<string, unknown>),\n },\n };\n}\n\nexport const DataGrid = <T extends Record<string, unknown> = Record<string, unknown>>(\n props: DataGridProps<T>,\n): React.JSX.Element => {\n const model = useDataGridModel(props);\n const { dataAttrs, placeholder } = resolveChrome(props);\n\n if (props.loading) return <DataGridLoading {...placeholder} />;\n if (props.error) return <DataGridError {...placeholder} error={props.error} />;\n if (model.processedRows.length === 0) {\n return <DataGridEmpty {...placeholder} emptyState={props.emptyState} emptyText={props.emptyText} />;\n }\n\n const leadingColumns = (props.selection?.mode ?? 'none') !== 'none' ? 1 : 0;\n const totalColumns =\n model.visibleColumns.length + leadingColumns + (props.expansion ? 1 : 0);\n const section = { model, props, totalColumns };\n\n return (\n <Paper\n ref={model.containerRef}\n {...dataAttrs}\n data-testid={placeholder.dataTestId}\n className={placeholder.className}\n style={placeholder.style}\n role=\"grid\"\n aria-label={placeholder.ariaLabel}\n aria-description={props.ariaDescription}\n aria-rowcount={model.processedRows.length + 1} // +1 for the header row\n aria-colcount={totalColumns}\n sx={{ height: '100%', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}\n {...placeholder.htmlProps}\n >\n <TableContainer\n sx={{ flex: 1, overflow: 'auto', position: 'relative' }}\n onScroll={model.onScroll}\n >\n <Table stickyHeader={props.stickyHeader ?? true}>\n <GridHeader {...section} />\n <GridBody {...section} />\n </Table>\n </TableContainer>\n </Paper>\n );\n};\n\n/**\n * The grid props that are NOT HTML attributes.\n *\n * `DataGridProps` extends `HTMLAttributes`, so the rest-spread carries the\n * grid's own configuration too. React would warn (or worse, serialize an array\n * of rows into an attribute) if any of it reached the DOM.\n *\n * Exported so a test can render a grid carrying every name on it and assert\n * none reaches the DOM — the check that would have caught `emptyText` missing.\n */\nexport const GRID_ONLY_PROPS = [\n 'rows',\n 'columns',\n 'getRowId',\n 'sizeMode',\n 'density',\n 'rowHeight',\n 'headerHeight',\n 'footerHeight',\n 'selection',\n 'pagination',\n 'sorting',\n 'filtering',\n 'expansion',\n 'editing',\n 'virtualizeRows',\n 'virtualizeColumns',\n 'stickyHeader',\n 'stickyFooter',\n 'loading',\n 'error',\n 'emptyState',\n 'emptyText',\n 'onRequestData',\n 'ariaLabel',\n 'ariaDescription',\n] as const;\n\nfunction omitGridProps(rest: Record<string, unknown>): React.HTMLAttributes<HTMLElement> {\n const html: Record<string, unknown> = { ...rest };\n for (const key of GRID_ONLY_PROPS) delete html[key];\n return html as React.HTMLAttributes<HTMLElement>;\n}\n\nDataGrid.displayName = 'DataGrid';\n"],"mappings":";;;;;;;;;;;;;;AAaA,OAAO,WAAW;AAClB,OAAO,WAAW;AAClB,OAAO,oBAAoB;AAsDC,cA8BpB,YA9BoB;AAvC5B,SAAS,cAAiD,OASxD;AACA,QAAM,EAAE,WAAW,OAAO,eAAe,YAAY,GAAG,KAAK,IAAI;AACjE,QAAM,eAAe,MAAM,gBAAgB;AAC3C,SAAO;AAAA,IACL,WAAW;AAAA,MACT,WAAW;AAAA,MACX,gBAAgB,MAAM,WAAW;AAAA,MACjC,kBAAkB,MAAM,YAAY;AAAA,MACpC,qBAAqB,MAAM,kBAAkB;AAAA,MAC7C,qBAAqB,MAAM,qBAAqB;AAAA,MAChD,sBAAsB;AAAA,IACxB;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA,WAAW,MAAM,aAAa;AAAA,MAC9B;AAAA,MACA;AAAA;AAAA;AAAA,MAGA,WAAW,cAAc,IAA+B;AAAA,IAC1D;AAAA,EACF;AACF;AAEO,IAAM,WAAW,CACtB,UACsB;AACtB,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,EAAE,WAAW,YAAY,IAAI,cAAc,KAAK;AAEtD,MAAI,MAAM,QAAS,QAAO,oBAAC,mBAAiB,GAAG,aAAa;AAC5D,MAAI,MAAM,MAAO,QAAO,oBAAC,iBAAe,GAAG,aAAa,OAAO,MAAM,OAAO;AAC5E,MAAI,MAAM,cAAc,WAAW,GAAG;AACpC,WAAO,oBAAC,iBAAe,GAAG,aAAa,YAAY,MAAM,YAAY,WAAW,MAAM,WAAW;AAAA,EACnG;AAEA,QAAM,kBAAkB,MAAM,WAAW,QAAQ,YAAY,SAAS,IAAI;AAC1E,QAAM,eACJ,MAAM,eAAe,SAAS,kBAAkB,MAAM,YAAY,IAAI;AACxE,QAAM,UAAU,EAAE,OAAO,OAAO,aAAa;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,MAAM;AAAA,MACV,GAAG;AAAA,MACJ,eAAa,YAAY;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,MAAK;AAAA,MACL,cAAY,YAAY;AAAA,MACxB,oBAAkB,MAAM;AAAA,MACxB,iBAAe,MAAM,cAAc,SAAS;AAAA,MAC5C,iBAAe;AAAA,MACf,IAAI,EAAE,QAAQ,QAAQ,UAAU,UAAU,SAAS,QAAQ,eAAe,SAAS;AAAA,MAClF,GAAG,YAAY;AAAA,MAEhB;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,UAAU,WAAW;AAAA,UACtD,UAAU,MAAM;AAAA,UAEhB,+BAAC,SAAM,cAAc,MAAM,gBAAgB,MACzC;AAAA,gCAAC,cAAY,GAAG,SAAS;AAAA,YACzB,oBAAC,YAAU,GAAG,SAAS;AAAA,aACzB;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAYO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,MAAkE;AACvF,QAAM,OAAgC,EAAE,GAAG,KAAK;AAChD,aAAW,OAAO,gBAAiB,QAAO,KAAK,GAAG;AAClD,SAAO;AACT;AAEA,SAAS,cAAc;","names":[]}
@@ -3,15 +3,15 @@ import {
3
3
  chipStyles,
4
4
  iconWithTestId,
5
5
  makeKeyDownHandler
6
- } from "./chunk-URXT5TOY.js";
6
+ } from "./chunk-E46PG577.js";
7
+ import {
8
+ chipMuiSize
9
+ } from "./chunk-KU6VHNRV.js";
7
10
  import {
8
11
  chipRole,
9
12
  isClickable,
10
13
  makeTestId
11
14
  } from "./chunk-BF4FYOAR.js";
12
- import {
13
- chipMuiSize
14
- } from "./chunk-KU6VHNRV.js";
15
15
 
16
16
  // src/components/data-display/Chip/Chip.tsx
17
17
  import CancelIcon from "@mui/icons-material/Cancel";
@@ -76,4 +76,4 @@ Chip.displayName = "Chip";
76
76
  export {
77
77
  Chip
78
78
  };
79
- //# sourceMappingURL=chunk-DRHIIUDO.js.map
79
+ //# sourceMappingURL=chunk-FPWB5ILF.js.map
@@ -1,10 +1,10 @@
1
+ import {
2
+ chartValueFormatter
3
+ } from "./chunk-QVWNK4JO.js";
1
4
  import {
2
5
  getChartSpecRenderer,
3
6
  getRegisteredChartSpecTypes
4
7
  } from "./chunk-WKUA6P3W.js";
5
- import {
6
- chartValueFormatter
7
- } from "./chunk-QVWNK4JO.js";
8
8
 
9
9
  // src/components/data-display/Chart/chart-spec.ts
10
10
  var CHART_SEMANTIC_COLORS = [
@@ -149,4 +149,4 @@ export {
149
149
  parseChartSpec,
150
150
  specToChartProps
151
151
  };
152
- //# sourceMappingURL=chunk-R6SBP5M5.js.map
152
+ //# sourceMappingURL=chunk-GOWBYHYW.js.map
@@ -1,6 +1,12 @@
1
1
  import {
2
2
  freshnessOf
3
- } from "./chunk-5V4UPOWK.js";
3
+ } from "./chunk-XPMGFAJ3.js";
4
+ import {
5
+ FLEET_DOT,
6
+ FLEET_ROSTER,
7
+ FLEET_ROW,
8
+ FLEET_SKELETON
9
+ } from "./chunk-BTQZ3EX3.js";
4
10
  import {
5
11
  Skeleton
6
12
  } from "./chunk-7VN7LFBA.js";
@@ -72,15 +78,15 @@ function rowSx(theme, selected) {
72
78
  return {
73
79
  display: "flex",
74
80
  alignItems: "center",
75
- gap: theme.spacing(1.5),
76
- padding: theme.spacing(1, 1.5),
81
+ gap: theme.spacing(FLEET_ROW.gapUnits),
82
+ padding: theme.spacing(FLEET_ROW.paddingYUnits, FLEET_ROW.paddingXUnits),
77
83
  // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as
78
84
  // a multiple of `theme.shape.borderRadius`, so dividing the theme value out
79
85
  // and letting `sx` multiply it back in is quadratic: measured 4px on the
80
86
  // default theme — which is why this looked right — and 36px on a host that
81
87
  // sets its own radius to 12. In a package whose whole premise is being
82
88
  // re-themed, only the multiple is portable.
83
- borderRadius: 1,
89
+ borderRadius: FLEET_ROW.radiusMultiple,
84
90
  cursor: "pointer",
85
91
  backgroundColor: resting,
86
92
  "&:hover": {
@@ -119,8 +125,8 @@ function FleetRow({
119
125
  "aria-hidden": "true",
120
126
  "data-testid": `${testId}-dot`,
121
127
  sx: {
122
- width: 10,
123
- height: 10,
128
+ width: FLEET_DOT.size,
129
+ height: FLEET_DOT.size,
124
130
  borderRadius: "50%",
125
131
  flexShrink: 0,
126
132
  backgroundColor: color
@@ -143,7 +149,15 @@ function FleetRow({
143
149
  );
144
150
  }
145
151
  function FirstLoad({ testId }) {
146
- return /* @__PURE__ */ jsx(Stack, { spacing: 1, "data-testid": `${testId}-skeleton`, "aria-hidden": "true", children: [0, 1, 2].map((row) => /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", height: 44, borderRadius: 1 }, row)) });
152
+ return /* @__PURE__ */ jsx(Stack, { spacing: FLEET_SKELETON.gapUnits, "data-testid": `${testId}-skeleton`, "aria-hidden": "true", children: Array.from({ length: FLEET_SKELETON.rows }, (_, row) => /* @__PURE__ */ jsx(
153
+ Skeleton,
154
+ {
155
+ variant: "rectangular",
156
+ height: FLEET_SKELETON.height,
157
+ borderRadius: FLEET_SKELETON.radiusMultiple
158
+ },
159
+ row
160
+ )) });
147
161
  }
148
162
  function FleetRoster({
149
163
  units,
@@ -173,12 +187,12 @@ function FleetRoster({
173
187
  sx: {
174
188
  display: "flex",
175
189
  flexDirection: "column",
176
- gap: theme.spacing(0.5),
190
+ gap: theme.spacing(FLEET_ROSTER.gapUnits),
177
191
  overflowY: "auto",
178
192
  minWidth: 0,
179
193
  "&:focus-visible": {
180
- outline: `2px solid ${theme.palette.primary.main}`,
181
- outlineOffset: 2
194
+ outline: `${FLEET_ROSTER.focusRingWidth}px solid ${theme.palette.primary.main}`,
195
+ outlineOffset: FLEET_ROSTER.focusRingOffset
182
196
  }
183
197
  },
184
198
  children: units.map((unit, index) => /* @__PURE__ */ jsx(
@@ -202,4 +216,4 @@ function FleetRoster({
202
216
  export {
203
217
  FleetRoster
204
218
  };
205
- //# sourceMappingURL=chunk-MQNKRIGC.js.map
219
+ //# sourceMappingURL=chunk-HMV4QMXS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/FleetMap/FleetRoster.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { Skeleton } from '../../layout/Skeleton/Skeleton';\n\nimport { freshnessOf } from './FleetMap.helpers';\nimport { FLEET_DOT, FLEET_ROSTER, FLEET_ROW, FLEET_SKELETON } from './FleetMap.metrics';\nimport type { FleetFreshness, FleetMapCopy, FleetUnit } from './FleetMap.types';\n\n/**\n * The roster beside the map — and the ACCESSIBLE half of this component.\n *\n * A map is a picture of positions and a screen reader cannot read a picture, so\n * the panel's information is carried by this list. That is not a consolation\n * prize: the list answers the questions a dispatcher actually asks — who is\n * reporting, how recently, and what are they carrying — and it answers them in\n * an order the map cannot express.\n *\n * The map beside it is a NAMED LANDMARK rather than an `aria-hidden` one, so a\n * reader can skip it in one gesture — see `FleetCanvas`, which carries the\n * reason it must not be hidden.\n */\n\n/** Each freshness draws from the semantic palette, never a hardcoded hex. */\nfunction freshnessColor(freshness: FleetFreshness, theme: Theme): string {\n if (freshness === 'live') return theme.palette.success.main;\n if (freshness === 'lagging') return theme.palette.warning.main;\n return theme.palette.text.disabled;\n}\n\n/**\n * A row's two lines of text — the name, and the one-line summary under it.\n *\n * Split out of `FleetRow` to keep that function under the size gate, and the\n * seam is the natural one: everything here is READ, nothing is interactive.\n */\nfunction RowText({\n unit,\n copy,\n freshness,\n testId,\n}: Pick<RowProps, 'unit' | 'copy' | 'freshness' | 'testId'>): React.JSX.Element {\n const theme = useTheme();\n\n // Dropped rather than rendered empty: a phone that reports no accuracy radius\n // would otherwise print a trailing separator with nothing after it.\n const meta = [\n copy.freshness[freshness],\n copy.lastSeen(unit.staleSeconds),\n unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM),\n ]\n .filter((part): part is string => Boolean(part))\n .join(' · ');\n\n return (\n <Stack sx={{ minWidth: 0, flexGrow: 1 }}>\n <Typography\n variant=\"body2\"\n component=\"p\"\n data-testid={`${testId}-label`}\n sx={{ fontWeight: theme.typography.fontWeightMedium, overflowWrap: 'anywhere' }}\n >\n {unit.label}\n </Typography>\n <Typography\n variant=\"caption\"\n component=\"p\"\n data-testid={`${testId}-meta`}\n sx={{ color: theme.palette.text.secondary }}\n >\n {meta}\n </Typography>\n </Stack>\n );\n}\n\n/**\n * Keep the selected row visible INSIDE the roster.\n *\n * The roster caps its own height, so a dispatcher arrowing through a fleet of\n * thirty otherwise walks the selection below the fold with nothing moving —\n * `aria-activedescendant` follows, and a SIGHTED keyboard user sees no feedback\n * at all.\n *\n * Watches the row's POSITION as well as its selectedness, because the roster\n * re-sorts on every poll: a rider who stays selected while their staleness\n * moves them down the list would otherwise slide out of view with the effect\n * never re-running.\n *\n * Arithmetic rather than `scrollIntoView({ block: 'nearest' })` because that\n * walks every scrollable ancestor, the document included, and `nearest` only\n * spares an ancestor the row is already visible in — which is exactly false\n * when the panel is off screen. Re-running on every re-sort, it would yank the\n * whole page back to the map on a timer, and drag it there on mount for any\n * board rendered below the fold with a selection already set.\n */\nfunction useKeptInView(\n selected: boolean,\n position: number,\n): React.RefObject<HTMLDivElement | null> {\n const row = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const box = row.current;\n const list = box?.parentElement;\n if (!selected || !box || !list) return;\n const top = box.offsetTop - list.offsetTop;\n if (top < list.scrollTop) {\n list.scrollTop = top;\n } else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = top + box.offsetHeight - list.clientHeight;\n }\n }, [selected, position]);\n\n return row;\n}\n\n/**\n * A row's own box, selected or not.\n *\n * Out of line because the hover rule needs the explanation more than the JSX\n * has room for: hover must never WEAKEN the selection. Written flat as\n * `'&:hover': { backgroundColor: action.hover }`, the pseudo-class wins on\n * specificity and repaints the selected row with the hover tint — measured at\n * `rgba(0,0,0,0.08)` idle against `rgba(0,0,0,0.04)` hovered, so pointing at\n * the selected row visually DESELECTED it and made it indistinguishable from\n * any other row under the cursor.\n */\nfunction rowSx(theme: Theme, selected: boolean): SxProps<Theme> {\n const resting = selected ? theme.palette.action.selected : 'transparent';\n return {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(FLEET_ROW.gapUnits),\n padding: theme.spacing(FLEET_ROW.paddingYUnits, FLEET_ROW.paddingXUnits),\n // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as\n // a multiple of `theme.shape.borderRadius`, so dividing the theme value out\n // and letting `sx` multiply it back in is quadratic: measured 4px on the\n // default theme — which is why this looked right — and 36px on a host that\n // sets its own radius to 12. In a package whose whole premise is being\n // re-themed, only the multiple is portable.\n borderRadius: FLEET_ROW.radiusMultiple,\n cursor: 'pointer',\n backgroundColor: resting,\n '&:hover': {\n backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover,\n },\n };\n}\n\ninterface RowProps {\n unit: FleetUnit;\n copy: FleetMapCopy;\n freshness: FleetFreshness;\n selected: boolean;\n onSelect: (id: string) => void;\n /** The row's DOM id, which `aria-activedescendant` points at. */\n optionId: string;\n /** Where the row sits in the re-sorted roster — see the scroll effect. */\n position: number;\n testId: string;\n}\n\nfunction FleetRow({\n unit,\n copy,\n freshness,\n selected,\n onSelect,\n optionId,\n position,\n testId,\n}: RowProps): React.JSX.Element {\n const theme = useTheme();\n const color = freshnessColor(freshness, theme);\n const row = useKeptInView(selected, position);\n\n return (\n <Box\n ref={row}\n role=\"option\"\n aria-selected={selected}\n id={optionId}\n data-testid={testId}\n data-freshness={freshness}\n onClick={() => onSelect(unit.id)}\n sx={rowSx(theme, selected)}\n >\n {/* The dot repeats what the freshness word beside it already says, so it\n is hidden rather than read twice — and colour is never the only\n carrier of the state. */}\n <Box\n aria-hidden=\"true\"\n data-testid={`${testId}-dot`}\n sx={{\n width: FLEET_DOT.size,\n height: FLEET_DOT.size,\n borderRadius: '50%',\n flexShrink: 0,\n backgroundColor: color,\n }}\n />\n <RowText unit={unit} copy={copy} freshness={freshness} testId={testId} />\n {unit.badge && (\n <Typography\n variant=\"caption\"\n component=\"span\"\n data-testid={`${testId}-badge`}\n sx={{ color: theme.palette.text.secondary, flexShrink: 0 }}\n >\n {unit.badge}\n </Typography>\n )}\n </Box>\n );\n}\n\n/**\n * What stands in for the roster before any unit has landed.\n *\n * `aria-hidden`, because three grey bars are not information — the panel's\n * `aria-busy` and its optional announcement carry that. The radius is the same\n * MULTIPLE a real row uses rather than a raw pixel count: `Skeleton` forwards\n * the number into `sx`, where it scales with `theme.shape.borderRadius`, so a\n * literal `4` drew 16px against the rows' 4px on the default theme and 48px\n * against 12px on a re-themed host.\n */\nfunction FirstLoad({ testId }: { testId: string }): React.JSX.Element {\n return (\n <Stack spacing={FLEET_SKELETON.gapUnits} data-testid={`${testId}-skeleton`} aria-hidden=\"true\">\n {Array.from({ length: FLEET_SKELETON.rows }, (_, row) => (\n <Skeleton\n key={row}\n variant=\"rectangular\"\n height={FLEET_SKELETON.height}\n borderRadius={FLEET_SKELETON.radiusMultiple}\n />\n ))}\n </Stack>\n );\n}\n\nexport interface FleetRosterProps {\n units: readonly FleetUnit[];\n copy: FleetMapCopy;\n selectedId: string | null | undefined;\n onSelect: (id: string) => void;\n laggingAfterSeconds: number;\n staleAfterSeconds: number;\n loading: boolean;\n testId: string;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function FleetRoster({\n units,\n copy,\n selectedId,\n onSelect,\n laggingAfterSeconds,\n staleAfterSeconds,\n loading,\n testId,\n onKeyDown,\n}: FleetRosterProps): React.JSX.Element {\n const theme = useTheme();\n // Generated, not derived from `dataTestId`: two boards on one page filtered\n // from the same fleet would otherwise emit duplicate DOM ids and an ambiguous\n // `aria-activedescendant`. Same reason the heading uses one.\n const rowIdPrefix = React.useId();\n const optionId = (id: string): string => `${rowIdPrefix}-${id}`;\n\n // The selection is CONTROLLED, so it can name a unit that has since dropped\n // out of the freshness window — a courier ending their shift mid-poll. The\n // attribute must then be absent rather than pointing at an element that no\n // longer renders, which announces nothing and fails an axe audit. `mapCentre`\n // and `nextSelection` both handle the same case; this is the third place.\n const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;\n\n // Only when there is nothing to show yet. Unmounting a populated listbox on\n // every poll destroys the focus inside it, so a dispatcher arrowing through\n // the roster is thrown back to the top of the page each time the data\n // refreshes — and the rows they were reading vanish and return.\n if (loading && units.length === 0) return <FirstLoad testId={testId} />;\n\n return (\n <Box\n role=\"listbox\"\n // A single tab stop with arrow keys inside, which is the listbox pattern:\n // a dispatcher tabbing past a fleet of thirty should not have to press it\n // thirty times to reach the map.\n tabIndex={0}\n aria-label={copy.rosterLabel}\n aria-activedescendant={active ? optionId(active) : undefined}\n data-testid={`${testId}-roster`}\n onKeyDown={onKeyDown}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(FLEET_ROSTER.gapUnits),\n overflowY: 'auto',\n minWidth: 0,\n '&:focus-visible': {\n outline: `${FLEET_ROSTER.focusRingWidth}px solid ${theme.palette.primary.main}`,\n outlineOffset: FLEET_ROSTER.focusRingOffset,\n },\n }}\n >\n {units.map((unit, index) => (\n <FleetRow\n key={unit.id}\n unit={unit}\n copy={copy}\n freshness={freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds)}\n selected={unit.id === active}\n onSelect={onSelect}\n optionId={optionId(unit.id)}\n position={index}\n testId={`${testId}-${unit.id}`}\n />\n ))}\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,OAAO,gBAAgB;AACvB,SAAS,gBAA0C;AACnD,OAAO,WAAW;AAsDd,SACE,KADF;AA/BJ,SAAS,eAAe,WAA2B,OAAsB;AACvE,MAAI,cAAc,OAAQ,QAAO,MAAM,QAAQ,QAAQ;AACvD,MAAI,cAAc,UAAW,QAAO,MAAM,QAAQ,QAAQ;AAC1D,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAQA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgF;AAC9E,QAAM,QAAQ,SAAS;AAIvB,QAAM,OAAO;AAAA,IACX,KAAK,UAAU,SAAS;AAAA,IACxB,KAAK,SAAS,KAAK,YAAY;AAAA,IAC/B,KAAK,aAAa,OAAO,OAAO,KAAK,SAAS,KAAK,SAAS;AAAA,EAC9D,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,QAAK;AAEb,SACE,qBAAC,SAAM,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,GACpC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,eAAa,GAAG,MAAM;AAAA,QACtB,IAAI,EAAE,YAAY,MAAM,WAAW,kBAAkB,cAAc,WAAW;AAAA,QAE7E,eAAK;AAAA;AAAA,IACR;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,eAAa,GAAG,MAAM;AAAA,QACtB,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,UAAU;AAAA,QAEzC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAsBA,SAAS,cACP,UACA,UACwC;AACxC,QAAM,MAAM,MAAM,OAAuB,IAAI;AAE7C,QAAM,UAAU,MAAM;AACpB,UAAM,MAAM,IAAI;AAChB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAM;AAChC,UAAM,MAAM,IAAI,YAAY,KAAK;AACjC,QAAI,MAAM,KAAK,WAAW;AACxB,WAAK,YAAY;AAAA,IACnB,WAAW,MAAM,IAAI,eAAe,KAAK,YAAY,KAAK,cAAc;AACtE,WAAK,YAAY,MAAM,IAAI,eAAe,KAAK;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,SAAO;AACT;AAaA,SAAS,MAAM,OAAc,UAAmC;AAC9D,QAAM,UAAU,WAAW,MAAM,QAAQ,OAAO,WAAW;AAC3D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK,MAAM,QAAQ,UAAU,QAAQ;AAAA,IACrC,SAAS,MAAM,QAAQ,UAAU,eAAe,UAAU,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvE,cAAc,UAAU;AAAA,IACxB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,WAAW;AAAA,MACT,iBAAiB,WAAW,MAAM,QAAQ,OAAO,WAAW,MAAM,QAAQ,OAAO;AAAA,IACnF;AAAA,EACF;AACF;AAeA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,eAAe,WAAW,KAAK;AAC7C,QAAM,MAAM,cAAc,UAAU,QAAQ;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,IAAI;AAAA,MACJ,eAAa;AAAA,MACb,kBAAgB;AAAA,MAChB,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,MAC/B,IAAI,MAAM,OAAO,QAAQ;AAAA,MAKzB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,eAAa,GAAG,MAAM;AAAA,YACtB,IAAI;AAAA,cACF,OAAO,UAAU;AAAA,cACjB,QAAQ,UAAU;AAAA,cAClB,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,iBAAiB;AAAA,YACnB;AAAA;AAAA,QACF;AAAA,QACA,oBAAC,WAAQ,MAAY,MAAY,WAAsB,QAAgB;AAAA,QACtE,KAAK,SACJ;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,eAAa,GAAG,MAAM;AAAA,YACtB,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,WAAW,YAAY,EAAE;AAAA,YAExD,eAAK;AAAA;AAAA,QACR;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAYA,SAAS,UAAU,EAAE,OAAO,GAA0C;AACpE,SACE,oBAAC,SAAM,SAAS,eAAe,UAAU,eAAa,GAAG,MAAM,aAAa,eAAY,QACrF,gBAAM,KAAK,EAAE,QAAQ,eAAe,KAAK,GAAG,CAAC,GAAG,QAC/C;AAAA,IAAC;AAAA;AAAA,MAEC,SAAQ;AAAA,MACR,QAAQ,eAAe;AAAA,MACvB,cAAc,eAAe;AAAA;AAAA,IAHxB;AAAA,EAIP,CACD,GACH;AAEJ;AAcO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,QAAM,QAAQ,SAAS;AAIvB,QAAM,cAAc,MAAM,MAAM;AAChC,QAAM,WAAW,CAAC,OAAuB,GAAG,WAAW,IAAI,EAAE;AAO7D,QAAM,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,UAAU,IAAI,aAAa;AAM3E,MAAI,WAAW,MAAM,WAAW,EAAG,QAAO,oBAAC,aAAU,QAAgB;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MAIL,UAAU;AAAA,MACV,cAAY,KAAK;AAAA,MACjB,yBAAuB,SAAS,SAAS,MAAM,IAAI;AAAA,MACnD,eAAa,GAAG,MAAM;AAAA,MACtB;AAAA,MACA,IAAI;AAAA,QACF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK,MAAM,QAAQ,aAAa,QAAQ;AAAA,QACxC,WAAW;AAAA,QACX,UAAU;AAAA,QACV,mBAAmB;AAAA,UACjB,SAAS,GAAG,aAAa,cAAc,YAAY,MAAM,QAAQ,QAAQ,IAAI;AAAA,UAC7E,eAAe,aAAa;AAAA,QAC9B;AAAA,MACF;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA,WAAW,YAAY,KAAK,cAAc,qBAAqB,iBAAiB;AAAA,UAChF,UAAU,KAAK,OAAO;AAAA,UACtB;AAAA,UACA,UAAU,SAAS,KAAK,EAAE;AAAA,UAC1B,UAAU;AAAA,UACV,QAAQ,GAAG,MAAM,IAAI,KAAK,EAAE;AAAA;AAAA,QARvB,KAAK;AAAA,MASZ,CACD;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-EJQW2IYW.js";
8
8
  import {
9
9
  MoreFilters
10
- } from "./chunk-KHWCX4LI.js";
10
+ } from "./chunk-6LGWJFQK.js";
11
11
  import {
12
12
  RangePill
13
- } from "./chunk-BZTFPSWT.js";
13
+ } from "./chunk-DFLTUI7W.js";
14
14
  import {
15
15
  CollapsedSearch,
16
16
  InlineKeyword
@@ -220,4 +220,4 @@ function FilterSlots({
220
220
  export {
221
221
  InlineFilterControls
222
222
  };
223
- //# sourceMappingURL=chunk-N2TUX4A5.js.map
223
+ //# sourceMappingURL=chunk-I3E2QHTH.js.map
@@ -3,14 +3,14 @@ import {
3
3
  } from "./chunk-4X4KM4ZB.js";
4
4
  import {
5
5
  DataViewsGrid
6
- } from "./chunk-ACFGEZ4Q.js";
6
+ } from "./chunk-XO753WHD.js";
7
7
  import {
8
8
  viewStateKey
9
9
  } from "./chunk-ZOLAYP2D.js";
10
10
  import {
11
11
  ViewDialogs,
12
12
  ViewMutationErrorAlert
13
- } from "./chunk-AJGYHDA5.js";
13
+ } from "./chunk-U2YJCNRU.js";
14
14
  import {
15
15
  useSavedViewsController
16
16
  } from "./chunk-HR7YTBR7.js";
@@ -178,4 +178,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
178
178
  export {
179
179
  DataViewsTableBase
180
180
  };
181
- //# sourceMappingURL=chunk-4XZXLB4I.js.map
181
+ //# sourceMappingURL=chunk-JQ45NDBS.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AvatarView
3
- } from "./chunk-4SQFO4GW.js";
3
+ } from "./chunk-NA7MIEG6.js";
4
4
  import {
5
5
  BORDER_WIDTH,
6
6
  GROUP_HOVER,
@@ -172,4 +172,4 @@ export {
172
172
  Avatar,
173
173
  AvatarGroup
174
174
  };
175
- //# sourceMappingURL=chunk-I7HYGIEJ.js.map
175
+ //# sourceMappingURL=chunk-JUHUKZGU.js.map
@@ -1,9 +1,14 @@
1
+ import {
2
+ useFleetMap
3
+ } from "./chunk-ZCPSND5Y.js";
1
4
  import {
2
5
  FleetBody
3
- } from "./chunk-CF3FAAPC.js";
6
+ } from "./chunk-RP5FK3SO.js";
4
7
  import {
5
- useFleetMap
6
- } from "./chunk-F7VBGS4C.js";
8
+ FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
9
+ FLEET_DEFAULT_STALE_AFTER_SECONDS,
10
+ FLEET_PANEL
11
+ } from "./chunk-BTQZ3EX3.js";
7
12
  import {
8
13
  SR_ONLY_SX
9
14
  } from "./chunk-RNCQ5KHQ.js";
@@ -17,8 +22,6 @@ import Typography from "@mui/material/Typography/index.js";
17
22
  import { useTheme } from "@mui/material/styles/index.js";
18
23
  import React from "react";
19
24
  import { jsx, jsxs } from "react/jsx-runtime";
20
- var DEFAULT_LAGGING_AFTER_SECONDS = 90;
21
- var DEFAULT_STALE_AFTER_SECONDS = 300;
22
25
  var DEFAULT_HEIGHT = "420px";
23
26
  function FleetStatus({
24
27
  announcement,
@@ -37,8 +40,8 @@ var FleetMap = React.memo(
37
40
  // controlled and the uncontrolled path unreachable.
38
41
  selectedId,
39
42
  onSelect,
40
- laggingAfterSeconds = DEFAULT_LAGGING_AFTER_SECONDS,
41
- staleAfterSeconds = DEFAULT_STALE_AFTER_SECONDS,
43
+ laggingAfterSeconds = FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
44
+ staleAfterSeconds = FLEET_DEFAULT_STALE_AFTER_SECONDS,
42
45
  height = DEFAULT_HEIGHT,
43
46
  loading = false,
44
47
  className,
@@ -59,7 +62,7 @@ var FleetMap = React.memo(
59
62
  "aria-labelledby": headingId,
60
63
  className,
61
64
  "data-testid": testId,
62
- sx: { display: "flex", flexDirection: "column", gap: theme.spacing(1.5), minWidth: 0 },
65
+ sx: { display: "flex", flexDirection: "column", gap: theme.spacing(FLEET_PANEL.gapUnits), minWidth: 0 },
63
66
  children: [
64
67
  /* @__PURE__ */ jsx(
65
68
  Typography,
@@ -110,4 +113,4 @@ export {
110
113
  FleetMap,
111
114
  FleetMap_default
112
115
  };
113
- //# sourceMappingURL=chunk-TWQYDKCA.js.map
116
+ //# sourceMappingURL=chunk-JZXWCEH5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/FleetMap/FleetMap.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { SR_ONLY_SX } from '../../form/Label/Label.styles';\nimport { EmptyState } from '../EmptyState/EmptyState';\n\nimport { FleetBody } from './FleetBody';\nimport { useFleetMap } from './FleetMap.hooks';\nimport {\n FLEET_DEFAULT_LAGGING_AFTER_SECONDS,\n FLEET_DEFAULT_STALE_AFTER_SECONDS,\n FLEET_PANEL,\n} from './FleetMap.metrics';\nimport type { FleetMapProps } from './FleetMap.types';\n\n/** The map's own default height. Overridable, and never a hardcoded viewport. */\nconst DEFAULT_HEIGHT = '420px';\n\n/**\n * The reload announcement, and nothing else.\n *\n * `aria-busy` marks the region stale for assistive technology but UTTERS\n * nothing, and the skeletons beside it are `aria-hidden` — so a screen-reader\n * user got silence while the roster reloaded. This is the utterance.\n *\n * Optional by design: the sentence is in the reader's language, which only the\n * caller knows, and inventing an English one in a component whose whole premise\n * is that every word arrives through `copy` would be the bug it exists to\n * avoid. No `copy.loading`, no region.\n *\n * ## The node outlives the text, and that is the whole trick\n *\n * A live region has to be in the DOM BEFORE its content changes; a screen\n * reader watches an existing region for mutations rather than announcing one\n * that appears already populated. Mounting region-and-text together in a single\n * commit is the classic silent case — it satisfies a DOM assertion while\n * announcing nothing. So the region mounts as soon as the caller offers the\n * copy and merely EMPTIES when idle, which is what `CepField`, `UploadButton`\n * and `DateRangePickerFields` all do.\n */\nfunction FleetStatus({\n announcement,\n loading,\n testId,\n}: {\n announcement: string | undefined;\n loading: boolean;\n testId: string;\n}): React.JSX.Element | null {\n // No copy, no region at all — the caller has not asked for an announcement.\n if (announcement === undefined) return null;\n return (\n <Box role=\"status\" aria-live=\"polite\" data-testid={`${testId}-status`} sx={SR_ONLY_SX}>\n {loading ? announcement : ''}\n </Box>\n );\n}\n\n/**\n * FleetMap — where a set of tracked units is right now, as a map beside the\n * roster that reads it.\n *\n * Product-free by construction: it draws labelled dots with a freshness, and\n * every word — the heading, the three freshness states, how a duration and a\n * distance are written — arrives through {@link FleetMapProps.copy}. Couriers,\n * service vans and field engineers are all the same picture.\n *\n * ## Three decisions worth knowing before changing it\n *\n * **The roster is the accessible representation, not a sidebar.** A map is a\n * picture and a screen reader cannot read one, so the list carries the\n * information: everything a sighted user gets from a pin — who, how recently,\n * what they are carrying — is on the row. The map is a NAMED region rather than\n * an `aria-hidden` one, because its controls are focusable and hiding a\n * focusable subtree is the `aria-hidden-focus` violation.\n *\n * **Nothing here formats.** `lastSeen` and `accuracy` are functions on the copy\n * object, the same line `StatCard` holds for its `value`: a duration and a\n * distance are locale rules, and a component that wrote \"2 min ago\" would have\n * made English the only language it could ever render.\n *\n * **An empty fleet is an empty STATE, not an empty map.** A map with no pins is\n * indistinguishable from a map that failed to load, and the difference is the\n * whole question a dispatcher is asking.\n */\nexport const FleetMap: React.FC<FleetMapProps> = React.memo(\n ({\n units,\n copy,\n // NO default. `undefined` is what tells the hook the caller does not own\n // the selection; defaulting it to `null` here made every render look\n // controlled and the uncontrolled path unreachable.\n selectedId,\n onSelect,\n laggingAfterSeconds = FLEET_DEFAULT_LAGGING_AFTER_SECONDS,\n staleAfterSeconds = FLEET_DEFAULT_STALE_AFTER_SECONDS,\n height = DEFAULT_HEIGHT,\n loading = false,\n className,\n dataTestId,\n }) => {\n const theme = useTheme();\n const testId = dataTestId || 'fleet-map';\n const headingId = React.useId();\n const { ordered, active, centre, select, markers, onKeyDown } = useFleetMap(\n units,\n selectedId,\n onSelect,\n );\n\n return (\n <Box\n role=\"region\"\n aria-labelledby={headingId}\n className={className}\n data-testid={testId}\n sx={{ display: 'flex', flexDirection: 'column', gap: theme.spacing(FLEET_PANEL.gapUnits), minWidth: 0 }}\n >\n <Typography\n id={headingId}\n variant=\"subtitle1\"\n component=\"h2\"\n data-testid={`${testId}-title`}\n sx={{ fontWeight: theme.typography.fontWeightMedium }}\n >\n {copy.title}\n </Typography>\n\n <FleetStatus announcement={copy.loading} loading={loading} testId={testId} />\n\n {!loading && ordered.length === 0 ? (\n <EmptyState\n variant=\"minimal\"\n title={copy.emptyTitle}\n description={copy.emptyDescription}\n dataTestId={`${testId}-empty`}\n />\n ) : (\n <FleetBody\n ordered={ordered}\n centre={centre}\n markers={markers}\n select={select}\n onKeyDown={onKeyDown}\n copy={copy}\n selectedId={active}\n laggingAfterSeconds={laggingAfterSeconds}\n staleAfterSeconds={staleAfterSeconds}\n height={height}\n loading={loading}\n testId={testId}\n />\n )}\n </Box>\n );\n },\n);\n\nFleetMap.displayName = 'FleetMap';\n\nexport default FleetMap;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAmDd,cA2DE,YA3DF;AApCJ,IAAM,iBAAiB;AAwBvB,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAI6B;AAE3B,MAAI,iBAAiB,OAAW,QAAO;AACvC,SACE,oBAAC,OAAI,MAAK,UAAS,aAAU,UAAS,eAAa,GAAG,MAAM,WAAW,IAAI,YACxE,oBAAU,eAAe,IAC5B;AAEJ;AA6BO,IAAM,WAAoC,MAAM;AAAA,EACrD,CAAC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,MAAM;AACJ,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAS,cAAc;AAC7B,UAAM,YAAY,MAAM,MAAM;AAC9B,UAAM,EAAE,SAAS,QAAQ,QAAQ,QAAQ,SAAS,UAAU,IAAI;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,mBAAiB;AAAA,QACjB;AAAA,QACA,eAAa;AAAA,QACb,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAM,QAAQ,YAAY,QAAQ,GAAG,UAAU,EAAE;AAAA,QAEtG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,eAAa,GAAG,MAAM;AAAA,cACtB,IAAI,EAAE,YAAY,MAAM,WAAW,iBAAiB;AAAA,cAEnD,eAAK;AAAA;AAAA,UACR;AAAA,UAEA,oBAAC,eAAY,cAAc,KAAK,SAAS,SAAkB,QAAgB;AAAA,UAE1E,CAAC,WAAW,QAAQ,WAAW,IAC9B;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAO,KAAK;AAAA,cACZ,aAAa,KAAK;AAAA,cAClB,YAAY,GAAG,MAAM;AAAA;AAAA,UACvB,IAEA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;","names":[]}
@@ -1,10 +1,10 @@
1
+ import {
2
+ buildChartContext
3
+ } from "./chunk-BLBOYCOV.js";
1
4
  import {
2
5
  ChartLegendContent,
3
6
  ChartTooltipContent
4
7
  } from "./chunk-M5T3COS2.js";
5
- import {
6
- buildChartContext
7
- } from "./chunk-BLBOYCOV.js";
8
8
 
9
9
  // src/components/data-display/Chart/chart-renderers.tsx
10
10
  import {
@@ -312,4 +312,4 @@ function renderChartByType(props, theme) {
312
312
  export {
313
313
  renderChartByType
314
314
  };
315
- //# sourceMappingURL=chunk-WQA4LIIK.js.map
315
+ //# sourceMappingURL=chunk-KT6HWAEN.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Chart
3
- } from "./chunk-CBTY36TU.js";
3
+ } from "./chunk-OH3YGJT5.js";
4
4
  import {
5
5
  CHART_SEMANTIC_COLORS,
6
6
  specToChartProps
7
- } from "./chunk-R6SBP5M5.js";
7
+ } from "./chunk-GOWBYHYW.js";
8
8
  import {
9
9
  accentFor
10
10
  } from "./chunk-V5IOLAIS.js";
@@ -46,4 +46,4 @@ var SpecChart = ({
46
46
  export {
47
47
  SpecChart
48
48
  };
49
- //# sourceMappingURL=chunk-2UGJIKVA.js.map
49
+ //# sourceMappingURL=chunk-MZQTHSLN.js.map
@@ -1,3 +1,9 @@
1
+ import {
2
+ pulseAnimation,
3
+ rotateAnimation,
4
+ scaleInAnimation,
5
+ shimmerAnimation
6
+ } from "./chunk-XRMZMBE3.js";
1
7
  import {
2
8
  ACTIVE_SCALE,
3
9
  AVATAR_SIZES,
@@ -17,12 +23,6 @@ import {
17
23
  SPINNER,
18
24
  STATUS_DOT
19
25
  } from "./chunk-FAITHWIO.js";
20
- import {
21
- pulseAnimation,
22
- rotateAnimation,
23
- scaleInAnimation,
24
- shimmerAnimation
25
- } from "./chunk-XRMZMBE3.js";
26
26
  import {
27
27
  px
28
28
  } from "./chunk-NQN5Z36J.js";
@@ -272,4 +272,4 @@ function AvatarView(props) {
272
272
  export {
273
273
  AvatarView
274
274
  };
275
- //# sourceMappingURL=chunk-4SQFO4GW.js.map
275
+ //# sourceMappingURL=chunk-NA7MIEG6.js.map