@12-apps/ui 6.98.1 → 6.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/_internal/components/data-display/Alert/Alert.content.js +2 -2
  2. package/dist/_internal/components/data-display/Alert/Alert.js +3 -3
  3. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +4 -4
  4. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
  5. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  6. package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
  7. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +1 -1
  8. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +17 -17
  9. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +22 -22
  10. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
  11. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
  12. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +1 -1
  13. package/dist/_internal/components/data-display/DataViews/base-list-card.js +4 -4
  14. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +2 -2
  15. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +14 -14
  16. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
  17. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +2 -2
  18. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +3 -3
  19. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +4 -4
  20. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
  21. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  22. package/dist/_internal/components/data-display/DayRuler/DayRuler.footer.js +2 -2
  23. package/dist/_internal/components/data-display/DayRuler/DayRuler.js +7 -7
  24. package/dist/_internal/components/data-display/DayRuler/DayRuler.keyboard.js +2 -2
  25. package/dist/_internal/components/data-display/DayRuler/DayRuler.parts.js +3 -3
  26. package/dist/_internal/components/data-display/DayRuler/useRulerDrag.js +2 -2
  27. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +6 -6
  28. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +5 -5
  29. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +7 -7
  30. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  31. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
  32. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  33. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +4 -4
  34. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  35. package/dist/_internal/components/data-display/RegionMap/RegionMap.fixtures.js +1 -1
  36. package/dist/_internal/components/data-display/RegionMap/RegionMap.helpers.js +3 -1
  37. package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +3 -3
  38. package/dist/_internal/components/data-display/RegionMap/RegionMap.js +6 -5
  39. package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js +2 -2
  40. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +3 -2
  41. package/dist/_internal/components/data-display/RegionMap/RegionMapPin.js +26 -0
  42. package/dist/_internal/components/data-display/index.js +51 -45
  43. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +4 -4
  44. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.frame.js +4 -4
  45. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.header.js +3 -3
  46. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +10 -10
  47. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +5 -5
  48. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +4 -4
  49. package/dist/_internal/components/feedback/index.js +11 -11
  50. package/dist/_internal/components/index.js +57 -51
  51. package/dist/charts.js +11 -11
  52. package/dist/{chunk-WYNGH2WL.js → chunk-255WTBZ5.js} +8 -8
  53. package/dist/{chunk-CGLMWS7K.js → chunk-37MJZLQU.js} +2 -2
  54. package/dist/{chunk-PNAKRHRT.js → chunk-3I7KE2N6.js} +2 -2
  55. package/dist/{chunk-L4FWEI2P.js → chunk-3V3Z4EML.js} +5 -5
  56. package/dist/{chunk-6RYSSNOO.js → chunk-54DOLCJ3.js} +2 -2
  57. package/dist/{chunk-74IH3ZGD.js → chunk-643YFWNK.js} +2 -2
  58. package/dist/{chunk-FRQGZIYU.js → chunk-6WAP7BJS.js} +2 -2
  59. package/dist/chunk-7XVT4RME.js +293 -0
  60. package/dist/chunk-7XVT4RME.js.map +1 -0
  61. package/dist/{chunk-JO6D7YGN.js → chunk-CWRQGA2T.js} +2 -2
  62. package/dist/{chunk-ZW7Q3IRL.js → chunk-FYJL432J.js} +4 -4
  63. package/dist/{chunk-G6TKWNF2.js → chunk-GZITNT7O.js} +11 -11
  64. package/dist/{chunk-RFMQBIE6.js → chunk-HBHBRRSW.js} +4 -4
  65. package/dist/{chunk-U4Z6GZDW.js → chunk-HN36UVOE.js} +4 -4
  66. package/dist/{chunk-WK577LQL.js → chunk-J2IQ6FJ5.js} +4 -4
  67. package/dist/{chunk-HCTHY66U.js → chunk-KAGXV3ID.js} +4 -4
  68. package/dist/{chunk-FWAY2SAI.js → chunk-KAZWBDIH.js} +2 -2
  69. package/dist/{chunk-DKPELKGL.js → chunk-KV7LTOWC.js} +5 -5
  70. package/dist/{chunk-UC7DLGMP.js → chunk-KVP5A3YK.js} +2 -2
  71. package/dist/{chunk-3CXRHRGE.js → chunk-LCKUEYU2.js} +7 -3
  72. package/dist/chunk-LCKUEYU2.js.map +1 -0
  73. package/dist/{chunk-EGBQR5GH.js → chunk-LOLYBFYY.js} +5 -5
  74. package/dist/{chunk-SOXO2VN3.js → chunk-MEMVZW64.js} +3 -3
  75. package/dist/{chunk-COOSJKZL.js → chunk-MNJZPJ5S.js} +2 -1
  76. package/dist/chunk-MNJZPJ5S.js.map +1 -0
  77. package/dist/{chunk-G2NVBCF7.js → chunk-NWUMGE6T.js} +3 -3
  78. package/dist/{chunk-RKAX37F4.js → chunk-Q5SCBQLY.js} +7 -7
  79. package/dist/{chunk-3R5MCSYO.js → chunk-QLKUWDMQ.js} +4 -4
  80. package/dist/{chunk-MPVH2GM5.js → chunk-RAQD5QCM.js} +4 -4
  81. package/dist/{chunk-KXDLLS62.js → chunk-REHGWN5M.js} +4 -4
  82. package/dist/{chunk-3N2HWNKT.js → chunk-UIJLDAV7.js} +2 -2
  83. package/dist/{chunk-GDWU7WF4.js → chunk-UN5WU2OX.js} +4 -4
  84. package/dist/{chunk-A27J4CIZ.js → chunk-UTIYB6VE.js} +11 -11
  85. package/dist/{chunk-5V7IZBRY.js → chunk-VRSW7PIO.js} +5 -5
  86. package/dist/{chunk-AESKKFA5.js → chunk-WDEVKND3.js} +3 -3
  87. package/dist/chunk-WGKLBVDZ.js +1 -0
  88. package/dist/chunk-WGKLBVDZ.js.map +1 -0
  89. package/dist/{chunk-67GTAPK6.js → chunk-XFOKLWJZ.js} +2 -2
  90. package/dist/{chunk-OV5NM4FY.js → chunk-XQAFSC66.js} +2 -2
  91. package/dist/{chunk-6FGP7RMV.js → chunk-XR474YYX.js} +2 -2
  92. package/dist/{chunk-E4MJA52O.js → chunk-YHFLI2FD.js} +16 -18
  93. package/dist/chunk-YHFLI2FD.js.map +1 -0
  94. package/dist/{chunk-4N4M237A.js → chunk-YQ5GQ32T.js} +2 -2
  95. package/dist/{chunk-YLZXIR6B.js → chunk-Z5V5E3JW.js} +4 -4
  96. package/dist/data-display/Alert.js +3 -3
  97. package/dist/data-display/CardKit.js +5 -5
  98. package/dist/data-display/Carousel.js +2 -2
  99. package/dist/data-display/Chart.js +11 -11
  100. package/dist/data-display/DataGrid.js +1 -1
  101. package/dist/data-display/DataViews.js +29 -29
  102. package/dist/data-display/DayRuler.js +7 -7
  103. package/dist/data-display/FleetMap.js +7 -7
  104. package/dist/data-display/HoverCard.js +2 -2
  105. package/dist/data-display/Lightbox.js +3 -3
  106. package/dist/data-display/MapPreview.js +4 -4
  107. package/dist/data-display/Progress.js +2 -2
  108. package/dist/data-display/RegionMap.js +14 -8
  109. package/dist/feedback/NotificationStatusNotice.js +4 -4
  110. package/dist/feedback/SequenceResolver.js +10 -10
  111. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +1 -1
  112. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -1
  113. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts +9 -0
  114. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts.map +1 -1
  115. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +45 -1
  116. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -1
  117. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +4 -1
  118. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
  119. package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts +102 -0
  120. package/dist/types/components/data-display/RegionMap/RegionMapPin.d.ts.map +1 -0
  121. package/dist/types/components/data-display/RegionMap/index.d.ts +2 -1
  122. package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -1
  123. package/package.json +1 -1
  124. package/src/components/data-display/RegionMap/RegionMap.helpers.ts +1 -1
  125. package/src/components/data-display/RegionMap/RegionMap.md +19 -2
  126. package/src/components/data-display/RegionMap/RegionMap.tsx +4 -0
  127. package/src/components/data-display/RegionMap/RegionMap.types.ts +49 -1
  128. package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +11 -13
  129. package/src/components/data-display/RegionMap/RegionMapPin.tsx +388 -0
  130. package/src/components/data-display/RegionMap/index.ts +5 -0
  131. package/dist/chunk-3CXRHRGE.js.map +0 -1
  132. package/dist/chunk-COOSJKZL.js.map +0 -1
  133. package/dist/chunk-DY2I6LMX.js +0 -1
  134. package/dist/chunk-E4MJA52O.js.map +0 -1
  135. /package/dist/{chunk-DY2I6LMX.js.map → _internal/components/data-display/RegionMap/RegionMapPin.js.map} +0 -0
  136. /package/dist/{chunk-WYNGH2WL.js.map → chunk-255WTBZ5.js.map} +0 -0
  137. /package/dist/{chunk-CGLMWS7K.js.map → chunk-37MJZLQU.js.map} +0 -0
  138. /package/dist/{chunk-PNAKRHRT.js.map → chunk-3I7KE2N6.js.map} +0 -0
  139. /package/dist/{chunk-L4FWEI2P.js.map → chunk-3V3Z4EML.js.map} +0 -0
  140. /package/dist/{chunk-6RYSSNOO.js.map → chunk-54DOLCJ3.js.map} +0 -0
  141. /package/dist/{chunk-74IH3ZGD.js.map → chunk-643YFWNK.js.map} +0 -0
  142. /package/dist/{chunk-FRQGZIYU.js.map → chunk-6WAP7BJS.js.map} +0 -0
  143. /package/dist/{chunk-JO6D7YGN.js.map → chunk-CWRQGA2T.js.map} +0 -0
  144. /package/dist/{chunk-ZW7Q3IRL.js.map → chunk-FYJL432J.js.map} +0 -0
  145. /package/dist/{chunk-G6TKWNF2.js.map → chunk-GZITNT7O.js.map} +0 -0
  146. /package/dist/{chunk-RFMQBIE6.js.map → chunk-HBHBRRSW.js.map} +0 -0
  147. /package/dist/{chunk-U4Z6GZDW.js.map → chunk-HN36UVOE.js.map} +0 -0
  148. /package/dist/{chunk-WK577LQL.js.map → chunk-J2IQ6FJ5.js.map} +0 -0
  149. /package/dist/{chunk-HCTHY66U.js.map → chunk-KAGXV3ID.js.map} +0 -0
  150. /package/dist/{chunk-FWAY2SAI.js.map → chunk-KAZWBDIH.js.map} +0 -0
  151. /package/dist/{chunk-DKPELKGL.js.map → chunk-KV7LTOWC.js.map} +0 -0
  152. /package/dist/{chunk-UC7DLGMP.js.map → chunk-KVP5A3YK.js.map} +0 -0
  153. /package/dist/{chunk-EGBQR5GH.js.map → chunk-LOLYBFYY.js.map} +0 -0
  154. /package/dist/{chunk-SOXO2VN3.js.map → chunk-MEMVZW64.js.map} +0 -0
  155. /package/dist/{chunk-G2NVBCF7.js.map → chunk-NWUMGE6T.js.map} +0 -0
  156. /package/dist/{chunk-RKAX37F4.js.map → chunk-Q5SCBQLY.js.map} +0 -0
  157. /package/dist/{chunk-3R5MCSYO.js.map → chunk-QLKUWDMQ.js.map} +0 -0
  158. /package/dist/{chunk-MPVH2GM5.js.map → chunk-RAQD5QCM.js.map} +0 -0
  159. /package/dist/{chunk-KXDLLS62.js.map → chunk-REHGWN5M.js.map} +0 -0
  160. /package/dist/{chunk-3N2HWNKT.js.map → chunk-UIJLDAV7.js.map} +0 -0
  161. /package/dist/{chunk-GDWU7WF4.js.map → chunk-UN5WU2OX.js.map} +0 -0
  162. /package/dist/{chunk-A27J4CIZ.js.map → chunk-UTIYB6VE.js.map} +0 -0
  163. /package/dist/{chunk-5V7IZBRY.js.map → chunk-VRSW7PIO.js.map} +0 -0
  164. /package/dist/{chunk-AESKKFA5.js.map → chunk-WDEVKND3.js.map} +0 -0
  165. /package/dist/{chunk-67GTAPK6.js.map → chunk-XFOKLWJZ.js.map} +0 -0
  166. /package/dist/{chunk-OV5NM4FY.js.map → chunk-XQAFSC66.js.map} +0 -0
  167. /package/dist/{chunk-6FGP7RMV.js.map → chunk-XR474YYX.js.map} +0 -0
  168. /package/dist/{chunk-4N4M237A.js.map → chunk-YQ5GQ32T.js.map} +0 -0
  169. /package/dist/{chunk-YLZXIR6B.js.map → chunk-Z5V5E3JW.js.map} +0 -0
@@ -0,0 +1,293 @@
1
+ import {
2
+ METRES_PER_DEGREE
3
+ } from "./chunk-MNJZPJ5S.js";
4
+ import {
5
+ rem
6
+ } from "./chunk-YKCAJ2TN.js";
7
+
8
+ // src/components/data-display/RegionMap/RegionMapPin.tsx
9
+ import Box from "@mui/material/Box/index.js";
10
+ import { alpha } from "@mui/material/styles/index.js";
11
+ import React from "react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ function PinShapes({ model, moving, testId, theme, fallback }) {
14
+ const { projection, view } = model;
15
+ if (!moving || !projection) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
16
+ const pinAt = moving.pin ? projection.project([moving.pin.at.latitude, moving.pin.at.longitude]) : null;
17
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ pinAt ? /* @__PURE__ */ jsx(PinCircles, { at: pinAt, radii: model.radii, theme }) : fallback,
19
+ pinAt && moving.ghost ? /* @__PURE__ */ jsx(GhostShapes, { ghost: moving.ghost, pinAt, projection, view, testId, theme }) : null,
20
+ moving.dots ? /* @__PURE__ */ jsx(Dots, { dots: moving.dots, projection, view, testId, theme }) : null
21
+ ] });
22
+ }
23
+ function PinOverlay({
24
+ model,
25
+ moving,
26
+ svgRef,
27
+ testId,
28
+ theme
29
+ }) {
30
+ if (!moving || !model.projection) return null;
31
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
32
+ moving.pin ? /* @__PURE__ */ jsx(PinMarker, { pin: moving.pin, center: moving.center, projection: model.projection, view: model.view, svgRef, testId, theme }) : null,
33
+ /* @__PURE__ */ jsx(ScaleBar, { view: model.view, copy: moving.copy, svgRef, testId, theme })
34
+ ] });
35
+ }
36
+ function latLngAt(center, point) {
37
+ const kx = METRES_PER_DEGREE * Math.cos(center.latitude * Math.PI / 180);
38
+ return { latitude: center.latitude - point.y / METRES_PER_DEGREE, longitude: center.longitude + point.x / kx };
39
+ }
40
+ function fractionOf(view, point) {
41
+ return { x: (point.x - view.minX) / view.spanX, y: (point.y - view.minY) / view.spanY };
42
+ }
43
+ var clampFraction = (value) => Math.min(0.995, Math.max(5e-3, value));
44
+ function clampToView(view, point) {
45
+ const at = fractionOf(view, point);
46
+ return { x: view.minX + clampFraction(at.x) * view.spanX, y: view.minY + clampFraction(at.y) * view.spanY };
47
+ }
48
+ var ARROWS = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, 1], ArrowDown: [0, -1] };
49
+ var DEFAULT_STEP_METRES = 50;
50
+ function PinMarker({ pin, center, projection, view, svgRef, testId, theme }) {
51
+ const ref = React.useRef(null);
52
+ const live = React.useRef({ pin, center, view });
53
+ live.current = { pin, center, view };
54
+ usePinDrag(ref, svgRef, live);
55
+ const at = fractionOf(view, projection.project([pin.at.latitude, pin.at.longitude]));
56
+ const onKeyDown = (event) => {
57
+ const arrow = ARROWS[event.key];
58
+ if (!arrow || pin.disabled) return;
59
+ event.preventDefault();
60
+ const step = pin.stepMetres ?? DEFAULT_STEP_METRES;
61
+ const plane = projection.project([pin.at.latitude, pin.at.longitude]);
62
+ const next = latLngAt(center, clampToView(view, { x: plane.x + arrow[0] * step, y: plane.y - arrow[1] * step }));
63
+ pin.onMove?.(next);
64
+ pin.onDrop(next);
65
+ };
66
+ return /* @__PURE__ */ jsxs(
67
+ Box,
68
+ {
69
+ ref,
70
+ role: "button",
71
+ tabIndex: pin.disabled ? -1 : 0,
72
+ "aria-label": pin.ariaLabel,
73
+ "aria-disabled": pin.disabled || void 0,
74
+ onKeyDown,
75
+ "data-testid": `${testId}-pin`,
76
+ "data-region-pin": "",
77
+ style: { left: `${(at.x * 100).toFixed(3)}%`, top: `${(at.y * 100).toFixed(3)}%` },
78
+ sx: {
79
+ position: "absolute",
80
+ transform: "translate(-50%, -100%)",
81
+ width: rem(theme, 44),
82
+ height: rem(theme, 48),
83
+ display: "flex",
84
+ alignItems: "flex-end",
85
+ justifyContent: "center",
86
+ cursor: pin.disabled ? "default" : "grab",
87
+ touchAction: "none",
88
+ zIndex: 2,
89
+ borderRadius: 1,
90
+ "&:focus-visible": { outline: `${rem(theme, 2)} solid`, outlineColor: "primary.main", outlineOffset: rem(theme, 2) }
91
+ },
92
+ children: [
93
+ /* @__PURE__ */ jsxs(Box, { component: "svg", viewBox: "0 0 32 42", "aria-hidden": "true", sx: { width: rem(theme, 32), height: rem(theme, 42) }, children: [
94
+ /* @__PURE__ */ jsx(
95
+ "path",
96
+ {
97
+ d: "M16 41C16 41 3 25 3 15.5A13 13 0 1 1 29 15.5C29 25 16 41 16 41Z",
98
+ fill: theme.palette.primary.main,
99
+ stroke: theme.palette.background.paper,
100
+ strokeWidth: 2
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx("circle", { cx: "16", cy: "15.5", r: "5", fill: theme.palette.background.paper })
104
+ ] }),
105
+ /* @__PURE__ */ jsx(
106
+ Box,
107
+ {
108
+ component: "span",
109
+ "aria-hidden": true,
110
+ sx: {
111
+ position: "absolute",
112
+ left: "88%",
113
+ top: 0,
114
+ px: 0.75,
115
+ borderRadius: 0.5,
116
+ border: 1,
117
+ borderColor: "divider",
118
+ bgcolor: "background.paper",
119
+ color: "text.primary",
120
+ fontSize: rem(theme, 12),
121
+ fontWeight: 600,
122
+ whiteSpace: "nowrap",
123
+ pointerEvents: "none"
124
+ },
125
+ children: pin.label
126
+ }
127
+ )
128
+ ]
129
+ }
130
+ );
131
+ }
132
+ function usePinDrag(ref, svgRef, live) {
133
+ React.useEffect(() => {
134
+ const element = ref.current;
135
+ if (!element) return void 0;
136
+ let dragging = null;
137
+ let last = null;
138
+ const pointAt = (event) => {
139
+ const box = svgRef.current?.getBoundingClientRect();
140
+ if (!box || box.width === 0 || box.height === 0) return null;
141
+ const { view, center } = live.current;
142
+ if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) return null;
143
+ const fx = clampFraction((event.clientX - box.left) / box.width);
144
+ const fy = clampFraction((event.clientY - box.top) / box.height);
145
+ return latLngAt(center, { x: view.minX + fx * view.spanX, y: view.minY + fy * view.spanY });
146
+ };
147
+ const down = (event) => {
148
+ event.stopPropagation();
149
+ if (live.current.pin.disabled) return;
150
+ event.preventDefault();
151
+ dragging = event.pointerId;
152
+ last = null;
153
+ element.setPointerCapture?.(event.pointerId);
154
+ };
155
+ const move = (event) => {
156
+ if (dragging !== event.pointerId) return;
157
+ event.stopPropagation();
158
+ const at = pointAt(event);
159
+ if (!at) return;
160
+ last = at;
161
+ live.current.pin.onMove?.(at);
162
+ };
163
+ const up = (event) => {
164
+ if (dragging !== event.pointerId) return;
165
+ event.stopPropagation();
166
+ dragging = null;
167
+ const at = event.type === "pointercancel" ? last : pointAt(event) ?? last;
168
+ if (at) live.current.pin.onDrop(at);
169
+ };
170
+ const click = (event) => event.stopPropagation();
171
+ element.addEventListener("pointerdown", down);
172
+ element.addEventListener("pointermove", move);
173
+ element.addEventListener("pointerup", up);
174
+ element.addEventListener("pointercancel", up);
175
+ element.addEventListener("click", click);
176
+ return () => {
177
+ element.removeEventListener("pointerdown", down);
178
+ element.removeEventListener("pointermove", move);
179
+ element.removeEventListener("pointerup", up);
180
+ element.removeEventListener("pointercancel", up);
181
+ element.removeEventListener("click", click);
182
+ };
183
+ }, [ref, svgRef, live]);
184
+ }
185
+ function PinCircles({ at, radii, theme }) {
186
+ return /* @__PURE__ */ jsx(Fragment, { children: radii.map((radius) => /* @__PURE__ */ jsx(
187
+ "circle",
188
+ {
189
+ cx: at.x,
190
+ cy: at.y,
191
+ r: radius,
192
+ fill: alpha(theme.palette.primary.main, 0.06),
193
+ stroke: theme.palette.primary.main,
194
+ strokeWidth: 2.25,
195
+ vectorEffect: "non-scaling-stroke",
196
+ pointerEvents: "none"
197
+ },
198
+ radius
199
+ )) });
200
+ }
201
+ function GhostShapes({
202
+ ghost,
203
+ pinAt,
204
+ projection,
205
+ view,
206
+ testId,
207
+ theme
208
+ }) {
209
+ const at = projection.project([ghost.at.latitude, ghost.at.longitude]);
210
+ const stroke = theme.palette.text.secondary;
211
+ const common = { fill: "none", stroke, vectorEffect: "non-scaling-stroke", pointerEvents: "none" };
212
+ return /* @__PURE__ */ jsxs("g", { "data-testid": `${testId}-ghost`, children: [
213
+ /* @__PURE__ */ jsx("circle", { cx: at.x, cy: at.y, r: ghost.radiusMetres, strokeWidth: 1.5, strokeDasharray: "6 5", ...common }),
214
+ /* @__PURE__ */ jsx("line", { x1: at.x, y1: at.y, x2: pinAt.x, y2: pinAt.y, strokeWidth: 1.5, strokeDasharray: "4 4", ...common }),
215
+ /* @__PURE__ */ jsx("circle", { cx: at.x, cy: at.y, r: view.spanX / 110, strokeWidth: 2, strokeDasharray: "3 2", ...common, fill: alpha(theme.palette.background.paper, 0.7) })
216
+ ] });
217
+ }
218
+ function Dots({ dots, projection, view, testId, theme }) {
219
+ return /* @__PURE__ */ jsx("g", { "data-testid": `${testId}-dots`, children: dots.map((dot) => {
220
+ const at = projection.project([dot.at.latitude, dot.at.longitude]);
221
+ return /* @__PURE__ */ jsx(
222
+ "circle",
223
+ {
224
+ cx: at.x,
225
+ cy: at.y,
226
+ r: view.spanX / 150,
227
+ fill: dot.filled ? theme.palette.text.primary : theme.palette.background.paper,
228
+ stroke: theme.palette.text.primary,
229
+ strokeWidth: 2,
230
+ vectorEffect: "non-scaling-stroke",
231
+ pointerEvents: "none",
232
+ "data-filled": dot.filled ? "true" : "false"
233
+ },
234
+ dot.id
235
+ );
236
+ }) });
237
+ }
238
+ var SCALE_STEPS = [50, 100, 200, 500, 1e3, 2e3, 5e3, 1e4, 2e4, 5e4];
239
+ function scaleMetres(view) {
240
+ const quarter = view.spanX / 4;
241
+ return SCALE_STEPS.filter((step) => step <= quarter).at(-1) ?? SCALE_STEPS[0];
242
+ }
243
+ function ScaleBar({
244
+ view,
245
+ copy,
246
+ svgRef,
247
+ testId,
248
+ theme
249
+ }) {
250
+ const [screen, setScreen] = React.useState({ laidOut: 0, drawn: 0 });
251
+ const wanted = copy.scale !== void 0;
252
+ React.useLayoutEffect(() => {
253
+ if (!wanted) return;
254
+ const svg = svgRef.current;
255
+ const next = { laidOut: svg?.clientWidth ?? 0, drawn: svg?.getBoundingClientRect().width ?? 0 };
256
+ if (next.laidOut !== screen.laidOut || Math.abs(next.drawn - screen.drawn) > 0.5) setScreen(next);
257
+ });
258
+ if (!copy.scale) return null;
259
+ const zoom = screen.laidOut > 0 && screen.drawn > 0 ? screen.drawn / screen.laidOut : 1;
260
+ const metres = scaleMetres({ ...view, spanX: view.spanX / zoom });
261
+ const share = metres * zoom / view.spanX;
262
+ return /* @__PURE__ */ jsxs(
263
+ Box,
264
+ {
265
+ "data-testid": `${testId}-scale`,
266
+ "aria-hidden": true,
267
+ sx: { position: "absolute", left: 0, right: 0, bottom: rem(theme, 10), pointerEvents: "none", zIndex: 1 },
268
+ children: [
269
+ /* @__PURE__ */ jsx(Box, { component: "span", sx: { display: "block", ml: rem(theme, 10), fontSize: rem(theme, 12), color: "text.secondary" }, children: copy.scale(metres) }),
270
+ /* @__PURE__ */ jsx(
271
+ Box,
272
+ {
273
+ component: "span",
274
+ sx: { display: "block", height: rem(theme, 4), ml: rem(theme, 10), width: `${(share * 100).toFixed(2)}%`, borderStyle: "solid", borderWidth: `0 ${rem(theme, 1.5)} ${rem(theme, 1.5)}`, borderColor: "text.secondary" }
275
+ }
276
+ )
277
+ ]
278
+ }
279
+ );
280
+ }
281
+
282
+ export {
283
+ PinShapes,
284
+ PinOverlay,
285
+ latLngAt,
286
+ PinMarker,
287
+ PinCircles,
288
+ GhostShapes,
289
+ Dots,
290
+ scaleMetres,
291
+ ScaleBar
292
+ };
293
+ //# sourceMappingURL=chunk-7XVT4RME.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMapPin.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport { alpha, type Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { rem } from '../../../tokens/relative';\n\nimport { METRES_PER_DEGREE, type PlaneBox, type PlanePoint, type Projection } from './RegionMap.helpers';\nimport type { RegionMapModel } from './RegionMap.hooks';\nimport type { RegionMapCenter, RegionMapCopy, RegionMapDot, RegionMapGhost, RegionMapPin } from './RegionMap.types';\n\n/**\n * The movable centre of a `RegionMap` (`pin`, `ghost`, `dots`): a pin the\n * viewer drags with a mouse or one finger, or focuses and nudges with the\n * arrow keys, while the VIEW stays where `center` put it — so the areas never\n * slide under a dragging finger. The circles follow the pin; a dashed ring\n * and dot stay at `ghost`; `dots` are small points (filled or hollow).\n *\n * The pin is HTML over the drawing, at its point by percent like the labels,\n * carrying `data-region-pin` so a host that zooms the drawing's layers can\n * move it with them. Its moves are reported, never applied: the host passes\n * the new point back.\n */\n\n/** The movable centre and what is drawn with it, as the drawing receives it. */\nexport interface Moving {\n center: RegionMapCenter;\n pin?: RegionMapPin;\n ghost?: RegionMapGhost;\n dots?: readonly RegionMapDot[];\n copy: RegionMapCopy;\n}\n\ntype DrawnModel = Pick<RegionMapModel, 'projection' | 'radii'> & { view: PlaneBox };\n\n/**\n * What the movable centre draws inside the SVG: the circles around the pin\n * (else `fallback`, the centre's own circles), the ghost, and the dots.\n */\nexport function PinShapes({ model, moving, testId, theme, fallback }: { model: DrawnModel; moving: Moving | undefined; testId: string; theme: Theme; fallback: React.ReactNode }): React.JSX.Element {\n const { projection, view } = model;\n if (!moving || !projection) return <>{fallback}</>;\n const pinAt = moving.pin ? projection.project([moving.pin.at.latitude, moving.pin.at.longitude]) : null;\n return (\n <>\n {pinAt ? <PinCircles at={pinAt} radii={model.radii} theme={theme} /> : fallback}\n {pinAt && moving.ghost ? <GhostShapes ghost={moving.ghost} pinAt={pinAt} projection={projection} view={view} testId={testId} theme={theme} /> : null}\n {moving.dots ? <Dots dots={moving.dots} projection={projection} view={view} testId={testId} theme={theme} /> : null}\n </>\n );\n}\n\n/** What the movable centre draws over the SVG, in HTML: the pin and the scale bar. */\nexport function PinOverlay({\n model,\n moving,\n svgRef,\n testId,\n theme,\n}: {\n model: DrawnModel;\n moving: Moving | undefined;\n svgRef: React.RefObject<SVGSVGElement | null>;\n testId: string;\n theme: Theme;\n}): React.JSX.Element | null {\n if (!moving || !model.projection) return null;\n return (\n <>\n {moving.pin ? <PinMarker pin={moving.pin} center={moving.center} projection={model.projection} view={model.view} svgRef={svgRef} testId={testId} theme={theme} /> : null}\n <ScaleBar view={model.view} copy={moving.copy} svgRef={svgRef} testId={testId} theme={theme} />\n </>\n );\n}\n\n/** The flat projection's inverse around `center` — it is linear. */\nexport function latLngAt(center: RegionMapCenter, point: PlanePoint): RegionMapCenter {\n const kx = METRES_PER_DEGREE * Math.cos((center.latitude * Math.PI) / 180);\n return { latitude: center.latitude - point.y / METRES_PER_DEGREE, longitude: center.longitude + point.x / kx };\n}\n\n/** A point of the plane as fractions of the view (0..1 across, 0..1 down). */\nfunction fractionOf(view: PlaneBox, point: PlanePoint): { x: number; y: number } {\n return { x: (point.x - view.minX) / view.spanX, y: (point.y - view.minY) / view.spanY };\n}\n\n/** Keep a fraction inside the view, a hair in from its edge (the mock's clamp). */\nconst clampFraction = (value: number): number => Math.min(0.995, Math.max(0.005, value));\n\n/** A plane point kept inside the view by the same clamp a drag gets. */\nfunction clampToView(view: PlaneBox, point: PlanePoint): PlanePoint {\n const at = fractionOf(view, point);\n return { x: view.minX + clampFraction(at.x) * view.spanX, y: view.minY + clampFraction(at.y) * view.spanY };\n}\n\n/** Arrow keys, as metres east and north per press. */\nconst ARROWS: Record<string, [number, number]> = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, 1], ArrowDown: [0, -1] };\n\n/** One arrow key: 50 m unless the host says otherwise. */\nconst DEFAULT_STEP_METRES = 50;\n\ninterface PinLayerProps {\n pin: RegionMapPin;\n center: RegionMapCenter;\n projection: Projection;\n view: PlaneBox;\n /** The drawing's SVG, whose on-screen box maps a pointer to the plane (zoomed or not). */\n svgRef: React.RefObject<SVGSVGElement | null>;\n testId: string;\n theme: Theme;\n}\n\n/** The draggable pin, as HTML over the drawing. */\nexport function PinMarker({ pin, center, projection, view, svgRef, testId, theme }: PinLayerProps): React.JSX.Element {\n const ref = React.useRef<HTMLDivElement>(null);\n const live = React.useRef({ pin, center, view });\n live.current = { pin, center, view };\n usePinDrag(ref, svgRef, live);\n const at = fractionOf(view, projection.project([pin.at.latitude, pin.at.longitude]));\n const onKeyDown = (event: React.KeyboardEvent): void => {\n const arrow = ARROWS[event.key];\n if (!arrow || pin.disabled) return;\n event.preventDefault();\n const step = pin.stepMetres ?? DEFAULT_STEP_METRES;\n const plane = projection.project([pin.at.latitude, pin.at.longitude]);\n const next = latLngAt(center, clampToView(view, { x: plane.x + arrow[0] * step, y: plane.y - arrow[1] * step }));\n pin.onMove?.(next);\n pin.onDrop(next);\n };\n return (\n <Box\n ref={ref}\n role=\"button\"\n tabIndex={pin.disabled ? -1 : 0}\n aria-label={pin.ariaLabel}\n aria-disabled={pin.disabled || undefined}\n onKeyDown={onKeyDown}\n data-testid={`${testId}-pin`}\n data-region-pin=\"\"\n style={{ left: `${(at.x * 100).toFixed(3)}%`, top: `${(at.y * 100).toFixed(3)}%` }}\n sx={{\n position: 'absolute',\n transform: 'translate(-50%, -100%)',\n width: rem(theme, 44),\n height: rem(theme, 48),\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n cursor: pin.disabled ? 'default' : 'grab',\n touchAction: 'none',\n zIndex: 2,\n borderRadius: 1,\n '&:focus-visible': { outline: `${rem(theme, 2)} solid`, outlineColor: 'primary.main', outlineOffset: rem(theme, 2) },\n }}\n >\n <Box component=\"svg\" viewBox=\"0 0 32 42\" aria-hidden=\"true\" sx={{ width: rem(theme, 32), height: rem(theme, 42) }}>\n <path\n d=\"M16 41C16 41 3 25 3 15.5A13 13 0 1 1 29 15.5C29 25 16 41 16 41Z\"\n fill={theme.palette.primary.main}\n stroke={theme.palette.background.paper}\n strokeWidth={2}\n />\n <circle cx=\"16\" cy=\"15.5\" r=\"5\" fill={theme.palette.background.paper} />\n </Box>\n <Box\n component=\"span\"\n aria-hidden\n sx={{\n position: 'absolute',\n left: '88%',\n top: 0,\n px: 0.75,\n borderRadius: 0.5,\n border: 1,\n borderColor: 'divider',\n bgcolor: 'background.paper',\n color: 'text.primary',\n fontSize: rem(theme, 12),\n fontWeight: 600,\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n }}\n >\n {pin.label}\n </Box>\n </Box>\n );\n}\n\n/**\n * The pointer drag: native listeners on the pin, so a host's own listeners on\n * the drawing (a pan, a tap) never see the press; captured, so a finger that\n * leaves the pin keeps dragging it; clamped inside the view.\n */\nfunction usePinDrag(\n ref: React.RefObject<HTMLDivElement | null>,\n svgRef: React.RefObject<SVGSVGElement | null>,\n live: React.RefObject<{ pin: RegionMapPin; center: RegionMapCenter; view: PlaneBox }>,\n): void {\n React.useEffect(() => {\n const element = ref.current;\n if (!element) return undefined;\n let dragging: number | null = null;\n // Where the last move put the pin: a cancelled gesture (a browser may\n // report 0,0 for it) rests there rather than jumping to the corner.\n let last: RegionMapCenter | null = null;\n const pointAt = (event: PointerEvent): RegionMapCenter | null => {\n const box = svgRef.current?.getBoundingClientRect();\n if (!box || box.width === 0 || box.height === 0) return null;\n const { view, center } = live.current;\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) return null;\n const fx = clampFraction((event.clientX - box.left) / box.width);\n const fy = clampFraction((event.clientY - box.top) / box.height);\n return latLngAt(center, { x: view.minX + fx * view.spanX, y: view.minY + fy * view.spanY });\n };\n const down = (event: PointerEvent): void => {\n event.stopPropagation();\n if (live.current.pin.disabled) return;\n event.preventDefault();\n dragging = event.pointerId;\n last = null;\n element.setPointerCapture?.(event.pointerId);\n };\n const move = (event: PointerEvent): void => {\n if (dragging !== event.pointerId) return;\n event.stopPropagation();\n const at = pointAt(event);\n if (!at) return;\n last = at;\n live.current.pin.onMove?.(at);\n };\n const up = (event: PointerEvent): void => {\n if (dragging !== event.pointerId) return;\n event.stopPropagation();\n dragging = null;\n const at = event.type === 'pointercancel' ? last : (pointAt(event) ?? last);\n if (at) live.current.pin.onDrop(at);\n };\n // A click that ends a drag is the drag's, not a tap on the area under it.\n const click = (event: MouseEvent): void => event.stopPropagation();\n element.addEventListener('pointerdown', down);\n element.addEventListener('pointermove', move);\n element.addEventListener('pointerup', up);\n element.addEventListener('pointercancel', up);\n element.addEventListener('click', click);\n return () => {\n element.removeEventListener('pointerdown', down);\n element.removeEventListener('pointermove', move);\n element.removeEventListener('pointerup', up);\n element.removeEventListener('pointercancel', up);\n element.removeEventListener('click', click);\n };\n }, [ref, svgRef, live]);\n}\n\n/** The circles around the pin: solid in the primary colour, faintly filled. */\nexport function PinCircles({ at, radii, theme }: { at: PlanePoint; radii: readonly number[]; theme: Theme }): React.JSX.Element {\n return (\n <>\n {radii.map((radius) => (\n <circle\n key={radius}\n cx={at.x}\n cy={at.y}\n r={radius}\n fill={alpha(theme.palette.primary.main, 0.06)}\n stroke={theme.palette.primary.main}\n strokeWidth={2.25}\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />\n ))}\n </>\n );\n}\n\n/** Where the circles stood: a dashed ring and dot at `ghost`, and a dashed line from it to the pin. */\nexport function GhostShapes({\n ghost,\n pinAt,\n projection,\n view,\n testId,\n theme,\n}: {\n ghost: RegionMapGhost;\n pinAt: PlanePoint;\n projection: Projection;\n view: PlaneBox;\n testId: string;\n theme: Theme;\n}): React.JSX.Element {\n const at = projection.project([ghost.at.latitude, ghost.at.longitude]);\n const stroke = theme.palette.text.secondary;\n const common = { fill: 'none', stroke, vectorEffect: 'non-scaling-stroke', pointerEvents: 'none' } as const;\n return (\n <g data-testid={`${testId}-ghost`}>\n <circle cx={at.x} cy={at.y} r={ghost.radiusMetres} strokeWidth={1.5} strokeDasharray=\"6 5\" {...common} />\n <line x1={at.x} y1={at.y} x2={pinAt.x} y2={pinAt.y} strokeWidth={1.5} strokeDasharray=\"4 4\" {...common} />\n <circle cx={at.x} cy={at.y} r={view.spanX / 110} strokeWidth={2} strokeDasharray=\"3 2\" {...common} fill={alpha(theme.palette.background.paper, 0.7)} />\n </g>\n );\n}\n\n/** The dots: filled with the ink, or hollow (paper with an ink ring). */\nexport function Dots({ dots, projection, view, testId, theme }: { dots: readonly RegionMapDot[]; projection: Projection; view: PlaneBox; testId: string; theme: Theme }): React.JSX.Element {\n return (\n <g data-testid={`${testId}-dots`}>\n {dots.map((dot) => {\n const at = projection.project([dot.at.latitude, dot.at.longitude]);\n return (\n <circle\n key={dot.id}\n cx={at.x}\n cy={at.y}\n r={view.spanX / 150}\n fill={dot.filled ? theme.palette.text.primary : theme.palette.background.paper}\n stroke={theme.palette.text.primary}\n strokeWidth={2}\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n data-filled={dot.filled ? 'true' : 'false'}\n />\n );\n })}\n </g>\n );\n}\n\n/** Nice lengths a scale bar may take, in metres. */\nconst SCALE_STEPS = [50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000];\n\n/** The longest nice length that fits in a quarter of the drawing's width. */\nexport function scaleMetres(view: PlaneBox): number {\n const quarter = view.spanX / 4;\n return SCALE_STEPS.filter((step) => step <= quarter).at(-1) ?? SCALE_STEPS[0]!;\n}\n\n/**\n * A scale bar, bottom-left, when the host gives `copy.scale`. It reads what is\n * on screen: a host that zooms the drawing's layers (a CSS scale on the SVG)\n * shows fewer metres per pixel, so after every render the bar compares the\n * SVG's drawn width with its laid-out width — both off the SVG itself — and\n * spans the drawing's own width, so its share of it is a share of the view.\n */\nexport function ScaleBar({\n view,\n copy,\n svgRef,\n testId,\n theme,\n}: {\n view: PlaneBox;\n copy: RegionMapCopy;\n svgRef: React.RefObject<SVGSVGElement | null>;\n testId: string;\n theme: Theme;\n}): React.JSX.Element | null {\n // What the drawing shows on screen: its laid-out width, and its width as\n // drawn (a host's CSS scale on the SVG), both read off the SVG itself.\n const [screen, setScreen] = React.useState({ laidOut: 0, drawn: 0 });\n const wanted = copy.scale !== undefined;\n React.useLayoutEffect(() => {\n if (!wanted) return;\n const svg = svgRef.current;\n const next = { laidOut: svg?.clientWidth ?? 0, drawn: svg?.getBoundingClientRect().width ?? 0 };\n if (next.laidOut !== screen.laidOut || Math.abs(next.drawn - screen.drawn) > 0.5) setScreen(next);\n });\n if (!copy.scale) return null;\n const zoom = screen.laidOut > 0 && screen.drawn > 0 ? screen.drawn / screen.laidOut : 1;\n const metres = scaleMetres({ ...view, spanX: view.spanX / zoom });\n // The bar's share of the drawing's width: metres on screen over the metres the width shows.\n const share = (metres * zoom) / view.spanX;\n return (\n <Box\n data-testid={`${testId}-scale`}\n aria-hidden\n sx={{ position: 'absolute', left: 0, right: 0, bottom: rem(theme, 10), pointerEvents: 'none', zIndex: 1 }}\n >\n <Box component=\"span\" sx={{ display: 'block', ml: rem(theme, 10), fontSize: rem(theme, 12), color: 'text.secondary' }}>\n {copy.scale(metres)}\n </Box>\n <Box\n component=\"span\"\n sx={{ display: 'block', height: rem(theme, 4), ml: rem(theme, 10), width: `${(share * 100).toFixed(2)}%`, borderStyle: 'solid', borderWidth: `0 ${rem(theme, 1.5)} ${rem(theme, 1.5)}`, borderColor: 'text.secondary' }}\n />\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-2SRWPNQ7.js";
15
15
  import {
16
16
  Progress
17
- } from "./chunk-L4FWEI2P.js";
17
+ } from "./chunk-3V3Z4EML.js";
18
18
  import {
19
19
  Button
20
20
  } from "./chunk-YOXYSAUI.js";
@@ -108,4 +108,4 @@ function SequenceHeader(props) {
108
108
  export {
109
109
  SequenceHeader
110
110
  };
111
- //# sourceMappingURL=chunk-JO6D7YGN.js.map
111
+ //# sourceMappingURL=chunk-CWRQGA2T.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- MapLayers
3
- } from "./chunk-HCTHY66U.js";
4
1
  import {
5
2
  MapCoordinates,
6
3
  MapMarkers
7
4
  } from "./chunk-4Y3QLISA.js";
5
+ import {
6
+ MapLayers
7
+ } from "./chunk-KAGXV3ID.js";
8
8
  import {
9
9
  glassStyles,
10
10
  resolveMapCopy,
@@ -113,4 +113,4 @@ export {
113
113
  MapPreview,
114
114
  MapPreview_default
115
115
  };
116
- //# sourceMappingURL=chunk-ZW7Q3IRL.js.map
116
+ //# sourceMappingURL=chunk-FYJL432J.js.map
@@ -1,3 +1,13 @@
1
+ import {
2
+ useTextFit
3
+ } from "./chunk-WG7CAT5D.js";
4
+ import {
5
+ formatHour,
6
+ formatRange,
7
+ hitBoundsOf,
8
+ percentOf,
9
+ ticksOf
10
+ } from "./chunk-L5CAHQIN.js";
1
11
  import {
2
12
  actionsSx,
3
13
  actualLabelSx,
@@ -18,16 +28,6 @@ import {
18
28
  import {
19
29
  DAY_RULER_METRICS
20
30
  } from "./chunk-273OLFJD.js";
21
- import {
22
- useTextFit
23
- } from "./chunk-WG7CAT5D.js";
24
- import {
25
- formatHour,
26
- formatRange,
27
- hitBoundsOf,
28
- percentOf,
29
- ticksOf
30
- } from "./chunk-L5CAHQIN.js";
31
31
  import {
32
32
  ScheduleNameCell
33
33
  } from "./chunk-CGS2LQE5.js";
@@ -228,4 +228,4 @@ export {
228
228
  Coverage,
229
229
  Axis
230
230
  };
231
- //# sourceMappingURL=chunk-G6TKWNF2.js.map
231
+ //# sourceMappingURL=chunk-GZITNT7O.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ useHoverCard
3
+ } from "./chunk-Z3USLQQT.js";
1
4
  import {
2
5
  HoverCardContent
3
6
  } from "./chunk-NRIV2CQ2.js";
@@ -8,9 +11,6 @@ import {
8
11
  getTransformOrigin,
9
12
  sideOf
10
13
  } from "./chunk-ABF64CAQ.js";
11
- import {
12
- useHoverCard
13
- } from "./chunk-Z3USLQQT.js";
14
14
  import {
15
15
  withDefaults
16
16
  } from "./chunk-HPK33ACY.js";
@@ -191,4 +191,4 @@ HoverCard.displayName = "HoverCard";
191
191
  export {
192
192
  HoverCard
193
193
  };
194
- //# sourceMappingURL=chunk-RFMQBIE6.js.map
194
+ //# sourceMappingURL=chunk-HBHBRRSW.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- DAY_RULER_METRICS
3
- } from "./chunk-273OLFJD.js";
4
1
  import {
5
2
  clamp,
6
3
  formatRange,
@@ -8,6 +5,9 @@ import {
8
5
  resized,
9
6
  snapTo
10
7
  } from "./chunk-L5CAHQIN.js";
8
+ import {
9
+ DAY_RULER_METRICS
10
+ } from "./chunk-273OLFJD.js";
11
11
 
12
12
  // src/components/data-display/DayRuler/DayRuler.keyboard.ts
13
13
  function gestureOf(event, block, can) {
@@ -59,4 +59,4 @@ export {
59
59
  handleBlockKey,
60
60
  keyCreateSpan
61
61
  };
62
- //# sourceMappingURL=chunk-U4Z6GZDW.js.map
62
+ //# sourceMappingURL=chunk-HN36UVOE.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  PillControl
3
3
  } from "./chunk-XA5ES25V.js";
4
- import {
5
- QuickRow
6
- } from "./chunk-AT6UKTH4.js";
7
4
  import {
8
5
  isQuickActive
9
6
  } from "./chunk-KYUEO2IO.js";
10
7
  import {
11
8
  RangeBounds
12
9
  } from "./chunk-FW5GTAUY.js";
10
+ import {
11
+ QuickRow
12
+ } from "./chunk-AT6UKTH4.js";
13
13
  import {
14
14
  isRangeSet
15
15
  } from "./chunk-GCZJH4XL.js";
@@ -278,4 +278,4 @@ export {
278
278
  clearTargetSx,
279
279
  MoreGroup
280
280
  };
281
- //# sourceMappingURL=chunk-WK577LQL.js.map
281
+ //# sourceMappingURL=chunk-J2IQ6FJ5.js.map
@@ -4,13 +4,13 @@ import {
4
4
  import {
5
5
  MapSearchBar
6
6
  } from "./chunk-MIUPTZS6.js";
7
+ import {
8
+ resolveMapCopy
9
+ } from "./chunk-ZX4ORMBC.js";
7
10
  import {
8
11
  HeatmapOverlay,
9
12
  RouteOverlay
10
13
  } from "./chunk-ZZ4MMUBY.js";
11
- import {
12
- resolveMapCopy
13
- } from "./chunk-ZX4ORMBC.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-HCTHY66U.js.map
62
+ //# sourceMappingURL=chunk-KAGXV3ID.js.map
@@ -4,7 +4,7 @@ import {
4
4
  projectRings,
5
5
  projectionAt,
6
6
  viewBoxFor
7
- } from "./chunk-COOSJKZL.js";
7
+ } from "./chunk-MNJZPJ5S.js";
8
8
 
9
9
  // src/components/data-display/RegionMap/RegionMap.view.ts
10
10
  function unionBox(boxes) {
@@ -69,4 +69,4 @@ export {
69
69
  centreOf,
70
70
  regionMapView
71
71
  };
72
- //# sourceMappingURL=chunk-FWAY2SAI.js.map
72
+ //# sourceMappingURL=chunk-KAZWBDIH.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  handleBlockKey,
3
3
  keyCreateSpan
4
- } from "./chunk-U4Z6GZDW.js";
4
+ } from "./chunk-HN36UVOE.js";
5
5
  import {
6
6
  GroupFooter
7
- } from "./chunk-MPVH2GM5.js";
7
+ } from "./chunk-RAQD5QCM.js";
8
8
  import {
9
9
  EN_US_DAY_RULER_LABELS
10
10
  } from "./chunk-F2ZUUEXC.js";
11
11
  import {
12
12
  useRulerDrag
13
- } from "./chunk-KXDLLS62.js";
13
+ } from "./chunk-REHGWN5M.js";
14
14
  import {
15
15
  Axis,
16
16
  Coverage,
17
17
  RulerRow
18
- } from "./chunk-G6TKWNF2.js";
18
+ } from "./chunk-GZITNT7O.js";
19
19
  import {
20
20
  groupTitleSx,
21
21
  rootSx,
@@ -127,4 +127,4 @@ function DayRuler(props) {
127
127
  export {
128
128
  DayRuler
129
129
  };
130
- //# sourceMappingURL=chunk-DKPELKGL.js.map
130
+ //# sourceMappingURL=chunk-KV7LTOWC.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MapPreview
3
- } from "./chunk-ZW7Q3IRL.js";
3
+ } from "./chunk-FYJL432J.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-UC7DLGMP.js.map
41
+ //# sourceMappingURL=chunk-KVP5A3YK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useRegionMap
3
- } from "./chunk-G2NVBCF7.js";
3
+ } from "./chunk-NWUMGE6T.js";
4
4
  import {
5
5
  RegionMapList
6
6
  } from "./chunk-BRZKOUEL.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-PBRCKHN3.js";
10
10
  import {
11
11
  RegionMapDrawing
12
- } from "./chunk-E4MJA52O.js";
12
+ } from "./chunk-YHFLI2FD.js";
13
13
 
14
14
  // src/components/data-display/RegionMap/RegionMap.tsx
15
15
  import Box from "@mui/material/Box/index.js";
@@ -20,6 +20,9 @@ function RegionMap({
20
20
  regions,
21
21
  center,
22
22
  circles,
23
+ pin,
24
+ ghost,
25
+ dots,
23
26
  reach,
24
27
  overlay,
25
28
  onToggle,
@@ -43,6 +46,7 @@ function RegionMap({
43
46
  model: { ...model, view },
44
47
  overlay,
45
48
  showCenter: center !== null,
49
+ moving: center === null ? void 0 : { center, pin, ghost, dots, copy },
46
50
  highlightedIds,
47
51
  maxHeight,
48
52
  label: copy.mapLabel,
@@ -80,4 +84,4 @@ function RegionMap({
80
84
  export {
81
85
  RegionMap
82
86
  };
83
- //# sourceMappingURL=chunk-3CXRHRGE.js.map
87
+ //# sourceMappingURL=chunk-LCKUEYU2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { useRegionMap } from './RegionMap.hooks';\nimport type { RegionMapProps } from './RegionMap.types';\nimport { RegionMapDrawing } from './RegionMapDrawing';\nimport { RegionMapLegend } from './RegionMapLegend';\nimport { RegionMapList } from './RegionMapList';\n\n/** One empty list, so the default does not change identity per render. */\nconst NO_IDS: readonly string[] = [];\n\n/**\n * A hand-drawn map of named areas around a centre; a tap toggles an area.\n *\n * Drawn as inline SVG over a plain background — no tile server, no API key,\n * nothing fetched — because the question it answers is \"which of THESE areas\",\n * not \"what is the street called\". Four choices shape it:\n *\n * - **The list is the accessible way in.** The drawing is one `role=\"img\"`\n * with a name; its areas are not tab stops (dozens of them, many too small to\n * tap on a phone). Every area is also a toggle button in the list beneath,\n * with `aria-pressed`, which is what a keyboard and a screen reader use —\n * and what reaches a sliver no finger can.\n * - **Excluded is hatched AND named, never only coloured,** and never in the\n * error colour: leaving an area out is a choice, not a failure.\n * - **The hit test is ours, not only the browser's.** A mouse click on a path\n * is that path. A finger's tap takes the SMALLEST area within a few pixels'\n * worth of metres (`hitRegion`), so a sliver beside a big area can be hit\n * from the map; one too thin even for that is still on the list.\n * - **The host can draw inside it.** `reach` widens the view past the largest\n * circle and `overlay` draws a layer in the SVG at the map's own projection,\n * tap-transparent; `regionMapView` gives the same view to HTML laid over it.\n * - **A toggle is cheap.** Geometry is projected once per `rings` identity,\n * and the base layer is memoised, so a tap re-renders the hatch and labels.\n */\nexport function RegionMap({\n regions,\n center,\n circles,\n pin,\n ghost,\n dots,\n reach,\n overlay,\n onToggle,\n highlightedIds = NO_IDS,\n copy,\n listMode = 'collapsed',\n listSort = 'given',\n maxHeight,\n className,\n dataTestId = 'region-map',\n}: RegionMapProps): React.JSX.Element | null {\n const theme = useTheme();\n const model = useRegionMap({ regions, center, circles, reach, onToggle });\n const { view } = model;\n if (view === null && regions.length === 0) return null;\n return (\n <Box className={className} data-testid={dataTestId}>\n {view && (\n <>\n <RegionMapDrawing\n model={{ ...model, view }}\n overlay={overlay}\n showCenter={center !== null}\n moving={center === null ? undefined : { center, pin, ghost, dots, copy }}\n highlightedIds={highlightedIds}\n maxHeight={maxHeight}\n label={copy.mapLabel}\n tappable={onToggle !== undefined}\n testId={dataTestId}\n theme={theme}\n />\n <RegionMapLegend\n copy={copy}\n outermostMetres={model.outermostMetres}\n showCenter={center !== null}\n theme={theme}\n testId={dataTestId}\n />\n </>\n )}\n {listMode !== 'none' && (\n <RegionMapList\n regions={regions}\n copy={copy}\n mode={listMode}\n sort={listSort}\n onToggle={onToggle}\n testId={dataTestId}\n theme={theme}\n />\n )}\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAChB,SAAS,gBAAgB;AA6DjB,mBACE,KADF;AAnDR,IAAM,SAA4B,CAAC;AA0B5B,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAA6C;AAC3C,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,aAAa,EAAE,SAAS,QAAQ,SAAS,OAAO,SAAS,CAAC;AACxE,QAAM,EAAE,KAAK,IAAI;AACjB,MAAI,SAAS,QAAQ,QAAQ,WAAW,EAAG,QAAO;AAClD,SACE,qBAAC,OAAI,WAAsB,eAAa,YACrC;AAAA,YACC,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,GAAG,OAAO,KAAK;AAAA,UACxB;AAAA,UACA,YAAY,WAAW;AAAA,UACvB,QAAQ,WAAW,OAAO,SAAY,EAAE,QAAQ,KAAK,OAAO,MAAM,KAAK;AAAA,UACvE;AAAA,UACA;AAAA,UACA,OAAO,KAAK;AAAA,UACZ,UAAU,aAAa;AAAA,UACvB,QAAQ;AAAA,UACR;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,iBAAiB,MAAM;AAAA,UACvB,YAAY,WAAW;AAAA,UACvB;AAAA,UACA,QAAQ;AAAA;AAAA,MACV;AAAA,OACF;AAAA,IAED,aAAa,UACZ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -5,6 +5,10 @@ import {
5
5
  import {
6
6
  filterRows
7
7
  } from "./chunk-YGQX7BNI.js";
8
+ import {
9
+ resolveScope,
10
+ useScopeConfigChecks
11
+ } from "./chunk-PL2AB5HJ.js";
8
12
  import {
9
13
  serverDerived,
10
14
  useServerQuery
@@ -12,10 +16,6 @@ import {
12
16
  import {
13
17
  useSelection
14
18
  } from "./chunk-LLZWB32X.js";
15
- import {
16
- resolveScope,
17
- useScopeConfigChecks
18
- } from "./chunk-PL2AB5HJ.js";
19
19
  import {
20
20
  useClearFilters,
21
21
  useStateWriters
@@ -178,4 +178,4 @@ function useDataViewsState({
178
178
  export {
179
179
  useDataViewsState
180
180
  };
181
- //# sourceMappingURL=chunk-EGBQR5GH.js.map
181
+ //# sourceMappingURL=chunk-LOLYBFYY.js.map