@12-apps/ui 6.86.0 → 6.86.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 (123) hide show
  1. package/dist/_internal/components/data-display/Alert/Alert.js +2 -2
  2. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -3
  3. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +4 -4
  4. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  5. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  6. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +20 -20
  7. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +24 -24
  8. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
  9. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
  10. package/dist/_internal/components/data-display/DataViews/base-list-card.js +2 -2
  11. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +4 -4
  12. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +13 -13
  13. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  14. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +4 -4
  15. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +3 -3
  16. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +3 -3
  17. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  18. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +13 -13
  19. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +12 -12
  20. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +14 -14
  21. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +4 -4
  22. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  23. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  24. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +2 -2
  25. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  26. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +11 -11
  27. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  28. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  29. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  30. package/dist/_internal/components/data-display/RegionMap/RegionMap.js +3 -2
  31. package/dist/_internal/components/data-display/RegionMap/RegionMap.labels.js +12 -0
  32. package/dist/_internal/components/data-display/RegionMap/RegionMap.labels.js.map +1 -0
  33. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +2 -1
  34. package/dist/_internal/components/data-display/index.js +27 -26
  35. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +3 -3
  36. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +4 -4
  37. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +3 -3
  38. package/dist/_internal/components/feedback/index.js +5 -5
  39. package/dist/_internal/components/index.js +30 -29
  40. package/dist/{chunk-T6QVM5Q5.js → chunk-4LUWZ6UE.js} +2 -2
  41. package/dist/{chunk-JKIKHWD2.js → chunk-5NT2M2JI.js} +4 -4
  42. package/dist/{chunk-I7JUAHUO.js → chunk-65KJLPF5.js} +3 -3
  43. package/dist/{chunk-C74PDNTF.js → chunk-67ADHGA2.js} +2 -2
  44. package/dist/{chunk-ZLVRCQPG.js → chunk-A5CKUJP2.js} +5 -5
  45. package/dist/{chunk-A63WU4UZ.js → chunk-AKE6KVQG.js} +70 -41
  46. package/dist/chunk-AKE6KVQG.js.map +1 -0
  47. package/dist/{chunk-XMWTVDQN.js → chunk-B32554CQ.js} +12 -12
  48. package/dist/{chunk-OA6T2ME3.js → chunk-BLZDSCIZ.js} +4 -4
  49. package/dist/{chunk-OZYUE2BI.js → chunk-CJUK32UH.js} +4 -4
  50. package/dist/{chunk-HWPQKHN2.js → chunk-COKPPU42.js} +7 -7
  51. package/dist/{chunk-U4WAAZXJ.js → chunk-DVX4HDNP.js} +2 -2
  52. package/dist/{chunk-CESGZRVQ.js → chunk-EMSMJRP3.js} +4 -4
  53. package/dist/{chunk-IFX5KP65.js → chunk-EXVCVXFX.js} +4 -4
  54. package/dist/{chunk-U3HGQHEO.js → chunk-H7CZRKN7.js} +4 -4
  55. package/dist/{chunk-5ZC7CNU4.js → chunk-I2LMLQGQ.js} +2 -2
  56. package/dist/chunk-J3AWGTJY.js +29 -0
  57. package/dist/chunk-J3AWGTJY.js.map +1 -0
  58. package/dist/{chunk-K6VEN5VN.js → chunk-K3PMMW23.js} +4 -4
  59. package/dist/{chunk-YHPSPFU5.js → chunk-LIN4A2BW.js} +4 -4
  60. package/dist/{chunk-LXMFHD7M.js → chunk-LTSVYILY.js} +4 -4
  61. package/dist/{chunk-IEAPXS57.js → chunk-MW7P2C2C.js} +2 -2
  62. package/dist/{chunk-JVTZ7FWR.js → chunk-NCI74EOS.js} +4 -4
  63. package/dist/{chunk-IMCSY2SI.js → chunk-OKRITX4S.js} +7 -7
  64. package/dist/{chunk-LRQT4MQO.js → chunk-PJNIJIE6.js} +2 -2
  65. package/dist/{chunk-2WVHZIWP.js → chunk-QSRZOXQI.js} +2 -2
  66. package/dist/{chunk-IF5UY3CT.js → chunk-QVDEGBME.js} +4 -4
  67. package/dist/{chunk-XNMU32XC.js → chunk-TMUGBHHG.js} +2 -2
  68. package/dist/{chunk-AWUFS2ZC.js → chunk-U2DRE36S.js} +4 -4
  69. package/dist/{chunk-NEYZV6V5.js → chunk-UAOE3ZPC.js} +6 -6
  70. package/dist/{chunk-VHGHF537.js → chunk-V4CWJ7Q6.js} +2 -2
  71. package/dist/{chunk-3OL2TSEJ.js → chunk-WNNA6YYE.js} +2 -2
  72. package/dist/{chunk-T6YTDEY4.js → chunk-WXZCNHBX.js} +2 -2
  73. package/dist/{chunk-5XTPEA3O.js → chunk-ZHYLOB7Q.js} +2 -2
  74. package/dist/{chunk-ARMKSYEQ.js → chunk-ZO2GZRZS.js} +2 -2
  75. package/dist/data-display/Alert.js +2 -2
  76. package/dist/data-display/CardKit.js +7 -7
  77. package/dist/data-display/Carousel.js +2 -2
  78. package/dist/data-display/DataGrid.js +2 -2
  79. package/dist/data-display/DataViews.js +31 -31
  80. package/dist/data-display/FleetMap.js +14 -14
  81. package/dist/data-display/Lightbox.js +4 -4
  82. package/dist/data-display/MapPreview.js +11 -11
  83. package/dist/data-display/RegionMap.js +3 -2
  84. package/dist/feedback/NotificationStatusNotice.js +3 -3
  85. package/dist/feedback/SequenceResolver.js +4 -4
  86. package/dist/types/components/data-display/RegionMap/RegionMap.labels.d.ts +42 -0
  87. package/dist/types/components/data-display/RegionMap/RegionMap.labels.d.ts.map +1 -0
  88. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
  89. package/package.json +1 -1
  90. package/src/components/data-display/RegionMap/RegionMap.labels.ts +60 -0
  91. package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +87 -45
  92. package/dist/chunk-A63WU4UZ.js.map +0 -1
  93. /package/dist/{chunk-T6QVM5Q5.js.map → chunk-4LUWZ6UE.js.map} +0 -0
  94. /package/dist/{chunk-JKIKHWD2.js.map → chunk-5NT2M2JI.js.map} +0 -0
  95. /package/dist/{chunk-I7JUAHUO.js.map → chunk-65KJLPF5.js.map} +0 -0
  96. /package/dist/{chunk-C74PDNTF.js.map → chunk-67ADHGA2.js.map} +0 -0
  97. /package/dist/{chunk-ZLVRCQPG.js.map → chunk-A5CKUJP2.js.map} +0 -0
  98. /package/dist/{chunk-XMWTVDQN.js.map → chunk-B32554CQ.js.map} +0 -0
  99. /package/dist/{chunk-OA6T2ME3.js.map → chunk-BLZDSCIZ.js.map} +0 -0
  100. /package/dist/{chunk-OZYUE2BI.js.map → chunk-CJUK32UH.js.map} +0 -0
  101. /package/dist/{chunk-HWPQKHN2.js.map → chunk-COKPPU42.js.map} +0 -0
  102. /package/dist/{chunk-U4WAAZXJ.js.map → chunk-DVX4HDNP.js.map} +0 -0
  103. /package/dist/{chunk-CESGZRVQ.js.map → chunk-EMSMJRP3.js.map} +0 -0
  104. /package/dist/{chunk-IFX5KP65.js.map → chunk-EXVCVXFX.js.map} +0 -0
  105. /package/dist/{chunk-U3HGQHEO.js.map → chunk-H7CZRKN7.js.map} +0 -0
  106. /package/dist/{chunk-5ZC7CNU4.js.map → chunk-I2LMLQGQ.js.map} +0 -0
  107. /package/dist/{chunk-K6VEN5VN.js.map → chunk-K3PMMW23.js.map} +0 -0
  108. /package/dist/{chunk-YHPSPFU5.js.map → chunk-LIN4A2BW.js.map} +0 -0
  109. /package/dist/{chunk-LXMFHD7M.js.map → chunk-LTSVYILY.js.map} +0 -0
  110. /package/dist/{chunk-IEAPXS57.js.map → chunk-MW7P2C2C.js.map} +0 -0
  111. /package/dist/{chunk-JVTZ7FWR.js.map → chunk-NCI74EOS.js.map} +0 -0
  112. /package/dist/{chunk-IMCSY2SI.js.map → chunk-OKRITX4S.js.map} +0 -0
  113. /package/dist/{chunk-LRQT4MQO.js.map → chunk-PJNIJIE6.js.map} +0 -0
  114. /package/dist/{chunk-2WVHZIWP.js.map → chunk-QSRZOXQI.js.map} +0 -0
  115. /package/dist/{chunk-IF5UY3CT.js.map → chunk-QVDEGBME.js.map} +0 -0
  116. /package/dist/{chunk-XNMU32XC.js.map → chunk-TMUGBHHG.js.map} +0 -0
  117. /package/dist/{chunk-AWUFS2ZC.js.map → chunk-U2DRE36S.js.map} +0 -0
  118. /package/dist/{chunk-NEYZV6V5.js.map → chunk-UAOE3ZPC.js.map} +0 -0
  119. /package/dist/{chunk-VHGHF537.js.map → chunk-V4CWJ7Q6.js.map} +0 -0
  120. /package/dist/{chunk-3OL2TSEJ.js.map → chunk-WNNA6YYE.js.map} +0 -0
  121. /package/dist/{chunk-T6YTDEY4.js.map → chunk-WXZCNHBX.js.map} +0 -0
  122. /package/dist/{chunk-5XTPEA3O.js.map → chunk-ZHYLOB7Q.js.map} +0 -0
  123. /package/dist/{chunk-ARMKSYEQ.js.map → chunk-ZO2GZRZS.js.map} +0 -0
@@ -1,6 +1,3 @@
1
- import {
2
- geocode
3
- } from "./chunk-CB6DTWD5.js";
4
1
  import {
5
2
  CITY_ZOOM,
6
3
  CLICK_JITTER_DEGREES,
@@ -9,6 +6,9 @@ import {
9
6
  MAX_ZOOM,
10
7
  MIN_ZOOM
11
8
  } from "./chunk-H2J2MTRE.js";
9
+ import {
10
+ geocode
11
+ } from "./chunk-CB6DTWD5.js";
12
12
 
13
13
  // src/components/data-display/MapPreview/MapPreview.hooks.ts
14
14
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -186,4 +186,4 @@ export {
186
186
  useMapSearch,
187
187
  useMapClick
188
188
  };
189
- //# sourceMappingURL=chunk-JKIKHWD2.js.map
189
+ //# sourceMappingURL=chunk-5NT2M2JI.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  GridShell
3
- } from "./chunk-XMWTVDQN.js";
3
+ } from "./chunk-B32554CQ.js";
4
4
  import {
5
5
  useDataViewsState
6
- } from "./chunk-U3HGQHEO.js";
6
+ } from "./chunk-H7CZRKN7.js";
7
7
 
8
8
  // src/components/data-display/DataViews/DataViewsGrid.tsx
9
9
  import { useEffect, useRef } from "react";
@@ -27,4 +27,4 @@ function DataViewsGrid(props) {
27
27
  export {
28
28
  DataViewsGrid
29
29
  };
30
- //# sourceMappingURL=chunk-I7JUAHUO.js.map
30
+ //# sourceMappingURL=chunk-65KJLPF5.js.map
@@ -28,7 +28,7 @@ import {
28
28
  } from "./chunk-KHG57NAE.js";
29
29
  import {
30
30
  DataGrid
31
- } from "./chunk-OA6T2ME3.js";
31
+ } from "./chunk-BLZDSCIZ.js";
32
32
  import {
33
33
  default as default2
34
34
  } from "./chunk-6DPAWXZ3.js";
@@ -250,4 +250,4 @@ function GridMain(props) {
250
250
  export {
251
251
  GridMain
252
252
  };
253
- //# sourceMappingURL=chunk-C74PDNTF.js.map
253
+ //# sourceMappingURL=chunk-67ADHGA2.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- DataViewsGrid
3
- } from "./chunk-I7JUAHUO.js";
4
1
  import {
5
2
  DeleteViewDialog
6
3
  } from "./chunk-CPZGFIFH.js";
4
+ import {
5
+ DataViewsGrid
6
+ } from "./chunk-65KJLPF5.js";
7
7
  import {
8
8
  viewStateKey
9
9
  } from "./chunk-ZOLAYP2D.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  ViewDialogs,
16
16
  ViewMutationErrorAlert
17
- } from "./chunk-T6QVM5Q5.js";
17
+ } from "./chunk-4LUWZ6UE.js";
18
18
  import {
19
19
  useSavedViewsController
20
20
  } from "./chunk-B2JSUFDX.js";
@@ -166,4 +166,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
166
166
  export {
167
167
  DataViewsTableBase
168
168
  };
169
- //# sourceMappingURL=chunk-ZLVRCQPG.js.map
169
+ //# sourceMappingURL=chunk-A5CKUJP2.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ labelOrder,
3
+ placeLabels
4
+ } from "./chunk-J3AWGTJY.js";
1
5
  import {
2
6
  labelPosition
3
7
  } from "./chunk-COOSJKZL.js";
@@ -26,7 +30,9 @@ function RegionMapDrawing({
26
30
  const { view, drawn } = model;
27
31
  const wanted = new Set(highlightedIds);
28
32
  const highlighted = drawn.filter((d) => wanted.has(d.id));
29
- const labelled = [...drawn.filter((d) => d.excluded), ...highlighted.filter((d) => !d.excluded)];
33
+ const labelled = labelOrder(drawn.filter((d) => d.excluded || wanted.has(d.id)), wanted);
34
+ const boxRef = React.useRef(null);
35
+ useLabelPlacement(boxRef, labelled.map((d) => d.id).join("|"), remPx(theme, 4));
30
36
  const base = drawn.map((d) => ({ id: d.id, name: d.name, geometry: d.geometry, outside: d.outside === true }));
31
37
  return /* @__PURE__ */ jsxs(
32
38
  Box,
@@ -44,6 +50,7 @@ function RegionMapDrawing({
44
50
  bgcolor: "background.paper"
45
51
  },
46
52
  "data-testid": `${testId}-canvas`,
53
+ ref: boxRef,
47
54
  children: [
48
55
  /* @__PURE__ */ jsxs(
49
56
  "svg",
@@ -59,20 +66,7 @@ function RegionMapDrawing({
59
66
  /* @__PURE__ */ jsx(BaseAreas, { areas: base, testId, theme }),
60
67
  /* @__PURE__ */ jsx(ExcludedAreas, { drawn, hatchId, testId, theme }),
61
68
  /* @__PURE__ */ jsx(Circles, { radii: model.radii, theme }),
62
- highlighted.map((d) => /* @__PURE__ */ jsx(
63
- "path",
64
- {
65
- d: d.geometry.path,
66
- fillRule: "evenodd",
67
- vectorEffect: "non-scaling-stroke",
68
- fill: alpha(theme.palette.primary.main, 0.3),
69
- stroke: theme.palette.primary.main,
70
- strokeWidth: 2.5,
71
- pointerEvents: "none",
72
- "data-testid": `${testId}-highlight-${d.id}`
73
- },
74
- `h-${d.id}`
75
- )),
69
+ /* @__PURE__ */ jsx(Highlights, { areas: highlighted, testId, theme }),
76
70
  showCenter && /* @__PURE__ */ jsx(
77
71
  "circle",
78
72
  {
@@ -95,6 +89,26 @@ function RegionMapDrawing({
95
89
  }
96
90
  );
97
91
  }
92
+ function Highlights({
93
+ areas,
94
+ testId,
95
+ theme
96
+ }) {
97
+ return /* @__PURE__ */ jsx(Fragment, { children: areas.map((d) => /* @__PURE__ */ jsx(
98
+ "path",
99
+ {
100
+ d: d.geometry.path,
101
+ fillRule: "evenodd",
102
+ vectorEffect: "non-scaling-stroke",
103
+ fill: alpha(theme.palette.primary.main, 0.3),
104
+ stroke: theme.palette.primary.main,
105
+ strokeWidth: 2.5,
106
+ pointerEvents: "none",
107
+ "data-testid": `${testId}-highlight-${d.id}`
108
+ },
109
+ `h-${d.id}`
110
+ )) });
111
+ }
98
112
  function Hatch({ id, pitch, theme }) {
99
113
  return /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("pattern", { id, width: pitch, height: pitch, patternUnits: "userSpaceOnUse", patternTransform: "rotate(45)", children: [
100
114
  /* @__PURE__ */ jsx("rect", { width: pitch, height: pitch, fill: alpha(theme.palette.text.primary, 0.1) }),
@@ -164,9 +178,38 @@ function Circles({ radii, theme }) {
164
178
  radius
165
179
  )) });
166
180
  }
167
- function clampCentre(wanted, half, span, gap) {
168
- if (span <= 2 * (half + gap)) return span / 2;
169
- return Math.min(span - half - gap, Math.max(half + gap, wanted));
181
+ function useLabelPlacement(boxRef, key, gap) {
182
+ React.useEffect(() => {
183
+ const box = boxRef.current;
184
+ if (!box || typeof ResizeObserver === "undefined") return void 0;
185
+ const labels = Array.from(box.querySelectorAll("[data-region-label]"));
186
+ const place = () => {
187
+ const spanX = box.clientWidth;
188
+ const spanY = box.clientHeight;
189
+ if (spanX === 0 || spanY === 0) return;
190
+ const placed = placeLabels(
191
+ labels.map((label) => ({
192
+ fractionX: Number(label.dataset.fractionX),
193
+ fractionY: Number(label.dataset.fractionY),
194
+ spanX: label.offsetWidth,
195
+ spanY: label.offsetHeight
196
+ })),
197
+ { spanX, spanY },
198
+ gap
199
+ );
200
+ placed.forEach(({ x, y, visible }, index) => {
201
+ const label = labels[index];
202
+ label.style.left = `${x / spanX * 100}%`;
203
+ label.style.top = `${y / spanY * 100}%`;
204
+ label.style.visibility = visible ? "visible" : "hidden";
205
+ label.dataset.hidden = visible ? "false" : "true";
206
+ });
207
+ };
208
+ const observer = new ResizeObserver(place);
209
+ observer.observe(box);
210
+ for (const label of labels) observer.observe(label);
211
+ return () => observer.disconnect();
212
+ }, [boxRef, key, gap]);
170
213
  }
171
214
  function AreaLabel({
172
215
  area,
@@ -175,38 +218,24 @@ function AreaLabel({
175
218
  theme
176
219
  }) {
177
220
  const at = labelPosition(area.geometry.rings, view);
178
- const ref = React.useRef(null);
179
- const gap = remPx(theme, 4);
180
- React.useEffect(() => {
181
- const label = ref.current;
182
- const box = label?.parentElement;
183
- if (!label || !box || typeof ResizeObserver === "undefined") return void 0;
184
- const observer = new ResizeObserver(() => {
185
- const width = box.clientWidth;
186
- const height = box.clientHeight;
187
- if (width === 0 || height === 0) return;
188
- const x = clampCentre(at.fractionX * width, label.offsetWidth / 2, width, gap);
189
- const y = clampCentre(at.fractionY * height, label.offsetHeight / 2, height, gap);
190
- label.style.left = `${x / width * 100}%`;
191
- label.style.top = `${y / height * 100}%`;
192
- });
193
- observer.observe(box);
194
- observer.observe(label);
195
- return () => observer.disconnect();
196
- }, [at.fractionX, at.fractionY, gap]);
197
221
  const halo = `0 0 ${rem(theme, 3)} ${theme.palette.background.paper}`;
198
222
  return /* @__PURE__ */ jsx(
199
223
  Typography,
200
224
  {
201
- ref,
202
225
  component: "span",
203
226
  "aria-hidden": true,
204
227
  "data-testid": `${testId}-label-${area.id}`,
205
- style: { left: `${(at.fractionX * 100).toFixed(2)}%`, top: `${(at.fractionY * 100).toFixed(2)}%` },
228
+ "data-region-label": "",
229
+ "data-fraction-x": at.fractionX,
230
+ "data-fraction-y": at.fractionY,
231
+ style: {
232
+ left: `${(at.fractionX * 100).toFixed(2)}%`,
233
+ top: `${(at.fractionY * 100).toFixed(2)}%`
234
+ },
206
235
  sx: {
207
236
  position: "absolute",
208
237
  transform: "translate(-50%, -50%)",
209
- fontSize: rem(theme, 11),
238
+ fontSize: rem(theme, 12),
210
239
  fontWeight: 700,
211
240
  lineHeight: 1.1,
212
241
  textAlign: "center",
@@ -223,4 +252,4 @@ function AreaLabel({
223
252
  export {
224
253
  RegionMapDrawing
225
254
  };
226
- //# sourceMappingURL=chunk-A63WU4UZ.js.map
255
+ //# sourceMappingURL=chunk-AKE6KVQG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMapDrawing.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, type Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { rem, remPx } from '../../../tokens/relative';\n\nimport { labelPosition, type AreaGeometry, type DrawnRegion, type PlaneBox } from './RegionMap.helpers';\nimport type { RegionMapModel } from './RegionMap.hooks';\nimport { labelOrder, placeLabels } from './RegionMap.labels';\n\nexport interface RegionMapDrawingProps {\n model: RegionMapModel & { view: PlaneBox };\n showCenter: boolean;\n highlightedIds: readonly string[];\n maxHeight: string | undefined;\n label: string;\n tappable: boolean;\n testId: string;\n theme: Theme;\n}\n\n/**\n * The drawing: one `role=\"img\"`, square, with HTML labels laid over it.\n *\n * Strokes are `non-scaling-stroke` and labels are HTML at theme sizes, so the\n * picture reads the same at 320 px and 1600 px; `maxHeight` caps it on a wide\n * screen. Where it sits in a wider box is the host's call.\n *\n * The base areas are a memoised layer: a toggle changes `excluded`, not the\n * geometry, so only the hatch, highlight and label layers re-render.\n */\nexport function RegionMapDrawing({\n model,\n showCenter,\n highlightedIds,\n maxHeight,\n label,\n tappable,\n testId,\n theme,\n}: RegionMapDrawingProps): React.JSX.Element {\n const hatchId = `${React.useId().replace(/:/g, '')}-hatch`;\n const { view, drawn } = model;\n const wanted = new Set(highlightedIds);\n const highlighted = drawn.filter((d) => wanted.has(d.id));\n // Highlighted, then excluded, then larger, then by name: the order labels\n // claim their place in, so a collision hides the less important one.\n const labelled = labelOrder(drawn.filter((d) => d.excluded || wanted.has(d.id)), wanted);\n const boxRef = React.useRef<HTMLDivElement>(null);\n useLabelPlacement(boxRef, labelled.map((d) => d.id).join('|'), remPx(theme, 4));\n const base = drawn.map((d) => ({ id: d.id, name: d.name, geometry: d.geometry, outside: d.outside === true }));\n return (\n <Box\n sx={{\n position: 'relative',\n width: '100%',\n maxWidth: maxHeight,\n maxHeight,\n aspectRatio: '1 / 1',\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n overflow: 'hidden',\n bgcolor: 'background.paper',\n }}\n data-testid={`${testId}-canvas`}\n ref={boxRef}\n >\n <svg\n viewBox={`${view.minX} ${view.minY} ${view.spanX} ${view.spanY}`}\n role=\"img\"\n aria-label={label}\n onPointerDown={model.onPointerDown}\n onClick={model.onClick}\n style={{ display: 'block', width: '100%', height: '100%', cursor: tappable ? 'pointer' : 'default' }}\n >\n <Hatch id={hatchId} pitch={view.spanX / 70} theme={theme} />\n <BaseAreas areas={base} testId={testId} theme={theme} />\n <ExcludedAreas drawn={drawn} hatchId={hatchId} testId={testId} theme={theme} />\n <Circles radii={model.radii} theme={theme} />\n <Highlights areas={highlighted} testId={testId} theme={theme} />\n {showCenter && (\n <circle\n cx={0}\n cy={0}\n r={view.spanX / 90}\n fill={theme.palette.primary.main}\n stroke={theme.palette.background.paper}\n strokeWidth={2}\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n data-testid={`${testId}-center`}\n />\n )}\n </svg>\n {labelled.map((d) => (\n <AreaLabel key={`l-${d.id}`} area={d} view={view} testId={testId} theme={theme} />\n ))}\n </Box>\n );\n}\n\n/** The highlighted areas, drawn over everything but the centre. */\nfunction Highlights({\n areas,\n testId,\n theme,\n}: {\n areas: readonly DrawnRegion[];\n testId: string;\n theme: Theme;\n}): React.JSX.Element {\n return (\n <>\n {areas.map((d) => (\n <path\n key={`h-${d.id}`}\n d={d.geometry.path}\n fillRule=\"evenodd\"\n vectorEffect=\"non-scaling-stroke\"\n fill={alpha(theme.palette.primary.main, 0.3)}\n stroke={theme.palette.primary.main}\n strokeWidth={2.5}\n pointerEvents=\"none\"\n data-testid={`${testId}-highlight-${d.id}`}\n />\n ))}\n </>\n );\n}\n\n/** The hatch an excluded area is filled with: lines, not a colour. */\nfunction Hatch({ id, pitch, theme }: { id: string; pitch: number; theme: Theme }): React.JSX.Element {\n return (\n <defs>\n <pattern id={id} width={pitch} height={pitch} patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">\n <rect width={pitch} height={pitch} fill={alpha(theme.palette.text.primary, 0.1)} />\n <rect width={pitch / 3} height={pitch} fill={theme.palette.text.secondary} />\n </pattern>\n </defs>\n );\n}\n\ninterface BaseArea {\n id: string;\n name: string;\n geometry: AreaGeometry;\n outside: boolean;\n}\n\ninterface BaseAreasProps {\n areas: readonly BaseArea[];\n testId: string;\n theme: Theme;\n}\n\n/** Same areas, same geometry objects, same look: nothing to re-render. */\nfunction sameBase(a: BaseAreasProps, b: BaseAreasProps): boolean {\n if (a.theme !== b.theme || a.testId !== b.testId || a.areas.length !== b.areas.length) return false;\n return a.areas.every((area, i) => {\n const other = b.areas[i]!;\n return (\n area.id === other.id &&\n area.geometry === other.geometry &&\n area.outside === other.outside &&\n area.name === other.name\n );\n });\n}\n\n/** Every area's fill and border — the tap targets. Memoised: see `sameBase`. */\nconst BaseAreas = React.memo(function BaseAreas({ areas, testId, theme }: BaseAreasProps): React.JSX.Element {\n const { palette } = theme;\n return (\n <>\n {areas.map((d) => (\n <path\n key={d.id}\n d={d.geometry.path}\n fillRule=\"evenodd\"\n vectorEffect=\"non-scaling-stroke\"\n fill={d.outside ? palette.background.paper : palette.action.hover}\n stroke={palette.divider}\n strokeWidth={1}\n data-region-id={d.id}\n data-testid={`${testId}-area-${d.id}`}\n >\n <title>{d.name}</title>\n </path>\n ))}\n </>\n );\n}, sameBase);\n\n/** The hatch over every excluded area. */\nfunction ExcludedAreas({\n drawn,\n hatchId,\n testId,\n theme,\n}: {\n drawn: readonly DrawnRegion[];\n hatchId: string;\n testId: string;\n theme: Theme;\n}): React.JSX.Element {\n return (\n <>\n {drawn\n .filter((d) => d.excluded)\n .map((d) => (\n <path\n key={`x-${d.id}`}\n d={d.geometry.path}\n fillRule=\"evenodd\"\n vectorEffect=\"non-scaling-stroke\"\n fill={`url(#${hatchId})`}\n stroke={theme.palette.text.secondary}\n strokeWidth={1.5}\n pointerEvents=\"none\"\n data-testid={`${testId}-excluded-${d.id}`}\n />\n ))}\n </>\n );\n}\n\n/** The dashed circles around the centre. */\nfunction Circles({ radii, theme }: { radii: readonly number[]; theme: Theme }): React.JSX.Element {\n return (\n <>\n {radii.map((radius) => (\n <circle\n key={radius}\n cx={0}\n cy={0}\n r={radius}\n fill=\"none\"\n stroke={theme.palette.info.main}\n strokeWidth={1.75}\n strokeDasharray=\"7 5\"\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />\n ))}\n </>\n );\n}\n\n/**\n * Places every label the drawing carries, in their DOM order (the priority\n * order), and hides one that would overlap a label already drawn\n * (`placeLabels`). Measured by a ResizeObserver, never in a layout effect: its\n * first call comes after the browser's own layout, so mounting a label on a\n * tap forces no synchronous reflow of the drawing.\n */\nfunction useLabelPlacement(boxRef: React.RefObject<HTMLDivElement | null>, key: string, gap: number): void {\n React.useEffect(() => {\n const box = boxRef.current;\n if (!box || typeof ResizeObserver === 'undefined') return undefined;\n const labels = Array.from(box.querySelectorAll<HTMLElement>('[data-region-label]'));\n const place = (): void => {\n const spanX = box.clientWidth;\n const spanY = box.clientHeight;\n if (spanX === 0 || spanY === 0) return;\n const placed = placeLabels(\n labels.map((label) => ({\n fractionX: Number(label.dataset.fractionX),\n fractionY: Number(label.dataset.fractionY),\n spanX: label.offsetWidth,\n spanY: label.offsetHeight,\n })),\n { spanX, spanY },\n gap,\n );\n placed.forEach(({ x, y, visible }, index) => {\n const label = labels[index]!;\n label.style.left = `${(x / spanX) * 100}%`;\n label.style.top = `${(y / spanY) * 100}%`;\n label.style.visibility = visible ? 'visible' : 'hidden';\n label.dataset.hidden = visible ? 'false' : 'true';\n });\n };\n const observer = new ResizeObserver(place);\n observer.observe(box);\n for (const label of labels) observer.observe(label);\n return () => observer.disconnect();\n }, [boxRef, key, gap]);\n}\n\n/**\n * An area's name over the drawing, at the theme's type size whatever the\n * width. Placed — and hidden on a collision — by {@link useLabelPlacement}.\n * Decorative (`aria-hidden`): the area's name is its `<title>` and its row in\n * the list.\n */\nfunction AreaLabel({\n area,\n view,\n testId,\n theme,\n}: {\n area: DrawnRegion;\n view: PlaneBox;\n testId: string;\n theme: Theme;\n}): React.JSX.Element {\n const at = labelPosition(area.geometry.rings, view);\n const halo = `0 0 ${rem(theme, 3)} ${theme.palette.background.paper}`;\n return (\n <Typography\n component=\"span\"\n aria-hidden\n data-testid={`${testId}-label-${area.id}`}\n data-region-label=\"\"\n data-fraction-x={at.fractionX}\n data-fraction-y={at.fractionY}\n // Position as an inline style, not `sx`: a per-label class would insert\n // a new CSS rule (and a style recalculation) on every tap.\n style={{\n left: `${(at.fractionX * 100).toFixed(2)}%`,\n top: `${(at.fractionY * 100).toFixed(2)}%`,\n }}\n sx={{\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n fontSize: rem(theme, 12),\n fontWeight: 700,\n lineHeight: 1.1,\n textAlign: 'center',\n maxWidth: '45%',\n color: 'text.primary',\n pointerEvents: 'none',\n textShadow: `${halo}, ${halo}`,\n }}\n >\n {area.name}\n </Typography>\n );\n}\n"],"mappings":"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","names":["BaseAreas"]}
@@ -1,19 +1,22 @@
1
1
  import {
2
2
  ShellEmpty
3
3
  } from "./chunk-NTRWUDP6.js";
4
+ import {
5
+ InlineFilterControls
6
+ } from "./chunk-52RHAAIH.js";
4
7
  import {
5
8
  GridHeaderRow
6
9
  } from "./chunk-X3AFXHY5.js";
7
10
  import {
8
11
  GridMain
9
- } from "./chunk-C74PDNTF.js";
12
+ } from "./chunk-67ADHGA2.js";
10
13
  import {
11
14
  FilterDialog,
12
15
  GridFilterPanel
13
16
  } from "./chunk-OPY2AGAU.js";
14
17
  import {
15
- InlineFilterControls
16
- } from "./chunk-52RHAAIH.js";
18
+ DataViewsPagination
19
+ } from "./chunk-K6WY2CHG.js";
17
20
  import {
18
21
  useFilterOverflow
19
22
  } from "./chunk-WWH674WU.js";
@@ -21,30 +24,27 @@ import {
21
24
  toOverflowFields,
22
25
  toggleQuick
23
26
  } from "./chunk-KYUEO2IO.js";
24
- import {
25
- DataViewsPagination
26
- } from "./chunk-K6WY2CHG.js";
27
27
  import {
28
28
  allOnPageSelected,
29
29
  resolveSelectionExtra
30
30
  } from "./chunk-5YDS6HO3.js";
31
31
  import {
32
32
  ScopeTabsSlot
33
- } from "./chunk-K6VEN5VN.js";
33
+ } from "./chunk-K3PMMW23.js";
34
34
  import {
35
35
  ShellToolbar
36
- } from "./chunk-5ZC7CNU4.js";
36
+ } from "./chunk-I2LMLQGQ.js";
37
37
  import {
38
38
  SHELL_PROPS,
39
39
  useStickyBarTop
40
40
  } from "./chunk-4IE66GY2.js";
41
+ import {
42
+ togglePillValues
43
+ } from "./chunk-WTOA52EQ.js";
41
44
  import {
42
45
  DataViewsLayoutProvider,
43
46
  useDataViewsLayout
44
47
  } from "./chunk-5CAWRMDX.js";
45
- import {
46
- togglePillValues
47
- } from "./chunk-WTOA52EQ.js";
48
48
  import {
49
49
  useDataViewsCopy
50
50
  } from "./chunk-KHG57NAE.js";
@@ -252,4 +252,4 @@ function GridShell(props) {
252
252
  export {
253
253
  GridShell
254
254
  };
255
- //# sourceMappingURL=chunk-XMWTVDQN.js.map
255
+ //# sourceMappingURL=chunk-B32554CQ.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ useDataGridModel
3
+ } from "./chunk-LDROG4QI.js";
1
4
  import {
2
5
  GridBody,
3
6
  GridHeader
@@ -7,9 +10,6 @@ import {
7
10
  DataGridError,
8
11
  DataGridLoading
9
12
  } from "./chunk-EARWC6PD.js";
10
- import {
11
- useDataGridModel
12
- } from "./chunk-LDROG4QI.js";
13
13
 
14
14
  // src/components/data-display/DataGrid/DataGrid.tsx
15
15
  import Paper from "@mui/material/Paper/index.js";
@@ -120,4 +120,4 @@ export {
120
120
  DataGrid,
121
121
  GRID_ONLY_PROPS
122
122
  };
123
- //# sourceMappingURL=chunk-OA6T2ME3.js.map
123
+ //# sourceMappingURL=chunk-BLZDSCIZ.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  resolveMapCopy
3
3
  } from "./chunk-CSGBHYW6.js";
4
- import {
5
- MARKER_PIXELS_PER_DEGREE
6
- } from "./chunk-H2J2MTRE.js";
7
4
  import {
8
5
  bounceKeyframes
9
6
  } from "./chunk-4YYFZ6TE.js";
7
+ import {
8
+ MARKER_PIXELS_PER_DEGREE
9
+ } from "./chunk-H2J2MTRE.js";
10
10
  import {
11
11
  shadowInk
12
12
  } from "./chunk-XJAD6E3V.js";
@@ -85,4 +85,4 @@ export {
85
85
  MapMarkers,
86
86
  MapCoordinates
87
87
  };
88
- //# sourceMappingURL=chunk-OZYUE2BI.js.map
88
+ //# sourceMappingURL=chunk-CJUK32UH.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ LightboxOverlay
3
+ } from "./chunk-T2G4LDU5.js";
1
4
  import {
2
5
  LightboxCurrentMedia
3
6
  } from "./chunk-RBGUS7WO.js";
@@ -10,15 +13,12 @@ import {
10
13
  import {
11
14
  LightboxThumbnails
12
15
  } from "./chunk-BP3ZKIPE.js";
13
- import {
14
- LightboxStage
15
- } from "./chunk-SYGM4SHY.js";
16
- import {
17
- LightboxOverlay
18
- } from "./chunk-T2G4LDU5.js";
19
16
  import {
20
17
  LightboxCopyProvider
21
18
  } from "./chunk-TEQYTEM2.js";
19
+ import {
20
+ LightboxStage
21
+ } from "./chunk-SYGM4SHY.js";
22
22
  import {
23
23
  makeTestId
24
24
  } from "./chunk-VQU3CBAL.js";
@@ -148,4 +148,4 @@ export {
148
148
  Lightbox,
149
149
  Lightbox_default
150
150
  };
151
- //# sourceMappingURL=chunk-HWPQKHN2.js.map
151
+ //# sourceMappingURL=chunk-COKPPU42.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCardActions
3
- } from "./chunk-LRQT4MQO.js";
3
+ } from "./chunk-PJNIJIE6.js";
4
4
  import {
5
5
  ConfirmActionDialog
6
6
  } from "./chunk-7W5X3KQ2.js";
@@ -50,4 +50,4 @@ function useRemoveConfirm({
50
50
  export {
51
51
  useRemoveConfirm
52
52
  };
53
- //# sourceMappingURL=chunk-U4WAAZXJ.js.map
53
+ //# sourceMappingURL=chunk-DVX4HDNP.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- TILE_WORLD_UNITS
3
- } from "./chunk-CB6DTWD5.js";
4
1
  import {
5
2
  tileBackground
6
3
  } from "./chunk-4YYFZ6TE.js";
4
+ import {
5
+ TILE_WORLD_UNITS
6
+ } from "./chunk-CB6DTWD5.js";
7
7
  import {
8
8
  rem
9
9
  } from "./chunk-YKCAJ2TN.js";
@@ -68,4 +68,4 @@ var MapTiles = ({ origin, zoom, mapType, panOffset }) => {
68
68
  export {
69
69
  MapTiles
70
70
  };
71
- //# sourceMappingURL=chunk-CESGZRVQ.js.map
71
+ //# sourceMappingURL=chunk-EMSMJRP3.js.map
@@ -5,12 +5,12 @@ import {
5
5
  import {
6
6
  MapControlBar
7
7
  } from "./chunk-6WHIJPEF.js";
8
- import {
9
- MapSearchBar
10
- } from "./chunk-MIUPTZS6.js";
11
8
  import {
12
9
  resolveMapCopy
13
10
  } from "./chunk-CSGBHYW6.js";
11
+ import {
12
+ MapSearchBar
13
+ } from "./chunk-MIUPTZS6.js";
14
14
  import {
15
15
  HEATMAP_VIEWBOX
16
16
  } from "./chunk-H2J2MTRE.js";
@@ -59,4 +59,4 @@ var MapLayers = ({ settings, zoom, mapType, search, controls }) => {
59
59
  export {
60
60
  MapLayers
61
61
  };
62
- //# sourceMappingURL=chunk-IFX5KP65.js.map
62
+ //# sourceMappingURL=chunk-EXVCVXFX.js.map
@@ -5,6 +5,9 @@ import {
5
5
  import {
6
6
  filterRows
7
7
  } from "./chunk-YGQX7BNI.js";
8
+ import {
9
+ useSelection
10
+ } from "./chunk-LLZWB32X.js";
8
11
  import {
9
12
  resolveScope,
10
13
  useScopeConfigChecks
@@ -17,9 +20,6 @@ import {
17
20
  serverDerived,
18
21
  useServerQuery
19
22
  } from "./chunk-IMLIIW77.js";
20
- import {
21
- useSelection
22
- } from "./chunk-LLZWB32X.js";
23
23
  import {
24
24
  useClearFilters,
25
25
  useStateWriters
@@ -178,4 +178,4 @@ function useDataViewsState({
178
178
  export {
179
179
  useDataViewsState
180
180
  };
181
- //# sourceMappingURL=chunk-U3HGQHEO.js.map
181
+ //# sourceMappingURL=chunk-H7CZRKN7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GridToolbar
3
- } from "./chunk-AWUFS2ZC.js";
3
+ } from "./chunk-U2DRE36S.js";
4
4
 
5
5
  // src/components/data-display/DataViews/data-views-shell-toolbar.tsx
6
6
  import { jsx } from "react/jsx-runtime";
@@ -68,4 +68,4 @@ function ShellToolbar({
68
68
  export {
69
69
  ShellToolbar
70
70
  };
71
- //# sourceMappingURL=chunk-5ZC7CNU4.js.map
71
+ //# sourceMappingURL=chunk-I2LMLQGQ.js.map
@@ -0,0 +1,29 @@
1
+ // src/components/data-display/RegionMap/RegionMap.labels.ts
2
+ function clampCentre(wanted, half, span, gap) {
3
+ if (span <= 2 * (half + gap)) return span / 2;
4
+ return Math.min(span - half - gap, Math.max(half + gap, wanted));
5
+ }
6
+ function labelOrder(areas, highlighted) {
7
+ const rank = (area) => highlighted.has(area.id) ? 0 : area.excluded ? 1 : 2;
8
+ return [...areas].sort(
9
+ (a, b) => rank(a) - rank(b) || b.geometry.area - a.geometry.area || a.name.localeCompare(b.name)
10
+ );
11
+ }
12
+ function placeLabels(labels, box, gap) {
13
+ const kept = [];
14
+ return labels.map((label) => {
15
+ const x = clampCentre(label.fractionX * box.spanX, label.spanX / 2, box.spanX, gap);
16
+ const y = clampCentre(label.fractionY * box.spanY, label.spanY / 2, box.spanY, gap);
17
+ const rect = { x0: x - label.spanX / 2, y0: y - label.spanY / 2, x1: x + label.spanX / 2, y1: y + label.spanY / 2 };
18
+ const visible = !kept.some((o) => rect.x0 < o.x1 && o.x0 < rect.x1 && rect.y0 < o.y1 && o.y0 < rect.y1);
19
+ if (visible) kept.push(rect);
20
+ return { x, y, visible };
21
+ });
22
+ }
23
+
24
+ export {
25
+ clampCentre,
26
+ labelOrder,
27
+ placeLabels
28
+ };
29
+ //# sourceMappingURL=chunk-J3AWGTJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.labels.ts"],"sourcesContent":["// How the labels over a RegionMap drawing are ranked and laid out.\n\n/** Where a label's centre may go along one axis so the whole label stays in view. */\nexport function clampCentre(wanted: number, half: number, span: number, gap: number): number {\n if (span <= 2 * (half + gap)) return span / 2;\n return Math.min(span - half - gap, Math.max(half + gap, wanted));\n}\n\n/** An area that may carry a label, as {@link labelOrder} ranks it. */\ninterface Labelable {\n id: string;\n name: string;\n excluded?: boolean;\n geometry: { area: number };\n}\n\n/**\n * The order labels claim their place in: highlighted first (what the person is\n * looking for), then excluded, then the larger area, then by name. When two\n * labels would overlap, the earlier one is drawn and the later one hidden.\n */\nexport function labelOrder<T extends Labelable>(areas: readonly T[], highlighted: ReadonlySet<string>): T[] {\n const rank = (area: T): number => (highlighted.has(area.id) ? 0 : area.excluded ? 1 : 2);\n return [...areas].sort(\n (a, b) => rank(a) - rank(b) || b.geometry.area - a.geometry.area || a.name.localeCompare(b.name),\n );\n}\n\n/** A label measured in the drawing: where it wants to be (fractions), and its size in px. */\nexport interface LabelBox {\n fractionX: number;\n fractionY: number;\n spanX: number;\n spanY: number;\n}\n\n/** Where each label goes, in px, and whether it is drawn at all. */\nexport interface PlacedLabel {\n x: number;\n y: number;\n visible: boolean;\n}\n\n/**\n * Lay labels out in priority order ({@link labelOrder}): each is pulled inside\n * the drawing by its own size, and one whose box would overlap a label already\n * drawn is hidden — the area keeps its name in its `<title>` and in the list,\n * so hiding costs nothing but the clutter two names over each other made.\n */\nexport function placeLabels(labels: readonly LabelBox[], box: { spanX: number; spanY: number }, gap: number): PlacedLabel[] {\n const kept: { x0: number; y0: number; x1: number; y1: number }[] = [];\n return labels.map((label) => {\n const x = clampCentre(label.fractionX * box.spanX, label.spanX / 2, box.spanX, gap);\n const y = clampCentre(label.fractionY * box.spanY, label.spanY / 2, box.spanY, gap);\n const rect = { x0: x - label.spanX / 2, y0: y - label.spanY / 2, x1: x + label.spanX / 2, y1: y + label.spanY / 2 };\n const visible = !kept.some((o) => rect.x0 < o.x1 && o.x0 < rect.x1 && rect.y0 < o.y1 && o.y0 < rect.y1);\n if (visible) kept.push(rect);\n return { x, y, visible };\n });\n}\n"],"mappings":";AAGO,SAAS,YAAY,QAAgB,MAAc,MAAc,KAAqB;AAC3F,MAAI,QAAQ,KAAK,OAAO,KAAM,QAAO,OAAO;AAC5C,SAAO,KAAK,IAAI,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;AACjE;AAeO,SAAS,WAAgC,OAAqB,aAAuC;AAC1G,QAAM,OAAO,CAAC,SAAqB,YAAY,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,WAAW,IAAI;AACtF,SAAO,CAAC,GAAG,KAAK,EAAE;AAAA,IAChB,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,SAAS,QAAQ,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACjG;AACF;AAuBO,SAAS,YAAY,QAA6B,KAAuC,KAA4B;AAC1H,QAAM,OAA6D,CAAC;AACpE,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,IAAI,YAAY,MAAM,YAAY,IAAI,OAAO,MAAM,QAAQ,GAAG,IAAI,OAAO,GAAG;AAClF,UAAM,IAAI,YAAY,MAAM,YAAY,IAAI,OAAO,MAAM,QAAQ,GAAG,IAAI,OAAO,GAAG;AAClF,UAAM,OAAO,EAAE,IAAI,IAAI,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,QAAQ,EAAE;AAClH,UAAM,UAAU,CAAC,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,MAAM,EAAE,KAAK,KAAK,MAAM,KAAK,KAAK,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE;AACtG,QAAI,QAAS,MAAK,KAAK,IAAI;AAC3B,WAAO,EAAE,GAAG,GAAG,QAAQ;AAAA,EACzB,CAAC;AACH;","names":[]}
@@ -1,9 +1,9 @@
1
- import {
2
- useDataViewsLayout
3
- } from "./chunk-5CAWRMDX.js";
4
1
  import {
5
2
  DataViewsScopeTabs
6
3
  } from "./chunk-PL2AB5HJ.js";
4
+ import {
5
+ useDataViewsLayout
6
+ } from "./chunk-5CAWRMDX.js";
7
7
 
8
8
  // src/components/data-display/DataViews/data-views-scope-tabs.tsx
9
9
  import { jsx } from "react/jsx-runtime";
@@ -34,4 +34,4 @@ function ScopeTabsSlot({
34
34
  export {
35
35
  ScopeTabsSlot
36
36
  };
37
- //# sourceMappingURL=chunk-K6VEN5VN.js.map
37
+ //# sourceMappingURL=chunk-K3PMMW23.js.map
@@ -13,15 +13,15 @@ import {
13
13
  rowStyles,
14
14
  useRowShell
15
15
  } from "./chunk-UMOHHWXY.js";
16
- import {
17
- useDisclosure
18
- } from "./chunk-2JCRNWHE.js";
19
16
  import {
20
17
  ListCardActions,
21
18
  ListCardCaption,
22
19
  ListCardMeta,
23
20
  ListCardTail
24
21
  } from "./chunk-CSJ7WNXU.js";
22
+ import {
23
+ useDisclosure
24
+ } from "./chunk-2JCRNWHE.js";
25
25
  import {
26
26
  DropIndicator
27
27
  } from "./chunk-K4EKTMTC.js";
@@ -185,4 +185,4 @@ function BaseListCard(props) {
185
185
  export {
186
186
  BaseListCard
187
187
  };
188
- //# sourceMappingURL=chunk-YHPSPFU5.js.map
188
+ //# sourceMappingURL=chunk-LIN4A2BW.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- getScaleDistance
3
- } from "./chunk-CB6DTWD5.js";
4
1
  import {
5
2
  bounceKeyframes
6
3
  } from "./chunk-4YYFZ6TE.js";
4
+ import {
5
+ getScaleDistance
6
+ } from "./chunk-CB6DTWD5.js";
7
7
  import {
8
8
  shadowInk
9
9
  } from "./chunk-XJAD6E3V.js";
@@ -171,4 +171,4 @@ export {
171
171
  MapScaleBar,
172
172
  MapCompass
173
173
  };
174
- //# sourceMappingURL=chunk-LXMFHD7M.js.map
174
+ //# sourceMappingURL=chunk-LTSVYILY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MapPreview
3
- } from "./chunk-IMCSY2SI.js";
3
+ } from "./chunk-OKRITX4S.js";
4
4
 
5
5
  // src/components/data-display/FleetMap/FleetCanvas.tsx
6
6
  import Box from "@mui/material/Box/index.js";
@@ -38,4 +38,4 @@ function FleetCanvas({
38
38
  export {
39
39
  FleetCanvas
40
40
  };
41
- //# sourceMappingURL=chunk-IEAPXS57.js.map
41
+ //# sourceMappingURL=chunk-MW7P2C2C.js.map