@eyeon/map 2.0.1 → 2.0.3

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 (139) hide show
  1. package/README.md +18 -1
  2. package/dist/assets/MapViewer.css +1 -1
  3. package/dist/assets/index.css +1 -1
  4. package/dist/chunks/MapViewer.js +1988 -358
  5. package/dist/chunks/MapViewer.js.map +1 -1
  6. package/dist/chunks/graph-tools.js +202 -109
  7. package/dist/chunks/graph-tools.js.map +1 -1
  8. package/dist/chunks/stacking.js +1426 -0
  9. package/dist/chunks/stacking.js.map +1 -0
  10. package/dist/core/filletPolygon.d.ts +10 -0
  11. package/dist/core/filletPolygon.d.ts.map +1 -0
  12. package/dist/core/geometry/index.d.ts +41 -4
  13. package/dist/core/geometry/index.d.ts.map +1 -1
  14. package/dist/core/hostChrome.d.ts +20 -0
  15. package/dist/core/hostChrome.d.ts.map +1 -0
  16. package/dist/core/import/index.d.ts +52 -3
  17. package/dist/core/import/index.d.ts.map +1 -1
  18. package/dist/core/import/svgStyle.d.ts +21 -0
  19. package/dist/core/import/svgStyle.d.ts.map +1 -0
  20. package/dist/core/import/svgTransform.d.ts +49 -0
  21. package/dist/core/import/svgTransform.d.ts.map +1 -0
  22. package/dist/core/index.d.ts +6 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +89 -279
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/layerStyles.d.ts +44 -0
  27. package/dist/core/layerStyles.d.ts.map +1 -0
  28. package/dist/core/mediaUrl.d.ts +3 -0
  29. package/dist/core/mediaUrl.d.ts.map +1 -0
  30. package/dist/core/outdoorDecoration.d.ts +16 -0
  31. package/dist/core/outdoorDecoration.d.ts.map +1 -0
  32. package/dist/core/publish/index.d.ts +8 -2
  33. package/dist/core/publish/index.d.ts.map +1 -1
  34. package/dist/core/routing/graph-tools.d.ts +28 -2
  35. package/dist/core/routing/graph-tools.d.ts.map +1 -1
  36. package/dist/core/routing/pathfinding.d.ts.map +1 -1
  37. package/dist/core/stacking.d.ts +61 -0
  38. package/dist/core/stacking.d.ts.map +1 -0
  39. package/dist/core/types.d.ts +31 -0
  40. package/dist/core/types.d.ts.map +1 -1
  41. package/dist/editor/MapEditor.d.ts +28 -16
  42. package/dist/editor/MapEditor.d.ts.map +1 -1
  43. package/dist/editor/canvas/EditorCanvas.d.ts +56 -6
  44. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  45. package/dist/editor/canvas/OutdoorSvgUnderlay.d.ts +7 -0
  46. package/dist/editor/canvas/OutdoorSvgUnderlay.d.ts.map +1 -0
  47. package/dist/editor/canvas/coords.d.ts +51 -0
  48. package/dist/editor/canvas/coords.d.ts.map +1 -0
  49. package/dist/editor/canvas/editorFill.d.ts +10 -0
  50. package/dist/editor/canvas/editorFill.d.ts.map +1 -0
  51. package/dist/editor/canvas/editorHover.d.ts +14 -0
  52. package/dist/editor/canvas/editorHover.d.ts.map +1 -0
  53. package/dist/editor/canvas/underlayHint.d.ts +5 -0
  54. package/dist/editor/canvas/underlayHint.d.ts.map +1 -0
  55. package/dist/editor/connectorAssignments.d.ts +64 -0
  56. package/dist/editor/connectorAssignments.d.ts.map +1 -0
  57. package/dist/editor/draftOps.d.ts +22 -0
  58. package/dist/editor/draftOps.d.ts.map +1 -0
  59. package/dist/editor/editorSectionReturn.d.ts +12 -0
  60. package/dist/editor/editorSectionReturn.d.ts.map +1 -0
  61. package/dist/editor/floorsListReturn.d.ts +5 -0
  62. package/dist/editor/floorsListReturn.d.ts.map +1 -0
  63. package/dist/editor/geometryEdit.d.ts +54 -0
  64. package/dist/editor/geometryEdit.d.ts.map +1 -0
  65. package/dist/editor/hexColor.d.ts +4 -0
  66. package/dist/editor/hexColor.d.ts.map +1 -0
  67. package/dist/editor/history.d.ts +31 -0
  68. package/dist/editor/history.d.ts.map +1 -0
  69. package/dist/editor/index.css +1497 -143
  70. package/dist/editor/index.d.ts +9 -3
  71. package/dist/editor/index.d.ts.map +1 -1
  72. package/dist/editor/index.js +6377 -601
  73. package/dist/editor/index.js.map +1 -1
  74. package/dist/editor/labelText.d.ts +15 -0
  75. package/dist/editor/labelText.d.ts.map +1 -0
  76. package/dist/editor/labels.d.ts +5 -0
  77. package/dist/editor/labels.d.ts.map +1 -0
  78. package/dist/editor/panels/ConnectorAssign.d.ts +12 -0
  79. package/dist/editor/panels/ConnectorAssign.d.ts.map +1 -0
  80. package/dist/editor/panels/FloorsPanel.d.ts +64 -0
  81. package/dist/editor/panels/FloorsPanel.d.ts.map +1 -0
  82. package/dist/editor/panels/ImportReviewPanel.d.ts +22 -0
  83. package/dist/editor/panels/ImportReviewPanel.d.ts.map +1 -0
  84. package/dist/editor/panels/Inspector.d.ts +6 -3
  85. package/dist/editor/panels/Inspector.d.ts.map +1 -1
  86. package/dist/editor/panels/LeftRail.d.ts +26 -11
  87. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  88. package/dist/editor/panels/PreviewOverlay.d.ts +11 -2
  89. package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
  90. package/dist/editor/pathRings.d.ts +79 -0
  91. package/dist/editor/pathRings.d.ts.map +1 -0
  92. package/dist/editor/portalSurface.d.ts +37 -0
  93. package/dist/editor/portalSurface.d.ts.map +1 -0
  94. package/dist/editor/previewDocument.d.ts +9 -0
  95. package/dist/editor/previewDocument.d.ts.map +1 -0
  96. package/dist/editor/railAssignments.d.ts +22 -0
  97. package/dist/editor/railAssignments.d.ts.map +1 -0
  98. package/dist/editor/routeStubs.d.ts +103 -0
  99. package/dist/editor/routeStubs.d.ts.map +1 -0
  100. package/dist/editor/snapPoint.d.ts +5 -0
  101. package/dist/editor/snapPoint.d.ts.map +1 -0
  102. package/dist/editor/splitJoin.d.ts +78 -0
  103. package/dist/editor/splitJoin.d.ts.map +1 -0
  104. package/dist/editor/tools.d.ts +49 -0
  105. package/dist/editor/tools.d.ts.map +1 -0
  106. package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +26703 -28
  107. package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +4459 -0
  108. package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +567 -0
  109. package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +238 -0
  110. package/dist/test-maps/shops-at-south-town/SVG/UF - Shops At South Town.svg +276 -0
  111. package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +4131 -1
  112. package/dist/ui/ModernSelect.d.ts +14 -0
  113. package/dist/ui/ModernSelect.d.ts.map +1 -0
  114. package/dist/ui/selectSearch.d.ts +9 -0
  115. package/dist/ui/selectSearch.d.ts.map +1 -0
  116. package/dist/viewer/MapViewer.d.ts +14 -3
  117. package/dist/viewer/MapViewer.d.ts.map +1 -1
  118. package/dist/viewer/camera.d.ts +37 -0
  119. package/dist/viewer/camera.d.ts.map +1 -0
  120. package/dist/viewer/components/CameraRig.d.ts +18 -0
  121. package/dist/viewer/components/CameraRig.d.ts.map +1 -0
  122. package/dist/viewer/components/LevelMeshes.d.ts +6 -1
  123. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
  124. package/dist/viewer/components/MapScene.d.ts +6 -1
  125. package/dist/viewer/components/MapScene.d.ts.map +1 -1
  126. package/dist/viewer/components/SvgVectorLayer.d.ts +18 -0
  127. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -0
  128. package/dist/viewer/index.css +236 -37
  129. package/dist/viewer/index.d.ts +4 -0
  130. package/dist/viewer/index.d.ts.map +1 -1
  131. package/dist/viewer/index.js +9 -4
  132. package/dist/viewer/index.js.map +1 -1
  133. package/dist/viewer/ui/MapControls.d.ts +22 -0
  134. package/dist/viewer/ui/MapControls.d.ts.map +1 -0
  135. package/dist/viewer/ui/RuntimeChrome.d.ts +3 -3
  136. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
  137. package/package.json +7 -3
  138. package/dist/chunks/pathfinding.js +0 -343
  139. package/dist/chunks/pathfinding.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eyeon/map",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "EyeOn Center Map v2 — core, viewer, and editor",
5
5
  "author": "EyeOn LLC",
6
6
  "license": "UNLICENSED",
@@ -16,11 +16,15 @@
16
16
  "exports": {
17
17
  ".": {
18
18
  "types": "./dist/core/index.d.ts",
19
- "import": "./dist/core/index.js"
19
+ "require": "./dist/core/index.js",
20
+ "import": "./dist/core/index.js",
21
+ "default": "./dist/core/index.js"
20
22
  },
21
23
  "./core": {
22
24
  "types": "./dist/core/index.d.ts",
23
- "import": "./dist/core/index.js"
25
+ "require": "./dist/core/index.js",
26
+ "import": "./dist/core/index.js",
27
+ "default": "./dist/core/index.js"
24
28
  },
25
29
  "./viewer": {
26
30
  "types": "./dist/viewer/index.d.ts",
@@ -1,343 +0,0 @@
1
- import N from "ngraph.graph";
2
- import C from "ngraph.path";
3
- const X = {
4
- MAP_STYLE: "2D",
5
- MAP_BACKGROUND_COLOR: "#f5f5f5",
6
- ACCENT_COLOR: "#2563eb",
7
- STORE_DEFAULT_COLOR: "#e2e8f0",
8
- STORE_TEXT_COLOR: "#1e293b",
9
- STORE_HEIGHT: 4,
10
- WALL_COLOR: "#64748b",
11
- WALL_THICKNESS: 0.4,
12
- BOUNDARY_COLOR: "#334155",
13
- BOUNDARY_THICKNESS: 0.6,
14
- BASE_COLOR: "#ffffff",
15
- OVERLAY_COLOR: "#000000",
16
- OVERLAY_OPACITY: 0.15,
17
- PARKING_ZONE_COLOR: "#cbd5e1",
18
- GREEN_AREA_COLOR: "#86efac",
19
- WATER_COLOR: "#7dd3fc",
20
- WALKABLE_COLOR: "#f8fafc",
21
- KIOSK_SIZE: 12,
22
- ZOOM_STEP: 0.5,
23
- CAMERA_MAX_DISTANCE: 2e3,
24
- CAMERA_MIN_DISTANCE: 50
25
- }, B = [
26
- "unit",
27
- "amenity",
28
- "kiosk_screen",
29
- "connector",
30
- "entrance",
31
- "parking_zone"
32
- ], _ = 1e4, W = 2.5;
33
- function b(e, n) {
34
- return e.map((i) => ({ x: i.x, y: n - i.y }));
35
- }
36
- function A(e, n) {
37
- const i = e.x - n.x, r = e.y - n.y;
38
- return Math.hypot(i, r);
39
- }
40
- function M(e) {
41
- if (e.length === 0)
42
- return { minX: 0, minY: 0, maxX: 0, maxY: 0 };
43
- let n = e[0].x, i = e[0].y, r = e[0].x, o = e[0].y;
44
- for (let s = 1; s < e.length; s++) {
45
- const t = e[s];
46
- t.x < n && (n = t.x), t.y < i && (i = t.y), t.x > r && (r = t.x), t.y > o && (o = t.y);
47
- }
48
- return { minX: n, minY: i, maxX: r, maxY: o };
49
- }
50
- function F(e, n) {
51
- return {
52
- minX: Math.min(e.minX, n.minX),
53
- minY: Math.min(e.minY, n.minY),
54
- maxX: Math.max(e.maxX, n.maxX),
55
- maxY: Math.max(e.maxY, n.maxY)
56
- };
57
- }
58
- function T(e) {
59
- if (e.length === 0) return { x: 0, y: 0 };
60
- let n = 0, i = 0;
61
- for (const r of e)
62
- n += r.x, i += r.y;
63
- return { x: n / e.length, y: i / e.length };
64
- }
65
- function k(e, n) {
66
- let i = !1;
67
- for (let r = 0, o = n.length - 1; r < n.length; o = r++) {
68
- const s = n[r].x, t = n[r].y, u = n[o].x, c = n[o].y;
69
- t > e.y != c > e.y && e.x < (u - s) * (e.y - t) / (c - t + Number.EPSILON) + s && (i = !i);
70
- }
71
- return i;
72
- }
73
- function G(e, n) {
74
- return n.some((i) => k(e, i));
75
- }
76
- function S(e, n, i) {
77
- const r = i.x - n.x, o = i.y - n.y, s = r * r + o * o;
78
- if (s === 0)
79
- return { point: { ...n }, t: 0, distance: A(e, n) };
80
- let t = ((e.x - n.x) * r + (e.y - n.y) * o) / s;
81
- t = Math.max(0, Math.min(1, t));
82
- const u = { x: n.x + t * r, y: n.y + t * o };
83
- return { point: u, t, distance: A(e, u) };
84
- }
85
- function K(e, n) {
86
- if (n.length < 2) return null;
87
- let i = null;
88
- for (let r = 0; r < n.length - 1; r++) {
89
- const o = S(e, n[r], n[r + 1]);
90
- (!i || o.distance < i.distance) && (i = { point: o.point, segmentIndex: r, distance: o.distance });
91
- }
92
- return i;
93
- }
94
- function R(e, n, i, r, o = 8) {
95
- const s = [];
96
- for (let t = 0; t <= o; t++) {
97
- const u = t / o, c = 1 - u;
98
- s.push({
99
- x: c * c * c * e.x + 3 * c * c * u * n.x + 3 * c * u * u * i.x + u * u * u * r.x,
100
- y: c * c * c * e.y + 3 * c * c * u * n.y + 3 * c * u * u * i.y + u * u * u * r.y
101
- });
102
- }
103
- return s;
104
- }
105
- function L(e, n, i, r = 6) {
106
- const o = [];
107
- for (let s = 0; s <= r; s++) {
108
- const t = s / r, u = 1 - t;
109
- o.push({
110
- x: u * u * e.x + 2 * u * t * n.x + t * t * i.x,
111
- y: u * u * e.y + 2 * u * t * n.y + t * t * i.y
112
- });
113
- }
114
- return o;
115
- }
116
- function P(e, n) {
117
- const i = e.match(/[a-zA-Z]|-?\d*\.?\d+(?:e[-+]?\d+)?/g) ?? [], r = [];
118
- let o = [], s = 0, t = 0, u = 0, c = 0, d = null, m = 0, y = "";
119
- const a = () => Number(i[m++]);
120
- for (; m < i.length; ) {
121
- const h = i[m];
122
- switch (/[a-zA-Z]/.test(h) && (y = h, m++), y) {
123
- case "M":
124
- case "m": {
125
- const l = y === "m", f = a(), x = a();
126
- s = l ? s + f : f, t = l ? t + x : x, o.length > 0 && r.push(o), o = [{ x: s, y: t }], u = s, c = t, d = null, y = l ? "l" : "L";
127
- break;
128
- }
129
- case "L":
130
- case "l": {
131
- const l = y === "l", f = a(), x = a();
132
- s = l ? s + f : f, t = l ? t + x : x, o.push({ x: s, y: t }), d = null;
133
- break;
134
- }
135
- case "H":
136
- case "h": {
137
- const l = y === "h", f = a();
138
- s = l ? s + f : f, o.push({ x: s, y: t }), d = null;
139
- break;
140
- }
141
- case "V":
142
- case "v": {
143
- const l = y === "v", f = a();
144
- t = l ? t + f : f, o.push({ x: s, y: t }), d = null;
145
- break;
146
- }
147
- case "C":
148
- case "c": {
149
- const l = y === "c", f = l ? s + a() : a(), x = l ? t + a() : a(), I = l ? s + a() : a(), p = l ? t + a() : a(), g = l ? s + a() : a(), O = l ? t + a() : a(), E = R(
150
- { x: s, y: t },
151
- { x: f, y: x },
152
- { x: I, y: p },
153
- { x: g, y: O }
154
- );
155
- o.push(...E.slice(1)), d = { x: I, y: p }, s = g, t = O;
156
- break;
157
- }
158
- case "Q":
159
- case "q": {
160
- const l = y === "q", f = l ? s + a() : a(), x = l ? t + a() : a(), I = l ? s + a() : a(), p = l ? t + a() : a(), g = L(
161
- { x: s, y: t },
162
- { x: f, y: x },
163
- { x: I, y: p }
164
- );
165
- o.push(...g.slice(1)), d = { x: f, y: x }, s = I, t = p;
166
- break;
167
- }
168
- case "S":
169
- case "s": {
170
- const l = y === "s", f = d ? 2 * s - d.x : s, x = d ? 2 * t - d.y : t, I = l ? s + a() : a(), p = l ? t + a() : a(), g = l ? s + a() : a(), O = l ? t + a() : a(), E = R(
171
- { x: s, y: t },
172
- { x: f, y: x },
173
- { x: I, y: p },
174
- { x: g, y: O }
175
- );
176
- o.push(...E.slice(1)), d = { x: I, y: p }, s = g, t = O;
177
- break;
178
- }
179
- case "T":
180
- case "t": {
181
- const l = y === "t", f = d ? 2 * s - d.x : s, x = d ? 2 * t - d.y : t, I = l ? s + a() : a(), p = l ? t + a() : a(), g = L(
182
- { x: s, y: t },
183
- { x: f, y: x },
184
- { x: I, y: p }
185
- );
186
- o.push(...g.slice(1)), d = { x: f, y: x }, s = I, t = p;
187
- break;
188
- }
189
- case "Z":
190
- case "z": {
191
- o.push({ x: u, y: c }), r.push(o), o = [], s = u, t = c, d = null;
192
- break;
193
- }
194
- default:
195
- m++;
196
- break;
197
- }
198
- }
199
- return o.length > 0 && r.push(o), n != null ? r.map((h) => b(h, n)) : r;
200
- }
201
- function j(e, n, i = !0) {
202
- const r = (n == null ? void 0 : n.height) ?? 0, o = e.map((t) => ({
203
- d: t,
204
- closed: /z/i.test(t)
205
- })), s = e.flatMap(
206
- (t) => P(t, i && r > 0 ? r : void 0)
207
- );
208
- return { paths: o, polygons: s };
209
- }
210
- function w(e) {
211
- const n = e.polygons.flat();
212
- return M(n);
213
- }
214
- function H(e) {
215
- return T(e.polygons.flat());
216
- }
217
- function U(e, n, i = 0, r = [15, 45, 90]) {
218
- const o = n.x - e.x, s = n.y - e.y, t = Math.hypot(o, s);
219
- if (t === 0) return { ...n };
220
- const c = Math.atan2(s, o) * 180 / Math.PI - i;
221
- let d = c, m = 1 / 0;
222
- for (const a of r) {
223
- const h = Math.round(c / a) * a, l = Math.abs(c - h);
224
- l < m && (m = l, d = h);
225
- }
226
- const y = (d + i) * Math.PI / 180;
227
- return {
228
- x: e.x + Math.cos(y) * t,
229
- y: e.y + Math.sin(y) * t
230
- };
231
- }
232
- function V(e, n) {
233
- return Math.atan2(n.y - e.y, n.x - e.x) * 180 / Math.PI;
234
- }
235
- function Z(e) {
236
- if (!e) return null;
237
- const n = e.trim().split(/[\s,]+/).map(Number);
238
- return n.length !== 4 || n.some((i) => Number.isNaN(i)) ? null : { x: n[0], y: n[1], width: n[2], height: n[3] };
239
- }
240
- function z(e, n, i = []) {
241
- const r = N(), o = new Map(e.map((c) => [c.id, c])), s = new Map(i.map((c) => [c.id, c])), t = e.map((c) => ({
242
- id: c.id,
243
- levelId: c.levelId,
244
- x: c.x,
245
- y: c.y,
246
- kind: c.kind,
247
- shapeId: c.shapeId,
248
- connectorId: c.connectorId
249
- }));
250
- for (const c of t)
251
- r.addNode(c.id, c);
252
- const u = [];
253
- for (const c of n) {
254
- const d = o.get(c.fromAnchorId), m = o.get(c.toAnchorId);
255
- if (!d || !m) continue;
256
- let y = c.weight;
257
- y == null && (y = A(d, m), d.levelId !== m.levelId && (y += _));
258
- let a = c.accessible;
259
- if (c.kind === "connector" && d.connectorId != null) {
260
- const l = s.get(d.connectorId);
261
- l && (a = l.accessible);
262
- }
263
- const h = {
264
- id: c.id,
265
- from: c.fromAnchorId,
266
- to: c.toAnchorId,
267
- weight: y,
268
- directed: c.directed,
269
- accessible: a,
270
- kind: c.kind
271
- };
272
- u.push(h), r.addLink(c.fromAnchorId, c.toAnchorId, h), c.directed || r.addLink(c.toAnchorId, c.fromAnchorId, h);
273
- }
274
- return { graph: r, nodes: t, edges: u, anchorById: o };
275
- }
276
- function Y(e, n, i, r = {}) {
277
- const { graph: o, anchorById: s } = e;
278
- if (!s.has(n) || !s.has(i))
279
- return null;
280
- const u = C.nba(o, {
281
- distance(h, l, f) {
282
- const x = f.data;
283
- return r.accessibleOnly && x && !x.accessible ? Number.POSITIVE_INFINITY : (x == null ? void 0 : x.weight) ?? 1;
284
- },
285
- heuristic(h, l) {
286
- const f = s.get(h.id), x = s.get(l.id);
287
- if (!f || !x) return 0;
288
- let I = A(f, x);
289
- return f.levelId !== x.levelId && (I += _), I;
290
- }
291
- }).find(n, i);
292
- if (!u || u.length === 0) return null;
293
- const d = u.reverse().map((h) => h.id), m = [], y = [];
294
- let a = 0;
295
- for (let h = 0; h < d.length; h++) {
296
- const l = s.get(d[h]);
297
- if (m.push({ x: l.x, y: l.y, levelId: l.levelId }), h > 0) {
298
- const f = s.get(d[h - 1]);
299
- a += A(f, l), f.levelId !== l.levelId && (a += _, y.push({
300
- fromLevelId: f.levelId,
301
- toLevelId: l.levelId,
302
- connectorId: l.connectorId ?? f.connectorId
303
- }));
304
- }
305
- }
306
- return { anchorIds: d, points: m, totalWeight: a, levelChanges: y };
307
- }
308
- function q(e, n, i, r = {}) {
309
- let o = null;
310
- for (const s of i) {
311
- const t = Y(e, n, s, r);
312
- t && (!o || t.totalWeight < o.totalWeight) && (o = t);
313
- }
314
- return o;
315
- }
316
- export {
317
- W as D,
318
- _ as F,
319
- B as I,
320
- P as a,
321
- j as b,
322
- Z as c,
323
- A as d,
324
- X as e,
325
- z as f,
326
- w as g,
327
- V as h,
328
- R as i,
329
- L as j,
330
- M as k,
331
- F as l,
332
- T as m,
333
- K as n,
334
- q as o,
335
- G as p,
336
- Y as q,
337
- b as r,
338
- H as s,
339
- k as t,
340
- S as u,
341
- U as v
342
- };
343
- //# sourceMappingURL=pathfinding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pathfinding.js","sources":["../../src/core/types.ts","../../src/core/geometry/index.ts","../../src/core/routing/pathfinding.ts"],"sourcesContent":["/**\n * @eyeon/map/core — shared document model types.\n * Pure TypeScript; no React / Three.js.\n */\n\nexport type MapVersion = 1 | 2;\n\nexport type LevelKind = 'outdoor' | 'floor';\n\nexport type ShapeKind =\n | 'unit'\n | 'amenity'\n | 'kiosk_screen'\n | 'connector'\n | 'entrance'\n | 'walkable'\n | 'void'\n | 'wall'\n | 'boundary'\n | 'floorplate'\n | 'decor'\n | 'label'\n | 'zone'\n | 'parking_zone'\n | 'green_area'\n | 'water'\n | 'parking_icon';\n\nexport type AnchorKind = 'unit' | 'junction' | 'connector' | 'entrance';\n\nexport type EdgeKind = 'walk' | 'unit_link' | 'connector' | 'entrance_link';\n\nexport type ConnectorKind =\n | 'escalator'\n | 'elevator'\n | 'stairs'\n | 'ramp'\n | 'travelator';\n\nexport type ConnectorDirection = 'up' | 'down' | 'both';\n\nexport type UnitStatus =\n | 'occupied'\n | 'vacant'\n | 'coming_soon'\n | 'under_renovation';\n\nexport type AssignmentTargetType =\n | 'retailer'\n | 'amenity'\n | 'kiosk'\n | 'none';\n\nexport type ShapeOrigin = 'import' | 'manual';\n\nexport type DeviceType = 'display_app' | 'desktop' | 'tablet' | 'mobile';\n\nexport type MapRenderMode = '2D' | '3D';\n\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface BBox {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface ViewBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Absolute SVG path subpath preserving Illustrator beziers. */\nexport interface PathSubpath {\n d: string;\n closed: boolean;\n}\n\nexport interface ShapeGeometry {\n /** Absolute path data (Illustrator-compatible). */\n paths: PathSubpath[];\n /** Cached polygon approximation for hit-testing / routing. */\n polygons: Vec2[][];\n}\n\nexport interface ShapeStyle {\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n opacity?: number;\n extrudeHeight?: number;\n transparent?: boolean;\n}\n\nexport interface ShapeLabel {\n text?: string;\n imageKey?: string;\n size?: number;\n rotate?: number;\n offsetX?: number;\n offsetY?: number;\n color?: string;\n autoFit?: boolean;\n}\n\nexport interface LevelTransform {\n translateX: number;\n translateY: number;\n scale: number;\n rotate: number;\n}\n\nexport interface ThemeDefaults {\n MAP_STYLE: MapRenderMode;\n MAP_BACKGROUND_COLOR: string;\n ACCENT_COLOR: string;\n STORE_DEFAULT_COLOR: string;\n STORE_TEXT_COLOR: string;\n STORE_HEIGHT: number;\n WALL_COLOR: string;\n WALL_THICKNESS: number;\n BOUNDARY_COLOR: string;\n BOUNDARY_THICKNESS: number;\n BASE_COLOR: string;\n OVERLAY_COLOR: string;\n OVERLAY_OPACITY: number;\n PARKING_ZONE_COLOR: string;\n GREEN_AREA_COLOR: string;\n WATER_COLOR: string;\n WALKABLE_COLOR: string;\n KIOSK_SIZE: number;\n ZOOM_STEP: number;\n CAMERA_MAX_DISTANCE: number;\n CAMERA_MIN_DISTANCE: number;\n}\n\nexport const DEFAULT_THEME: ThemeDefaults = {\n MAP_STYLE: '2D',\n MAP_BACKGROUND_COLOR: '#f5f5f5',\n ACCENT_COLOR: '#2563eb',\n STORE_DEFAULT_COLOR: '#e2e8f0',\n STORE_TEXT_COLOR: '#1e293b',\n STORE_HEIGHT: 4,\n WALL_COLOR: '#64748b',\n WALL_THICKNESS: 0.4,\n BOUNDARY_COLOR: '#334155',\n BOUNDARY_THICKNESS: 0.6,\n BASE_COLOR: '#ffffff',\n OVERLAY_COLOR: '#000000',\n OVERLAY_OPACITY: 0.15,\n PARKING_ZONE_COLOR: '#cbd5e1',\n GREEN_AREA_COLOR: '#86efac',\n WATER_COLOR: '#7dd3fc',\n WALKABLE_COLOR: '#f8fafc',\n KIOSK_SIZE: 12,\n ZOOM_STEP: 0.5,\n CAMERA_MAX_DISTANCE: 2000,\n CAMERA_MIN_DISTANCE: 50,\n};\n\nexport interface CmMap {\n id: number;\n centerId: number;\n baseSvgKey: string | null;\n baseViewbox: ViewBox | null;\n unitsPerMeter: number;\n theme: Partial<ThemeDefaults>;\n publishedRevisionId: number | null;\n draftUpdatedAt: string | null;\n createdAt: string;\n}\n\nexport interface CmBuilding {\n id: number;\n mapId: number;\n name: string;\n ordering: number;\n}\n\nexport interface CmLevel {\n id: number;\n mapId: number;\n buildingId: number | null;\n kind: LevelKind;\n name: string;\n levelIndex: number;\n ordering: number;\n sourceSvgKey: string | null;\n sourceViewbox: ViewBox | null;\n transform: LevelTransform;\n isActive: boolean;\n}\n\nexport interface CmShape {\n id: number;\n levelId: number;\n key: string;\n kind: ShapeKind;\n geometry: ShapeGeometry;\n bbox: BBox;\n zIndex: number;\n style: ShapeStyle;\n label: ShapeLabel;\n sourceSvgId: string | null;\n origin: ShapeOrigin;\n}\n\nexport interface CmShapeAssignment {\n shapeId: number;\n targetType: AssignmentTargetType;\n retailerId: number | null;\n amenityId: number | null;\n kioskId: number | null;\n unitStatus: UnitStatus;\n unitNumber: string | null;\n customLabel: string | null;\n customImageKey: string | null;\n}\n\nexport interface CmAnchor {\n id: number;\n levelId: number;\n shapeId: number | null;\n kind: AnchorKind;\n x: number;\n y: number;\n connectorId: number | null;\n}\n\nexport interface CmRouteEdge {\n id: number;\n mapId: number;\n fromAnchorId: number;\n toAnchorId: number;\n weight: number | null;\n directed: boolean;\n accessible: boolean;\n kind: EdgeKind;\n}\n\nexport interface CmConnector {\n id: number;\n mapId: number;\n kind: ConnectorKind;\n name: string;\n direction: ConnectorDirection;\n accessible: boolean;\n}\n\nexport interface CmAmenityCatalogItem {\n id: number;\n centerId: number | null;\n code: string;\n name: string;\n iconKey: string | null;\n builtinIcon: string | null;\n ordering: number;\n isActive: boolean;\n}\n\nexport interface CmResponsiveOverride {\n id: number;\n mapId: number;\n levelId: number | null;\n device: DeviceType;\n camera: Vec3;\n controls: Vec3;\n}\n\nexport interface PublishedGraphNode {\n id: number;\n levelId: number;\n x: number;\n y: number;\n kind: AnchorKind;\n shapeId: number | null;\n connectorId: number | null;\n}\n\nexport interface PublishedGraphEdge {\n id: number;\n from: number;\n to: number;\n weight: number;\n directed: boolean;\n accessible: boolean;\n kind: EdgeKind;\n}\n\nexport interface PublishedLevel {\n id: number;\n buildingId: number | null;\n kind: LevelKind;\n name: string;\n levelIndex: number;\n ordering: number;\n sourceSvgUrl: string | null;\n viewbox: ViewBox | null;\n transform: LevelTransform;\n shapes: Array<CmShape & { assignment?: CmShapeAssignment | null }>;\n anchors: CmAnchor[];\n}\n\nexport interface PublishedDocument {\n version: 2;\n revisionId: number;\n revisionNumber: number;\n centerId: number;\n mapId: number;\n theme: ThemeDefaults;\n baseSvgUrl: string | null;\n baseViewbox: ViewBox | null;\n buildings: CmBuilding[];\n levels: PublishedLevel[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n graph: {\n nodes: PublishedGraphNode[];\n edges: PublishedGraphEdge[];\n };\n responsiveOverrides: CmResponsiveOverride[];\n publishedAt: string;\n}\n\nexport interface ImportClassification {\n sourceSvgId: string;\n kind: ShapeKind | null;\n guessed: boolean;\n message?: string;\n}\n\nexport interface ImportReport {\n classified: ImportClassification[];\n unrecognized: string[];\n guessed: ImportClassification[];\n walkableCount: number;\n voidCount: number;\n unitCount: number;\n warnings: string[];\n}\n\nexport type DiffChangeType = 'added' | 'removed' | 'moved' | 'unchanged' | 'kind_changed';\n\nexport interface ImportDiffItem {\n sourceSvgId: string;\n change: DiffChangeType;\n existingShapeId?: number;\n newKind?: ShapeKind | null;\n existingKind?: ShapeKind | null;\n preserve?: {\n key?: string;\n assignment?: boolean;\n anchors?: boolean;\n };\n}\n\nexport interface ImportDiff {\n items: ImportDiffItem[];\n shapes: Array<{\n key: string;\n kind: ShapeKind;\n geometry: ShapeGeometry;\n bbox: BBox;\n sourceSvgId: string;\n style: ShapeStyle;\n }>;\n viewbox: ViewBox | null;\n}\n\nexport interface WeldResult {\n survivingAnchorId: number;\n removedAnchorIds: number[];\n rewiredEdgeIds: number[];\n}\n\nexport interface AutoConnectResult {\n unitAnchorId: number;\n junctionAnchor: { x: number; y: number; existingId?: number };\n edge: { fromAnchorId: number; toAnchorId?: number };\n}\n\nexport interface SkeletonSuggestion {\n anchors: Array<{ tempId: string; x: number; y: number; kind: AnchorKind }>;\n edges: Array<{ fromTempId: string; toTempId: string }>;\n}\n\nexport interface PathResult {\n anchorIds: number[];\n points: Array<Vec2 & { levelId: number }>;\n totalWeight: number;\n levelChanges: Array<{ fromLevelId: number; toLevelId: number; connectorId: number | null }>;\n}\n\nexport type BatchOp =\n | { op: 'upsert_shape'; shape: Partial<CmShape> & { levelId: number; key: string } }\n | { op: 'delete_shape'; shapeId: number }\n | { op: 'upsert_assignment'; assignment: CmShapeAssignment }\n | { op: 'delete_assignment'; shapeId: number }\n | { op: 'upsert_anchor'; anchor: Partial<CmAnchor> & { levelId: number; x: number; y: number; kind: AnchorKind } }\n | { op: 'delete_anchor'; anchorId: number }\n | { op: 'upsert_edge'; edge: Partial<CmRouteEdge> & { mapId: number; fromAnchorId: number; toAnchorId: number } }\n | { op: 'delete_edge'; edgeId: number }\n | { op: 'weld_anchors'; anchorIds: number[]; tolerance?: number }\n | { op: 'upsert_level'; level: Partial<CmLevel> & { mapId: number; name: string; kind: LevelKind } }\n | { op: 'delete_level'; levelId: number }\n | { op: 'upsert_building'; building: Partial<CmBuilding> & { mapId: number; name: string } }\n | { op: 'delete_building'; buildingId: number }\n | { op: 'update_theme'; theme: Partial<ThemeDefaults> }\n | { op: 'upsert_connector'; connector: Partial<CmConnector> & { mapId: number; kind: ConnectorKind; name: string } }\n | { op: 'delete_connector'; connectorId: number };\n\nexport const INTERACTIVE_SHAPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'parking_zone',\n];\n\nexport const FLOOR_CHANGE_PENALTY = 10000;\n\nexport const DEFAULT_WELD_TOLERANCE = 2.5;\n","import type { BBox, PathSubpath, ShapeGeometry, Vec2, ViewBox } from '../types';\n\n/** Flip Y once at import so DB space is Y-up / consistent. */\nexport function flipY(points: Vec2[], viewboxHeight: number): Vec2[] {\n return points.map((p) => ({ x: p.x, y: viewboxHeight - p.y }));\n}\n\nexport function distance(a: Vec2, b: Vec2): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return Math.hypot(dx, dy);\n}\n\nexport function bboxOf(points: Vec2[]): BBox {\n if (points.length === 0) {\n return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n }\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function bboxUnion(a: BBox, b: BBox): BBox {\n return {\n minX: Math.min(a.minX, b.minX),\n minY: Math.min(a.minY, b.minY),\n maxX: Math.max(a.maxX, b.maxX),\n maxY: Math.max(a.maxY, b.maxY),\n };\n}\n\nexport function centroid(points: Vec2[]): Vec2 {\n if (points.length === 0) return { x: 0, y: 0 };\n let sx = 0;\n let sy = 0;\n for (const p of points) {\n sx += p.x;\n sy += p.y;\n }\n return { x: sx / points.length, y: sy / points.length };\n}\n\nexport function pointInPolygon(point: Vec2, polygon: Vec2[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n const intersect =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi + Number.EPSILON) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\n\nexport function pointInPolygons(point: Vec2, polygons: Vec2[][]): boolean {\n return polygons.some((poly) => pointInPolygon(point, poly));\n}\n\n/** Project point onto segment; returns closest point and t in [0,1]. */\nexport function projectOntoSegment(\n point: Vec2,\n a: Vec2,\n b: Vec2,\n): { point: Vec2; t: number; distance: number } {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) {\n return { point: { ...a }, t: 0, distance: distance(point, a) };\n }\n let t = ((point.x - a.x) * dx + (point.y - a.y) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n const proj = { x: a.x + t * dx, y: a.y + t * dy };\n return { point: proj, t, distance: distance(point, proj) };\n}\n\nexport function nearestPointOnPolyline(\n point: Vec2,\n polyline: Vec2[],\n): { point: Vec2; segmentIndex: number; distance: number } | null {\n if (polyline.length < 2) return null;\n let best: { point: Vec2; segmentIndex: number; distance: number } | null = null;\n for (let i = 0; i < polyline.length - 1; i++) {\n const proj = projectOntoSegment(point, polyline[i], polyline[i + 1]);\n if (!best || proj.distance < best.distance) {\n best = { point: proj.point, segmentIndex: i, distance: proj.distance };\n }\n }\n return best;\n}\n\n/**\n * Approximate a cubic bezier into line segments.\n */\nexport function approximateCubic(\n p0: Vec2,\n p1: Vec2,\n p2: Vec2,\n p3: Vec2,\n segments = 8,\n): Vec2[] {\n const out: Vec2[] = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n out.push({\n x:\n u * u * u * p0.x +\n 3 * u * u * t * p1.x +\n 3 * u * t * t * p2.x +\n t * t * t * p3.x,\n y:\n u * u * u * p0.y +\n 3 * u * u * t * p1.y +\n 3 * u * t * t * p2.y +\n t * t * t * p3.y,\n });\n }\n return out;\n}\n\nexport function approximateQuadratic(\n p0: Vec2,\n p1: Vec2,\n p2: Vec2,\n segments = 6,\n): Vec2[] {\n const out: Vec2[] = [];\n for (let i = 0; i <= segments; i++) {\n const t = i / segments;\n const u = 1 - t;\n out.push({\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n });\n }\n return out;\n}\n\n/**\n * Parse SVG path `d` into absolute polygon approximations.\n * Supports M/L/H/V/C/Q/S/T/Z (absolute and relative).\n */\nexport function pathToPolygons(d: string, flipYHeight?: number): Vec2[][] {\n const tokens = d.match(/[a-zA-Z]|-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/g) ?? [];\n const polygons: Vec2[][] = [];\n let current: Vec2[] = [];\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n let lastCtrl: Vec2 | null = null;\n let i = 0;\n let cmd = '';\n\n const readNum = () => Number(tokens[i++]);\n\n while (i < tokens.length) {\n const t = tokens[i];\n if (/[a-zA-Z]/.test(t)) {\n cmd = t;\n i++;\n }\n\n switch (cmd) {\n case 'M':\n case 'm': {\n const isRel = cmd === 'm';\n const nx = readNum();\n const ny = readNum();\n x = isRel ? x + nx : nx;\n y = isRel ? y + ny : ny;\n if (current.length > 0) polygons.push(current);\n current = [{ x, y }];\n startX = x;\n startY = y;\n lastCtrl = null;\n cmd = isRel ? 'l' : 'L';\n break;\n }\n case 'L':\n case 'l': {\n const isRel = cmd === 'l';\n const nx = readNum();\n const ny = readNum();\n x = isRel ? x + nx : nx;\n y = isRel ? y + ny : ny;\n current.push({ x, y });\n lastCtrl = null;\n break;\n }\n case 'H':\n case 'h': {\n const isRel = cmd === 'h';\n const nx = readNum();\n x = isRel ? x + nx : nx;\n current.push({ x, y });\n lastCtrl = null;\n break;\n }\n case 'V':\n case 'v': {\n const isRel = cmd === 'v';\n const ny = readNum();\n y = isRel ? y + ny : ny;\n current.push({ x, y });\n lastCtrl = null;\n break;\n }\n case 'C':\n case 'c': {\n const isRel = cmd === 'c';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const approx = approximateCubic(\n { x, y },\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n { x: nx, y: ny },\n );\n current.push(...approx.slice(1));\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'Q':\n case 'q': {\n const isRel = cmd === 'q';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const approx = approximateQuadratic(\n { x, y },\n { x: x1, y: y1 },\n { x: nx, y: ny },\n );\n current.push(...approx.slice(1));\n lastCtrl = { x: x1, y: y1 };\n x = nx;\n y = ny;\n break;\n }\n case 'S':\n case 's': {\n const isRel = cmd === 's';\n const cx: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const cy: number = lastCtrl ? 2 * y - lastCtrl.y : y;\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const approx = approximateCubic(\n { x, y },\n { x: cx, y: cy },\n { x: x2, y: y2 },\n { x: nx, y: ny },\n );\n current.push(...approx.slice(1));\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'T':\n case 't': {\n const isRel = cmd === 't';\n const cx: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const cy: number = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const approx = approximateQuadratic(\n { x, y },\n { x: cx, y: cy },\n { x: nx, y: ny },\n );\n current.push(...approx.slice(1));\n lastCtrl = { x: cx, y: cy };\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n current.push({ x: startX, y: startY });\n polygons.push(current);\n current = [];\n x = startX;\n y = startY;\n lastCtrl = null;\n break;\n }\n default:\n // Unknown command — skip one token to avoid infinite loop\n i++;\n break;\n }\n }\n\n if (current.length > 0) polygons.push(current);\n\n if (flipYHeight != null) {\n return polygons.map((poly) => flipY(poly, flipYHeight));\n }\n return polygons;\n}\n\nexport function buildGeometryFromPaths(\n pathDs: string[],\n viewbox: ViewBox | null,\n normalizeY = true,\n): ShapeGeometry {\n const height = viewbox?.height ?? 0;\n const paths: PathSubpath[] = pathDs.map((d) => ({\n d,\n closed: /z/i.test(d),\n }));\n const polygons = pathDs.flatMap((d) =>\n pathToPolygons(d, normalizeY && height > 0 ? height : undefined),\n );\n return { paths, polygons };\n}\n\nexport function geometryBBox(geometry: ShapeGeometry): BBox {\n const all = geometry.polygons.flat();\n return bboxOf(all);\n}\n\nexport function geometryCentroid(geometry: ShapeGeometry): Vec2 {\n return centroid(geometry.polygons.flat());\n}\n\n/**\n * Snap a delta angle to the nearest increment around a base angle.\n * baseDeg is the working orientation (e.g. from \"match this wall\").\n */\nexport function snapAngle(\n from: Vec2,\n to: Vec2,\n baseDeg = 0,\n increments: number[] = [15, 45, 90],\n): Vec2 {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) return { ...to };\n\n const rawDeg = (Math.atan2(dy, dx) * 180) / Math.PI;\n const relative = rawDeg - baseDeg;\n let best = relative;\n let bestDiff = Infinity;\n for (const step of increments) {\n const snapped = Math.round(relative / step) * step;\n const diff = Math.abs(relative - snapped);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = snapped;\n }\n }\n const finalDeg = ((best + baseDeg) * Math.PI) / 180;\n return {\n x: from.x + Math.cos(finalDeg) * len,\n y: from.y + Math.sin(finalDeg) * len,\n };\n}\n\n/** Derive working base angle from two wall points (degrees). */\nexport function angleFromWall(a: Vec2, b: Vec2): number {\n return (Math.atan2(b.y - a.y, b.x - a.x) * 180) / Math.PI;\n}\n\nexport function parseViewBox(raw: string | null | undefined): ViewBox | null {\n if (!raw) return null;\n const parts = raw.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n","import createGraph, { type Graph } from 'ngraph.graph';\nimport path from 'ngraph.path';\nimport type {\n CmAnchor,\n CmConnector,\n CmRouteEdge,\n PathResult,\n PublishedGraphEdge,\n PublishedGraphNode,\n} from '../types';\nimport { FLOOR_CHANGE_PENALTY } from '../types';\nimport { distance } from '../geometry';\n\nexport interface CompiledGraph {\n graph: Graph;\n nodes: PublishedGraphNode[];\n edges: PublishedGraphEdge[];\n anchorById: Map<number, CmAnchor>;\n}\n\nexport function compileGraph(\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n connectors: CmConnector[] = [],\n): CompiledGraph {\n const graph = createGraph();\n const anchorById = new Map(anchors.map((a) => [a.id, a]));\n const connectorById = new Map(connectors.map((c) => [c.id, c]));\n\n const nodes: PublishedGraphNode[] = anchors.map((a) => ({\n id: a.id,\n levelId: a.levelId,\n x: a.x,\n y: a.y,\n kind: a.kind,\n shapeId: a.shapeId,\n connectorId: a.connectorId,\n }));\n\n for (const n of nodes) {\n graph.addNode(n.id, n);\n }\n\n const publishedEdges: PublishedGraphEdge[] = [];\n\n for (const e of edges) {\n const from = anchorById.get(e.fromAnchorId);\n const to = anchorById.get(e.toAnchorId);\n if (!from || !to) continue;\n\n let weight = e.weight;\n if (weight == null) {\n weight = distance(from, to);\n if (from.levelId !== to.levelId) {\n weight += FLOOR_CHANGE_PENALTY;\n }\n }\n\n // Accessibility: connector edges inherit connector.accessible\n let accessible = e.accessible;\n if (e.kind === 'connector' && from.connectorId != null) {\n const conn = connectorById.get(from.connectorId);\n if (conn) accessible = conn.accessible;\n }\n\n const pub: PublishedGraphEdge = {\n id: e.id,\n from: e.fromAnchorId,\n to: e.toAnchorId,\n weight,\n directed: e.directed,\n accessible,\n kind: e.kind,\n };\n publishedEdges.push(pub);\n\n graph.addLink(e.fromAnchorId, e.toAnchorId, pub);\n if (!e.directed) {\n graph.addLink(e.toAnchorId, e.fromAnchorId, pub);\n }\n }\n\n return { graph, nodes, edges: publishedEdges, anchorById };\n}\n\nexport interface FindPathOptions {\n accessibleOnly?: boolean;\n}\n\n/**\n * NBA* pathfinding over the compiled graph.\n * Returns null if no path exists.\n */\nexport function findPath(\n compiled: CompiledGraph,\n fromAnchorId: number,\n toAnchorId: number,\n options: FindPathOptions = {},\n): PathResult | null {\n const { graph, anchorById } = compiled;\n if (!anchorById.has(fromAnchorId) || !anchorById.has(toAnchorId)) {\n return null;\n }\n\n const finder = path.nba(graph, {\n distance(fromNode, toNode, link) {\n const data = link.data as PublishedGraphEdge | undefined;\n if (options.accessibleOnly && data && !data.accessible) {\n return Number.POSITIVE_INFINITY;\n }\n return data?.weight ?? 1;\n },\n heuristic(fromNode, toNode) {\n const a = anchorById.get(fromNode.id as number);\n const b = anchorById.get(toNode.id as number);\n if (!a || !b) return 0;\n let d = distance(a, b);\n if (a.levelId !== b.levelId) d += FLOOR_CHANGE_PENALTY;\n return d;\n },\n });\n\n const raw = finder.find(fromAnchorId, toAnchorId);\n if (!raw || raw.length === 0) return null;\n\n // ngraph returns destination → start; reverse\n const nodes = raw.reverse();\n const anchorIds = nodes.map((n) => n.id as number);\n const points: PathResult['points'] = [];\n const levelChanges: PathResult['levelChanges'] = [];\n let totalWeight = 0;\n\n for (let i = 0; i < anchorIds.length; i++) {\n const a = anchorById.get(anchorIds[i])!;\n points.push({ x: a.x, y: a.y, levelId: a.levelId });\n if (i > 0) {\n const prev = anchorById.get(anchorIds[i - 1])!;\n totalWeight += distance(prev, a);\n if (prev.levelId !== a.levelId) {\n totalWeight += FLOOR_CHANGE_PENALTY;\n levelChanges.push({\n fromLevelId: prev.levelId,\n toLevelId: a.levelId,\n connectorId: a.connectorId ?? prev.connectorId,\n });\n }\n }\n }\n\n return { anchorIds, points, totalWeight, levelChanges };\n}\n\n/**\n * Find the nearest matching amenity shape anchor from a start point.\n */\nexport function findNearestAmenityPath(\n compiled: CompiledGraph,\n fromAnchorId: number,\n amenityAnchorIds: number[],\n options: FindPathOptions = {},\n): PathResult | null {\n let best: PathResult | null = null;\n for (const targetId of amenityAnchorIds) {\n const result = findPath(compiled, fromAnchorId, targetId, options);\n if (!result) continue;\n if (!best || result.totalWeight < best.totalWeight) {\n best = result;\n }\n }\n return best;\n}\n"],"names":["DEFAULT_THEME","INTERACTIVE_SHAPE_KINDS","FLOOR_CHANGE_PENALTY","DEFAULT_WELD_TOLERANCE","flipY","points","viewboxHeight","p","distance","a","b","dx","dy","bboxOf","minX","minY","maxX","maxY","i","bboxUnion","centroid","sx","sy","pointInPolygon","point","polygon","inside","j","xi","yi","xj","yj","pointInPolygons","polygons","poly","projectOntoSegment","lenSq","proj","nearestPointOnPolyline","polyline","best","approximateCubic","p0","p1","p2","p3","segments","out","t","u","approximateQuadratic","pathToPolygons","d","flipYHeight","tokens","current","x","y","startX","startY","lastCtrl","cmd","readNum","isRel","nx","ny","x1","y1","x2","y2","approx","cx","cy","buildGeometryFromPaths","pathDs","viewbox","normalizeY","height","paths","geometryBBox","geometry","all","geometryCentroid","snapAngle","from","to","baseDeg","increments","len","relative","bestDiff","step","snapped","diff","finalDeg","angleFromWall","parseViewBox","raw","parts","n","compileGraph","anchors","edges","connectors","graph","createGraph","anchorById","connectorById","nodes","publishedEdges","e","weight","accessible","conn","pub","findPath","compiled","fromAnchorId","toAnchorId","options","path","fromNode","toNode","link","data","anchorIds","levelChanges","totalWeight","prev","findNearestAmenityPath","amenityAnchorIds","targetId","result"],"mappings":"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"}