@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.
- package/dist/_internal/components/data-display/Alert/Alert.js +2 -2
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -3
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +4 -4
- package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +20 -20
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +24 -24
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +13 -13
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +3 -3
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +13 -13
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +12 -12
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +14 -14
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +11 -11
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/RegionMap/RegionMap.js +3 -2
- package/dist/_internal/components/data-display/RegionMap/RegionMap.labels.js +12 -0
- package/dist/_internal/components/data-display/RegionMap/RegionMap.labels.js.map +1 -0
- package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +2 -1
- package/dist/_internal/components/data-display/index.js +27 -26
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +3 -3
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +4 -4
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +3 -3
- package/dist/_internal/components/feedback/index.js +5 -5
- package/dist/_internal/components/index.js +30 -29
- package/dist/{chunk-T6QVM5Q5.js → chunk-4LUWZ6UE.js} +2 -2
- package/dist/{chunk-JKIKHWD2.js → chunk-5NT2M2JI.js} +4 -4
- package/dist/{chunk-I7JUAHUO.js → chunk-65KJLPF5.js} +3 -3
- package/dist/{chunk-C74PDNTF.js → chunk-67ADHGA2.js} +2 -2
- package/dist/{chunk-ZLVRCQPG.js → chunk-A5CKUJP2.js} +5 -5
- package/dist/{chunk-A63WU4UZ.js → chunk-AKE6KVQG.js} +70 -41
- package/dist/chunk-AKE6KVQG.js.map +1 -0
- package/dist/{chunk-XMWTVDQN.js → chunk-B32554CQ.js} +12 -12
- package/dist/{chunk-OA6T2ME3.js → chunk-BLZDSCIZ.js} +4 -4
- package/dist/{chunk-OZYUE2BI.js → chunk-CJUK32UH.js} +4 -4
- package/dist/{chunk-HWPQKHN2.js → chunk-COKPPU42.js} +7 -7
- package/dist/{chunk-U4WAAZXJ.js → chunk-DVX4HDNP.js} +2 -2
- package/dist/{chunk-CESGZRVQ.js → chunk-EMSMJRP3.js} +4 -4
- package/dist/{chunk-IFX5KP65.js → chunk-EXVCVXFX.js} +4 -4
- package/dist/{chunk-U3HGQHEO.js → chunk-H7CZRKN7.js} +4 -4
- package/dist/{chunk-5ZC7CNU4.js → chunk-I2LMLQGQ.js} +2 -2
- package/dist/chunk-J3AWGTJY.js +29 -0
- package/dist/chunk-J3AWGTJY.js.map +1 -0
- package/dist/{chunk-K6VEN5VN.js → chunk-K3PMMW23.js} +4 -4
- package/dist/{chunk-YHPSPFU5.js → chunk-LIN4A2BW.js} +4 -4
- package/dist/{chunk-LXMFHD7M.js → chunk-LTSVYILY.js} +4 -4
- package/dist/{chunk-IEAPXS57.js → chunk-MW7P2C2C.js} +2 -2
- package/dist/{chunk-JVTZ7FWR.js → chunk-NCI74EOS.js} +4 -4
- package/dist/{chunk-IMCSY2SI.js → chunk-OKRITX4S.js} +7 -7
- package/dist/{chunk-LRQT4MQO.js → chunk-PJNIJIE6.js} +2 -2
- package/dist/{chunk-2WVHZIWP.js → chunk-QSRZOXQI.js} +2 -2
- package/dist/{chunk-IF5UY3CT.js → chunk-QVDEGBME.js} +4 -4
- package/dist/{chunk-XNMU32XC.js → chunk-TMUGBHHG.js} +2 -2
- package/dist/{chunk-AWUFS2ZC.js → chunk-U2DRE36S.js} +4 -4
- package/dist/{chunk-NEYZV6V5.js → chunk-UAOE3ZPC.js} +6 -6
- package/dist/{chunk-VHGHF537.js → chunk-V4CWJ7Q6.js} +2 -2
- package/dist/{chunk-3OL2TSEJ.js → chunk-WNNA6YYE.js} +2 -2
- package/dist/{chunk-T6YTDEY4.js → chunk-WXZCNHBX.js} +2 -2
- package/dist/{chunk-5XTPEA3O.js → chunk-ZHYLOB7Q.js} +2 -2
- package/dist/{chunk-ARMKSYEQ.js → chunk-ZO2GZRZS.js} +2 -2
- package/dist/data-display/Alert.js +2 -2
- package/dist/data-display/CardKit.js +7 -7
- package/dist/data-display/Carousel.js +2 -2
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +31 -31
- package/dist/data-display/FleetMap.js +14 -14
- package/dist/data-display/Lightbox.js +4 -4
- package/dist/data-display/MapPreview.js +11 -11
- package/dist/data-display/RegionMap.js +3 -2
- package/dist/feedback/NotificationStatusNotice.js +3 -3
- package/dist/feedback/SequenceResolver.js +4 -4
- package/dist/types/components/data-display/RegionMap/RegionMap.labels.d.ts +42 -0
- package/dist/types/components/data-display/RegionMap/RegionMap.labels.d.ts.map +1 -0
- package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/RegionMap/RegionMap.labels.ts +60 -0
- package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +87 -45
- package/dist/chunk-A63WU4UZ.js.map +0 -1
- /package/dist/{chunk-T6QVM5Q5.js.map → chunk-4LUWZ6UE.js.map} +0 -0
- /package/dist/{chunk-JKIKHWD2.js.map → chunk-5NT2M2JI.js.map} +0 -0
- /package/dist/{chunk-I7JUAHUO.js.map → chunk-65KJLPF5.js.map} +0 -0
- /package/dist/{chunk-C74PDNTF.js.map → chunk-67ADHGA2.js.map} +0 -0
- /package/dist/{chunk-ZLVRCQPG.js.map → chunk-A5CKUJP2.js.map} +0 -0
- /package/dist/{chunk-XMWTVDQN.js.map → chunk-B32554CQ.js.map} +0 -0
- /package/dist/{chunk-OA6T2ME3.js.map → chunk-BLZDSCIZ.js.map} +0 -0
- /package/dist/{chunk-OZYUE2BI.js.map → chunk-CJUK32UH.js.map} +0 -0
- /package/dist/{chunk-HWPQKHN2.js.map → chunk-COKPPU42.js.map} +0 -0
- /package/dist/{chunk-U4WAAZXJ.js.map → chunk-DVX4HDNP.js.map} +0 -0
- /package/dist/{chunk-CESGZRVQ.js.map → chunk-EMSMJRP3.js.map} +0 -0
- /package/dist/{chunk-IFX5KP65.js.map → chunk-EXVCVXFX.js.map} +0 -0
- /package/dist/{chunk-U3HGQHEO.js.map → chunk-H7CZRKN7.js.map} +0 -0
- /package/dist/{chunk-5ZC7CNU4.js.map → chunk-I2LMLQGQ.js.map} +0 -0
- /package/dist/{chunk-K6VEN5VN.js.map → chunk-K3PMMW23.js.map} +0 -0
- /package/dist/{chunk-YHPSPFU5.js.map → chunk-LIN4A2BW.js.map} +0 -0
- /package/dist/{chunk-LXMFHD7M.js.map → chunk-LTSVYILY.js.map} +0 -0
- /package/dist/{chunk-IEAPXS57.js.map → chunk-MW7P2C2C.js.map} +0 -0
- /package/dist/{chunk-JVTZ7FWR.js.map → chunk-NCI74EOS.js.map} +0 -0
- /package/dist/{chunk-IMCSY2SI.js.map → chunk-OKRITX4S.js.map} +0 -0
- /package/dist/{chunk-LRQT4MQO.js.map → chunk-PJNIJIE6.js.map} +0 -0
- /package/dist/{chunk-2WVHZIWP.js.map → chunk-QSRZOXQI.js.map} +0 -0
- /package/dist/{chunk-IF5UY3CT.js.map → chunk-QVDEGBME.js.map} +0 -0
- /package/dist/{chunk-XNMU32XC.js.map → chunk-TMUGBHHG.js.map} +0 -0
- /package/dist/{chunk-AWUFS2ZC.js.map → chunk-U2DRE36S.js.map} +0 -0
- /package/dist/{chunk-NEYZV6V5.js.map → chunk-UAOE3ZPC.js.map} +0 -0
- /package/dist/{chunk-VHGHF537.js.map → chunk-V4CWJ7Q6.js.map} +0 -0
- /package/dist/{chunk-3OL2TSEJ.js.map → chunk-WNNA6YYE.js.map} +0 -0
- /package/dist/{chunk-T6YTDEY4.js.map → chunk-WXZCNHBX.js.map} +0 -0
- /package/dist/{chunk-5XTPEA3O.js.map → chunk-ZHYLOB7Q.js.map} +0 -0
- /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-
|
|
189
|
+
//# sourceMappingURL=chunk-5NT2M2JI.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GridShell
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-B32554CQ.js";
|
|
4
4
|
import {
|
|
5
5
|
useDataViewsState
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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,
|
|
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-
|
|
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-
|
|
12
|
+
} from "./chunk-67ADHGA2.js";
|
|
10
13
|
import {
|
|
11
14
|
FilterDialog,
|
|
12
15
|
GridFilterPanel
|
|
13
16
|
} from "./chunk-OPY2AGAU.js";
|
|
14
17
|
import {
|
|
15
|
-
|
|
16
|
-
} from "./chunk-
|
|
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-
|
|
33
|
+
} from "./chunk-K3PMMW23.js";
|
|
34
34
|
import {
|
|
35
35
|
ShellToolbar
|
|
36
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
151
|
+
//# sourceMappingURL=chunk-COKPPU42.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCardActions
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
181
|
+
//# sourceMappingURL=chunk-H7CZRKN7.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GridToolbar
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
174
|
+
//# sourceMappingURL=chunk-LTSVYILY.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MapPreview
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
41
|
+
//# sourceMappingURL=chunk-MW7P2C2C.js.map
|