@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/import/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EAEJ,UAAU,EAEV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,OAAO,EACR,MAAM,UAAU,CAAC;AAmDlB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,OAAO,GAAG,MAAgB,GAC/B;IAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAa9C;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA+ErD;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACnB;AAUD,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,OAAO,GAAG,MAAgB,GAC/B;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAgFxG;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,OAAO,GAAG,IAAI,GACtB,UAAU,CAuDZ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/import/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Inline CSS class rules from `<style>` tags as SVG presentation attributes.
3
+ * Works in Node (no DOM) so the SVG importer can resolve fills/strokes.
4
+ * Mirrors v1 `inlineSvgStyles` behaviour for class→attribute mapping.
5
+ */
6
+ /**
7
+ * Rewrite SVG text so class-based fills/strokes become presentation attributes.
8
+ * Safe to call in Node — pure string rewrite, no DOMParser.
9
+ */
10
+ export declare function inlineSvgStyles(svgText: string): string;
11
+ export interface SvgPresentationStyle {
12
+ fill?: string;
13
+ stroke?: string;
14
+ strokeWidth?: number;
15
+ opacity?: number;
16
+ }
17
+ /** Read presentation attributes from an attribute string. */
18
+ export declare function readPresentationStyle(attrs: string): SvgPresentationStyle;
19
+ /** Merge child over parent — child wins when set. */
20
+ export declare function mergePresentationStyle(parent: SvgPresentationStyle, child: SvgPresentationStyle): SvgPresentationStyle;
21
+ //# sourceMappingURL=svgStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svgStyle.d.ts","sourceRoot":"","sources":["../../../src/core/import/svgStyle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqDH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmCvD;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAkBzE;AAED,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,oBAAoB,GAC1B,oBAAoB,CAOtB"}
@@ -0,0 +1,49 @@
1
+ import { Vec2 } from '../types';
2
+ /**
3
+ * 2D affine matrix in SVG order:
4
+ *
5
+ * ```
6
+ * | a c e |
7
+ * | b d f |
8
+ * | 0 0 1 |
9
+ * ```
10
+ */
11
+ export interface Matrix2D {
12
+ a: number;
13
+ b: number;
14
+ c: number;
15
+ d: number;
16
+ e: number;
17
+ f: number;
18
+ }
19
+ export declare const IDENTITY_MATRIX: Matrix2D;
20
+ /**
21
+ * Matrix product `outer × inner`: the returned matrix applies `inner` first,
22
+ * then `outer`. SVG composes `transform="A B"` the same way — the rightmost
23
+ * transform is applied to the geometry first, and an ancestor `<g>` transform
24
+ * is the outer one relative to its descendants.
25
+ */
26
+ export declare function multiplyMatrix(outer: Matrix2D, inner: Matrix2D): Matrix2D;
27
+ export declare function applyMatrix(m: Matrix2D, p: Vec2): Vec2;
28
+ export declare function isIdentityMatrix(m: Matrix2D, epsilon?: number): boolean;
29
+ /**
30
+ * Parse an SVG `transform` attribute into a single affine matrix.
31
+ * Unknown functions are skipped. Returns identity for empty / unparseable input.
32
+ */
33
+ export declare function parseTransform(raw: string | null | undefined): Matrix2D;
34
+ /**
35
+ * Bake an affine matrix into a path `d` string, emitting absolute commands.
36
+ *
37
+ * Flattening a bezier commutes with an affine map (control points transform
38
+ * independently, sampling parameters do not change), so
39
+ * `pathToPolygons(transformPathD(d, m))` equals `pathToPolygons(d)` mapped
40
+ * through `m`. That is what keeps `geometry.paths[].d` and `geometry.polygons`
41
+ * in the same coordinate space.
42
+ *
43
+ * Arcs commute exactly under a similarity (translate / rotate / uniform scale /
44
+ * mirror), which covers Illustrator output. A shear or non-uniform scale maps
45
+ * the same curve but reparameterises it, so individual sample points may shift
46
+ * along the outline even though the outline itself is right.
47
+ */
48
+ export declare function transformPathD(d: string, m: Matrix2D): string;
49
+ //# sourceMappingURL=svgTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svgTransform.d.ts","sourceRoot":"","sources":["../../../src/core/import/svgTransform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,eAAO,MAAM,eAAe,EAAE,QAAiD,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CASzE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAKtD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,SAAO,GAAG,OAAO,CASrE;AAmDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,CAmBvE;AA+CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CA8J7D"}
@@ -1,7 +1,13 @@
1
1
  export * from './types';
2
+ export * from './hostChrome';
3
+ export * from './layerStyles';
4
+ export * from './mediaUrl';
5
+ export * from './outdoorDecoration';
2
6
  export * from './geometry';
7
+ export * from './filletPolygon';
3
8
  export * from './import';
4
9
  export * from './routing/graph-tools';
5
10
  export * from './routing/pathfinding';
6
11
  export * from './publish';
12
+ export * from './stacking';
7
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -1,282 +1,92 @@
1
- import { b as w, g as I, c as y, e as S, f as E } from "../chunks/pathfinding.js";
2
- import { D as K, F as U, I as z, h as B, i as W, j as G, k as V, l as H, m as j, d as X, o as Z, q as Y, r as q, s as Q, n as J, a as ee, t as ne, p as ie, u as se, v as te } from "../chunks/pathfinding.js";
3
- import { a as re, b as ae, f as ce, i as de, u as le, w as pe } from "../chunks/graph-tools.js";
4
- const P = [
5
- { prefix: "walkable", kind: "walkable" },
6
- { prefix: "void", kind: "void" },
7
- { prefix: "unit", kind: "unit" },
8
- { prefix: "store", kind: "unit" },
9
- // v1 compatibility
10
- { prefix: "wall", kind: "wall" },
11
- { prefix: "boundary", kind: "boundary" },
12
- { prefix: "outer-wall", kind: "wall" },
13
- { prefix: "amenity-", kind: "amenity" },
14
- { prefix: "kiosk-", kind: "kiosk_screen" },
15
- { prefix: "escalator-", kind: "connector" },
16
- { prefix: "elevator-", kind: "connector" },
17
- { prefix: "stairs-", kind: "connector" },
18
- { prefix: "entrance-", kind: "entrance" },
19
- { prefix: "zone-", kind: "zone" },
20
- { prefix: "label-", kind: "label" },
21
- { prefix: "floorplate", kind: "floorplate" },
22
- { prefix: "base", kind: "floorplate" },
23
- { prefix: "decor", kind: "decor" },
24
- { prefix: "special-shape", kind: "decor" },
25
- { prefix: "overlay", kind: "decor" }
26
- ], $ = [
27
- { prefix: "parking-zone", kind: "parking_zone" },
28
- { prefix: "parking-lane", kind: "parking_zone" },
29
- { prefix: "parking-line", kind: "decor" },
30
- { prefix: "parking-icon", kind: "parking_icon" },
31
- { prefix: "green-area", kind: "green_area" },
32
- { prefix: "water", kind: "water" },
33
- { prefix: "decor", kind: "decor" },
34
- { prefix: "entrance-", kind: "entrance" },
35
- { prefix: "unit", kind: "unit" },
36
- { prefix: "store", kind: "unit" },
37
- { prefix: "interactive-", kind: "unit" },
38
- { prefix: "walkable", kind: "walkable" },
39
- { prefix: "amenity-", kind: "amenity" }
40
- ], A = "route-path";
41
- function L(n, t = "floor") {
42
- const o = n.toLowerCase(), a = t === "base" ? $ : P;
43
- for (const { prefix: l, kind: p } of a)
44
- if (o === l || o.startsWith(l))
45
- return { kind: p, guessed: !1 };
46
- return o.startsWith("interactive") ? { kind: "unit", guessed: !0 } : { kind: null, guessed: !1 };
47
- }
48
- function v(n) {
49
- const t = n.trim().split(/[\s,]+/).map(Number);
50
- if (t.length < 4) return "";
51
- let o = `M ${t[0]} ${t[1]}`;
52
- for (let a = 2; a < t.length; a += 2)
53
- o += ` L ${t[a]} ${t[a + 1]}`;
54
- return o += " Z", o;
55
- }
56
- function _(n, t, o, a) {
57
- return `M ${n} ${t} L ${o} ${a}`;
58
- }
59
- function C(n) {
60
- const t = n.match(/viewBox\s*=\s*["']([^"']+)["']/i), o = y(t == null ? void 0 : t[1]), a = [], l = [], p = /<(path|polygon|polyline|line|rect|g)\b([^>]*)(?:\/>|>([\s\S]*?)<\/\1>)/gi;
61
- let i;
62
- for (; (i = p.exec(n)) !== null; ) {
63
- const e = i[1].toLowerCase(), c = i[2] ?? "", k = c.match(/\bid\s*=\s*["']([^"']+)["']/i);
64
- if (!k) continue;
65
- const f = k[1], g = /\bdata-interactive\s*=\s*["']?(true|1|yes)/i.test(c);
66
- if (f.toLowerCase().startsWith(A)) {
67
- const s = c.match(/\bd\s*=\s*["']([^"']+)["']/i);
68
- s && l.push(s[1]);
69
- const r = c.match(/\bpoints\s*=\s*["']([^"']+)["']/i);
70
- r && l.push(v(r[1]).replace(/ Z$/, ""));
71
- continue;
72
- }
73
- const d = { id: f, tag: e, interactive: g };
74
- if (e === "path") {
75
- const s = c.match(/\bd\s*=\s*["']([^"']+)["']/i);
76
- s && (d.d = s[1]);
77
- } else if (e === "polygon" || e === "polyline") {
78
- const s = c.match(/\bpoints\s*=\s*["']([^"']+)["']/i);
79
- s && (d.d = v(s[1]));
80
- } else if (e === "line") {
81
- const s = (r) => {
82
- const u = c.match(new RegExp(`\\b${r}\\s*=\\s*["']?(-?[\\d.]+)`, "i"));
83
- return u ? Number(u[1]) : 0;
84
- };
85
- d.d = _(s("x1"), s("y1"), s("x2"), s("y2"));
86
- } else if (e === "rect") {
87
- const s = (b) => {
88
- const m = c.match(new RegExp(`\\b${b}\\s*=\\s*["']?(-?[\\d.]+)`, "i"));
89
- return m ? Number(m[1]) : 0;
90
- }, r = s("x"), u = s("y"), h = s("width"), x = s("height");
91
- d.d = `M ${r} ${u} L ${r + h} ${u} L ${r + h} ${u + x} L ${r} ${u + x} Z`;
92
- } else if (e === "g") {
93
- const s = i[3] ?? "", r = [], u = /<(path|polygon|polyline|line|rect)\b([^>]*)\/?>/gi;
94
- let h;
95
- for (; (h = u.exec(s)) !== null; ) {
96
- const x = h[1].toLowerCase(), b = h[2] ?? "";
97
- if (x === "path") {
98
- const m = b.match(/\bd\s*=\s*["']([^"']+)["']/i);
99
- m && r.push(m[1]);
100
- } else if (x === "polygon" || x === "polyline") {
101
- const m = b.match(/\bpoints\s*=\s*["']([^"']+)["']/i);
102
- m && r.push(v(m[1]));
103
- }
104
- }
105
- r.length > 0 && (d.d = r.join(" "));
106
- }
107
- (d.d || e === "g") && a.push(d);
108
- }
109
- return { viewbox: o, elements: a, routePathDs: l };
110
- }
111
- function N(n) {
112
- return n.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 80);
113
- }
114
- function O(n, t = "floor") {
115
- const o = C(n), a = [], l = [], p = [], i = [], e = [];
116
- let c = 0, k = 0, f = 0;
117
- for (const g of o.elements) {
118
- let { kind: d, guessed: s } = L(g.id, t);
119
- g.interactive && !d && (d = "unit", s = !0);
120
- const r = {
121
- sourceSvgId: g.id,
122
- kind: d,
123
- guessed: s
124
- };
125
- if (!d) {
126
- l.push(g.id), r.message = "No matching prefix; skipped", a.push(r);
127
- continue;
128
- }
129
- if (!g.d) {
130
- i.push(`Element ${g.id} has no drawable geometry`);
131
- continue;
132
- }
133
- s && (p.push(r), r.message = "Guessed kind from interactive/fallback rule"), a.push(r), d === "walkable" && c++, d === "void" && k++, d === "unit" && f++;
134
- const u = w([g.d], o.viewbox, !0), h = I(u);
135
- e.push({
136
- key: N(g.id),
137
- kind: d,
138
- geometry: u,
139
- bbox: h,
140
- sourceSvgId: g.id,
141
- style: {}
142
- });
143
- }
144
- return t === "floor" && c === 0 && i.push(
145
- "No walkable layer found — auto-skeleton will be unavailable for this level"
146
- ), {
147
- report: {
148
- classified: a,
149
- unrecognized: l,
150
- guessed: p,
151
- walkableCount: c,
152
- voidCount: k,
153
- unitCount: f,
154
- warnings: i
155
- },
156
- shapes: e,
157
- viewbox: o.viewbox,
158
- routePathDs: o.routePathDs
159
- };
160
- }
161
- function T(n, t, o) {
162
- const a = new Map(
163
- t.filter((i) => i.sourceSvgId).map((i) => [i.sourceSvgId, i])
164
- ), l = /* @__PURE__ */ new Set(), p = [];
165
- for (const i of n) {
166
- const e = a.get(i.sourceSvgId);
167
- l.add(i.sourceSvgId), e ? e.kind !== i.kind ? p.push({
168
- sourceSvgId: i.sourceSvgId,
169
- change: "kind_changed",
170
- existingShapeId: e.id,
171
- existingKind: e.kind,
172
- newKind: i.kind,
173
- preserve: { key: e.key, assignment: !0, anchors: !0 }
174
- }) : p.push({
175
- sourceSvgId: i.sourceSvgId,
176
- change: "unchanged",
177
- existingShapeId: e.id,
178
- existingKind: e.kind,
179
- newKind: i.kind,
180
- preserve: { key: e.key, assignment: !0, anchors: !0 }
181
- }) : p.push({
182
- sourceSvgId: i.sourceSvgId,
183
- change: "added",
184
- newKind: i.kind
185
- });
186
- }
187
- for (const i of t)
188
- i.sourceSvgId && !l.has(i.sourceSvgId) && p.push({
189
- sourceSvgId: i.sourceSvgId,
190
- change: "removed",
191
- existingShapeId: i.id,
192
- existingKind: i.kind
193
- });
194
- return {
195
- items: p,
196
- shapes: n,
197
- viewbox: o
198
- };
199
- }
200
- function F(n) {
201
- const t = { ...S, ...n.theme }, o = new Map(
202
- n.assignments.map((e) => [e.shapeId, e])
203
- ), a = n.resolveSvgUrl ?? ((e) => e), l = n.levels.filter((e) => e.isActive).sort((e, c) => e.ordering - c.ordering).map((e) => {
204
- const c = n.shapes.filter((f) => f.levelId === e.id).map((f) => ({
205
- ...f,
206
- assignment: o.get(f.id) ?? null
207
- })), k = n.anchors.filter((f) => f.levelId === e.id);
208
- return {
209
- id: e.id,
210
- buildingId: e.buildingId,
211
- kind: e.kind,
212
- name: e.name,
213
- levelIndex: e.levelIndex,
214
- ordering: e.ordering,
215
- sourceSvgUrl: a(e.sourceSvgKey),
216
- viewbox: e.sourceViewbox,
217
- transform: e.transform,
218
- shapes: c,
219
- anchors: k
220
- };
221
- }), { nodes: p, edges: i } = E(
222
- n.anchors,
223
- n.edges,
224
- n.connectors
225
- );
226
- return {
227
- version: 2,
228
- revisionId: n.revisionId,
229
- revisionNumber: n.revisionNumber,
230
- centerId: n.centerId,
231
- mapId: n.mapId,
232
- theme: t,
233
- baseSvgUrl: n.baseSvgUrl,
234
- baseViewbox: n.baseViewbox,
235
- buildings: n.buildings,
236
- levels: l,
237
- connectors: n.connectors,
238
- amenities: n.amenities.filter((e) => e.isActive),
239
- graph: { nodes: p, edges: i },
240
- responsiveOverrides: n.responsiveOverrides,
241
- publishedAt: n.publishedAt ?? (/* @__PURE__ */ new Date()).toISOString()
242
- };
243
- }
1
+ import { D as s, a as o, F as r, I as t, b as i, c as n, d as l, S as p, W as m, e as d, f as c, g as S, h as u, i as h, j as L, k as y, l as I, m as T, n as P, o as A, p as g, q as f, r as b, s as v, t as E, u as R, v as D, w as _, x, y as F, z as w, A as O, B as C, C as N, E as B, G, H as M, J as H, K as k, L as z, M as U, N as V, O as Y, P as K, Q as W, R as j, T as q, U as Q, V as X, X as J, Y as Z, Z as $, _ as aa, $ as ea, a0 as sa, a1 as oa, a2 as ra, a3 as ta, a4 as ia, a5 as na, a6 as la, a7 as pa, a8 as ma, a9 as da, aa as ca, ab as Sa, ac as ua, ad as ha, ae as La, af as ya, ag as Ia, ah as Ta, ai as Pa, aj as Aa, ak as ga, al as fa, am as ba } from "../chunks/stacking.js";
2
+ import { a as Ea, b as Ra, c as Da, d as _a, f as xa, i as Fa, o as wa, r as Oa, u as Ca, w as Na } from "../chunks/graph-tools.js";
244
3
  export {
245
- S as DEFAULT_THEME,
246
- K as DEFAULT_WELD_TOLERANCE,
247
- U as FLOOR_CHANGE_PENALTY,
248
- z as INTERACTIVE_SHAPE_KINDS,
249
- B as angleFromWall,
250
- W as approximateCubic,
251
- G as approximateQuadratic,
252
- re as autoConnectUnitAnchor,
253
- V as bboxOf,
254
- H as bboxUnion,
255
- ae as buildAutoSkeleton,
256
- w as buildGeometryFromPaths,
257
- j as centroid,
258
- L as classifyId,
259
- F as compileDocument,
260
- E as compileGraph,
261
- T as diffImport,
262
- X as distance,
263
- Z as findNearestAmenityPath,
264
- Y as findPath,
265
- ce as findWeldCandidates,
266
- q as flipY,
267
- I as geometryBBox,
268
- Q as geometryCentroid,
269
- de as importRoutePaths,
270
- O as importSvg,
271
- J as nearestPointOnPolyline,
272
- C as parseSvgString,
273
- y as parseViewBox,
274
- ee as pathToPolygons,
275
- ne as pointInPolygon,
276
- ie as pointInPolygons,
277
- se as projectOntoSegment,
278
- te as snapAngle,
279
- le as unitAnchorFromShape,
280
- pe as weldAnchors
4
+ s as DEFAULT_THEME,
5
+ o as DEFAULT_WELD_TOLERANCE,
6
+ r as FLOOR_CHANGE_PENALTY,
7
+ t as IDENTITY_MATRIX,
8
+ i as IMPORT_DRIFT_THRESHOLD,
9
+ n as IMPORT_PERSISTED_KINDS,
10
+ l as INTERACTIVE_SHAPE_KINDS,
11
+ p as STATIC_LAYER_STYLES,
12
+ m as WALKING_PATH_COLOR,
13
+ d as angleFromWall,
14
+ c as applyMatrix,
15
+ S as approximateArc,
16
+ u as approximateCubic,
17
+ h as approximateQuadratic,
18
+ Ea as attachImportedRouteAnchors,
19
+ Ra as autoConnectUnitAnchor,
20
+ L as bboxOf,
21
+ y as bboxUnion,
22
+ I as boundsFromStackedLevels,
23
+ Da as buildAutoSkeleton,
24
+ T as buildGeometryFromPaths,
25
+ P as centroid,
26
+ A as clampStoreRadius,
27
+ g as classifyId,
28
+ _a as collapseDuplicateRouteGraph,
29
+ f as compareBuildingFloors,
30
+ b as compileDocument,
31
+ v as compileGraph,
32
+ E as defaultViewerLevelId,
33
+ R as diffImport,
34
+ D as distance,
35
+ _ as expandBounds,
36
+ x as filletPolygon,
37
+ F as findNearestAmenityPath,
38
+ w as findPath,
39
+ xa as findWeldCandidates,
40
+ O as flipY,
41
+ C as floorSwitcherDisplayLevels,
42
+ N as floorSwitcherLevels,
43
+ B as geometryBBox,
44
+ G as geometryCentroid,
45
+ Fa as importRoutePaths,
46
+ M as importSvg,
47
+ H as inlineSvgStyles,
48
+ k as isGeometrySpaceStale,
49
+ z as isIdentityMatrix,
50
+ U as isInteractiveGroupLabel,
51
+ V as isLayerContainerLabel,
52
+ Y as isMapViewerHost,
53
+ K as isNonInteractiveGroupLabel,
54
+ W as isOutdoorLevel,
55
+ j as isRouteFolderLabel,
56
+ q as isRoutePathLabel,
57
+ Q as isStoreFolderLabel,
58
+ X as mapSurface,
59
+ J as mergePresentationStyle,
60
+ Z as mergeTheme,
61
+ $ as multiplyMatrix,
62
+ aa as nearestPointOnPolyline,
63
+ ea as normalizeGeometrySpace,
64
+ sa as normalizeLayerLabel,
65
+ oa as normalizeLayerName,
66
+ ra as normalizePublishedDocument,
67
+ wa as outdoorDecorationFromSvg,
68
+ ta as parseSvgString,
69
+ ia as parseTransform,
70
+ na as parseViewBox,
71
+ la as pathToPolygons,
72
+ pa as pointInPolygon,
73
+ ma as pointInPolygons,
74
+ da as projectOntoSegment,
75
+ ca as readPresentationStyle,
76
+ Sa as resolveFetchUrl,
77
+ ua as resolveLayerStyle,
78
+ Oa as routeAnchorKindForShape,
79
+ ha as shouldShowFloorSwitcher,
80
+ La as snapAngle,
81
+ ya as svgIdsOwnedByShapes,
82
+ Ia as tokenizePathData,
83
+ Ta as transformPathD,
84
+ Pa as unionViewBox,
85
+ Aa as uniqueClosedRing,
86
+ Ca as unitAnchorFromShape,
87
+ ga as viewBoxToBounds,
88
+ fa as viewerChrome,
89
+ ba as viewerLevelStack,
90
+ Na as weldAnchors
281
91
  };
282
92
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/core/import/index.ts","../../src/core/publish/index.ts"],"sourcesContent":["import type {\n BBox,\n ImportClassification,\n ImportDiff,\n ImportDiffItem,\n ImportReport,\n ShapeGeometry,\n ShapeKind,\n ShapeStyle,\n ViewBox,\n} from '../types';\nimport {\n buildGeometryFromPaths,\n geometryBBox,\n parseViewBox,\n} from '../geometry';\n\n/** Prefix → shape kind for floor SVGs. */\nconst FLOOR_PREFIXES: Array<{ prefix: string; kind: ShapeKind }> = [\n { prefix: 'walkable', kind: 'walkable' },\n { prefix: 'void', kind: 'void' },\n { prefix: 'unit', kind: 'unit' },\n { prefix: 'store', kind: 'unit' }, // v1 compatibility\n { prefix: 'wall', kind: 'wall' },\n { prefix: 'boundary', kind: 'boundary' },\n { prefix: 'outer-wall', kind: 'wall' },\n { prefix: 'amenity-', kind: 'amenity' },\n { prefix: 'kiosk-', kind: 'kiosk_screen' },\n { prefix: 'escalator-', kind: 'connector' },\n { prefix: 'elevator-', kind: 'connector' },\n { prefix: 'stairs-', kind: 'connector' },\n { prefix: 'entrance-', kind: 'entrance' },\n { prefix: 'zone-', kind: 'zone' },\n { prefix: 'label-', kind: 'label' },\n { prefix: 'floorplate', kind: 'floorplate' },\n { prefix: 'base', kind: 'floorplate' },\n { prefix: 'decor', kind: 'decor' },\n { prefix: 'special-shape', kind: 'decor' },\n { prefix: 'overlay', kind: 'decor' },\n];\n\n/** Prefix → shape kind for outdoor / base layer. */\nconst BASE_PREFIXES: Array<{ prefix: string; kind: ShapeKind }> = [\n { prefix: 'parking-zone', kind: 'parking_zone' },\n { prefix: 'parking-lane', kind: 'parking_zone' },\n { prefix: 'parking-line', kind: 'decor' },\n { prefix: 'parking-icon', kind: 'parking_icon' },\n { prefix: 'green-area', kind: 'green_area' },\n { prefix: 'water', kind: 'water' },\n { prefix: 'decor', kind: 'decor' },\n { prefix: 'entrance-', kind: 'entrance' },\n { prefix: 'unit', kind: 'unit' },\n { prefix: 'store', kind: 'unit' },\n { prefix: 'interactive-', kind: 'unit' },\n { prefix: 'walkable', kind: 'walkable' },\n { prefix: 'amenity-', kind: 'amenity' },\n];\n\n/** v1 route-path lines are imported as route geometry, not shapes. */\nconst ROUTE_PATH_PREFIX = 'route-path';\n\nexport interface RawSvgElement {\n id: string;\n tag: string;\n d?: string;\n points?: string;\n x1?: number;\n y1?: number;\n x2?: number;\n y2?: number;\n interactive?: boolean;\n}\n\nexport interface ParsedSvg {\n viewbox: ViewBox | null;\n elements: RawSvgElement[];\n routePathDs: string[];\n}\n\nexport function classifyId(\n id: string,\n mode: 'floor' | 'base' = 'floor',\n): { kind: ShapeKind | null; guessed: boolean } {\n const lower = id.toLowerCase();\n const table = mode === 'base' ? BASE_PREFIXES : FLOOR_PREFIXES;\n for (const { prefix, kind } of table) {\n if (lower === prefix || lower.startsWith(prefix)) {\n return { kind, guessed: false };\n }\n }\n // interactive-* or data-interactive attribute handled by caller\n if (lower.startsWith('interactive')) {\n return { kind: 'unit', guessed: true };\n }\n return { kind: null, guessed: false };\n}\n\nfunction pointsToPath(points: string): string {\n const nums = points.trim().split(/[\\s,]+/).map(Number);\n if (nums.length < 4) return '';\n let d = `M ${nums[0]} ${nums[1]}`;\n for (let i = 2; i < nums.length; i += 2) {\n d += ` L ${nums[i]} ${nums[i + 1]}`;\n }\n d += ' Z';\n return d;\n}\n\nfunction lineToPath(x1: number, y1: number, x2: number, y2: number): string {\n return `M ${x1} ${y1} L ${x2} ${y2}`;\n}\n\n/**\n * Lightweight SVG string parser — no DOM required (works in Node).\n * Extracts elements with id attributes and path-like geometry.\n */\nexport function parseSvgString(svg: string): ParsedSvg {\n const viewboxMatch = svg.match(/viewBox\\s*=\\s*[\"']([^\"']+)[\"']/i);\n const viewbox = parseViewBox(viewboxMatch?.[1]);\n\n const elements: RawSvgElement[] = [];\n const routePathDs: string[] = [];\n\n // Match tagged elements that may carry an id\n const tagRe =\n /<(path|polygon|polyline|line|rect|g)\\b([^>]*)(?:\\/>|>([\\s\\S]*?)<\\/\\1>)/gi;\n let match: RegExpExecArray | null;\n while ((match = tagRe.exec(svg)) !== null) {\n const tag = match[1].toLowerCase();\n const attrs = match[2] ?? '';\n const idMatch = attrs.match(/\\bid\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (!idMatch) continue;\n const id = idMatch[1];\n const interactive = /\\bdata-interactive\\s*=\\s*[\"']?(true|1|yes)/i.test(attrs);\n\n if (id.toLowerCase().startsWith(ROUTE_PATH_PREFIX)) {\n const dMatch = attrs.match(/\\bd\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (dMatch) routePathDs.push(dMatch[1]);\n const pointsMatch = attrs.match(/\\bpoints\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (pointsMatch) routePathDs.push(pointsToPath(pointsMatch[1]).replace(/ Z$/, ''));\n continue;\n }\n\n const el: RawSvgElement = { id, tag, interactive };\n\n if (tag === 'path') {\n const dMatch = attrs.match(/\\bd\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (dMatch) el.d = dMatch[1];\n } else if (tag === 'polygon' || tag === 'polyline') {\n const pointsMatch = attrs.match(/\\bpoints\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (pointsMatch) el.d = pointsToPath(pointsMatch[1]);\n } else if (tag === 'line') {\n const num = (name: string) => {\n const m = attrs.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*[\"']?(-?[\\\\d.]+)`, 'i'));\n return m ? Number(m[1]) : 0;\n };\n el.d = lineToPath(num('x1'), num('y1'), num('x2'), num('y2'));\n } else if (tag === 'rect') {\n const num = (name: string) => {\n const m = attrs.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*[\"']?(-?[\\\\d.]+)`, 'i'));\n return m ? Number(m[1]) : 0;\n };\n const x = num('x');\n const y = num('y');\n const w = num('width');\n const h = num('height');\n el.d = `M ${x} ${y} L ${x + w} ${y} L ${x + w} ${y + h} L ${x} ${y + h} Z`;\n } else if (tag === 'g') {\n // Collect child paths under this group id\n const inner = match[3] ?? '';\n const childPaths: string[] = [];\n const childRe = /<(path|polygon|polyline|line|rect)\\b([^>]*)\\/?>/gi;\n let cm: RegExpExecArray | null;\n while ((cm = childRe.exec(inner)) !== null) {\n const ctag = cm[1].toLowerCase();\n const cattrs = cm[2] ?? '';\n if (ctag === 'path') {\n const dm = cattrs.match(/\\bd\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (dm) childPaths.push(dm[1]);\n } else if (ctag === 'polygon' || ctag === 'polyline') {\n const pm = cattrs.match(/\\bpoints\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (pm) childPaths.push(pointsToPath(pm[1]));\n }\n }\n if (childPaths.length > 0) {\n el.d = childPaths.join(' ');\n }\n }\n\n if (el.d || tag === 'g') {\n elements.push(el);\n }\n }\n\n return { viewbox, elements, routePathDs };\n}\n\nexport interface ImportedShapeDraft {\n key: string;\n kind: ShapeKind;\n geometry: ShapeGeometry;\n bbox: BBox;\n sourceSvgId: string;\n style: ShapeStyle;\n}\n\nfunction slugKey(id: string): string {\n return id\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 80);\n}\n\nexport function importSvg(\n svg: string,\n mode: 'floor' | 'base' = 'floor',\n): { report: ImportReport; shapes: ImportedShapeDraft[]; viewbox: ViewBox | null; routePathDs: string[] } {\n const parsed = parseSvgString(svg);\n const classified: ImportClassification[] = [];\n const unrecognized: string[] = [];\n const guessed: ImportClassification[] = [];\n const warnings: string[] = [];\n const shapes: ImportedShapeDraft[] = [];\n\n let walkableCount = 0;\n let voidCount = 0;\n let unitCount = 0;\n\n for (const el of parsed.elements) {\n let { kind, guessed: isGuessed } = classifyId(el.id, mode);\n if (el.interactive && !kind) {\n kind = 'unit';\n isGuessed = true;\n }\n\n const entry: ImportClassification = {\n sourceSvgId: el.id,\n kind,\n guessed: isGuessed,\n };\n\n if (!kind) {\n unrecognized.push(el.id);\n entry.message = 'No matching prefix; skipped';\n classified.push(entry);\n continue;\n }\n\n if (!el.d) {\n warnings.push(`Element ${el.id} has no drawable geometry`);\n continue;\n }\n\n if (isGuessed) {\n guessed.push(entry);\n entry.message = 'Guessed kind from interactive/fallback rule';\n }\n classified.push(entry);\n\n if (kind === 'walkable') walkableCount++;\n if (kind === 'void') voidCount++;\n if (kind === 'unit') unitCount++;\n\n const geometry = buildGeometryFromPaths([el.d], parsed.viewbox, true);\n const bbox = geometryBBox(geometry);\n\n shapes.push({\n key: slugKey(el.id),\n kind,\n geometry,\n bbox,\n sourceSvgId: el.id,\n style: {},\n });\n }\n\n if (mode === 'floor' && walkableCount === 0) {\n warnings.push(\n 'No walkable layer found — auto-skeleton will be unavailable for this level',\n );\n }\n\n return {\n report: {\n classified,\n unrecognized,\n guessed,\n walkableCount,\n voidCount,\n unitCount,\n warnings,\n },\n shapes,\n viewbox: parsed.viewbox,\n routePathDs: parsed.routePathDs,\n };\n}\n\nexport interface ExistingShapeRef {\n id: number;\n sourceSvgId: string | null;\n kind: ShapeKind;\n key: string;\n}\n\n/**\n * Diff newly imported shapes against existing level shapes by source_svg_id.\n */\nexport function diffImport(\n imported: ImportedShapeDraft[],\n existing: ExistingShapeRef[],\n viewbox: ViewBox | null,\n): ImportDiff {\n const existingBySource = new Map(\n existing\n .filter((e) => e.sourceSvgId)\n .map((e) => [e.sourceSvgId as string, e]),\n );\n const seen = new Set<string>();\n const items: ImportDiffItem[] = [];\n\n for (const shape of imported) {\n const prev = existingBySource.get(shape.sourceSvgId);\n seen.add(shape.sourceSvgId);\n if (!prev) {\n items.push({\n sourceSvgId: shape.sourceSvgId,\n change: 'added',\n newKind: shape.kind,\n });\n } else if (prev.kind !== shape.kind) {\n items.push({\n sourceSvgId: shape.sourceSvgId,\n change: 'kind_changed',\n existingShapeId: prev.id,\n existingKind: prev.kind,\n newKind: shape.kind,\n preserve: { key: prev.key, assignment: true, anchors: true },\n });\n } else {\n items.push({\n sourceSvgId: shape.sourceSvgId,\n change: 'unchanged',\n existingShapeId: prev.id,\n existingKind: prev.kind,\n newKind: shape.kind,\n preserve: { key: prev.key, assignment: true, anchors: true },\n });\n }\n }\n\n for (const prev of existing) {\n if (prev.sourceSvgId && !seen.has(prev.sourceSvgId)) {\n items.push({\n sourceSvgId: prev.sourceSvgId,\n change: 'removed',\n existingShapeId: prev.id,\n existingKind: prev.kind,\n });\n }\n }\n\n return {\n items,\n shapes: imported,\n viewbox,\n };\n}\n","import type {\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n PublishedDocument,\n ThemeDefaults,\n ViewBox,\n} from '../types';\nimport { DEFAULT_THEME } from '../types';\nimport { compileGraph } from '../routing/pathfinding';\n\nexport interface PublishInput {\n revisionId: number;\n revisionNumber: number;\n centerId: number;\n mapId: number;\n theme: Partial<ThemeDefaults>;\n baseSvgUrl: string | null;\n baseViewbox: ViewBox | null;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n responsiveOverrides: CmResponsiveOverride[];\n /** Resolve S3 key → CDN URL for level source SVGs. */\n resolveSvgUrl?: (key: string | null) => string | null;\n publishedAt?: string;\n}\n\n/**\n * Compile draft rows into an immutable published document.\n * Used by both the admin publish endpoint and the draft preview (?draft=1).\n */\nexport function compileDocument(input: PublishInput): PublishedDocument {\n const theme: ThemeDefaults = { ...DEFAULT_THEME, ...input.theme };\n const assignmentByShape = new Map(\n input.assignments.map((a) => [a.shapeId, a]),\n );\n const resolve = input.resolveSvgUrl ?? ((k: string | null) => k);\n\n const levels = input.levels\n .filter((l) => l.isActive)\n .sort((a, b) => a.ordering - b.ordering)\n .map((level) => {\n const levelShapes = input.shapes\n .filter((s) => s.levelId === level.id)\n .map((s) => ({\n ...s,\n assignment: assignmentByShape.get(s.id) ?? null,\n }));\n const levelAnchors = input.anchors.filter((a) => a.levelId === level.id);\n return {\n id: level.id,\n buildingId: level.buildingId,\n kind: level.kind,\n name: level.name,\n levelIndex: level.levelIndex,\n ordering: level.ordering,\n sourceSvgUrl: resolve(level.sourceSvgKey),\n viewbox: level.sourceViewbox,\n transform: level.transform,\n shapes: levelShapes,\n anchors: levelAnchors,\n };\n });\n\n const { nodes, edges } = compileGraph(\n input.anchors,\n input.edges,\n input.connectors,\n );\n\n return {\n version: 2,\n revisionId: input.revisionId,\n revisionNumber: input.revisionNumber,\n centerId: input.centerId,\n mapId: input.mapId,\n theme,\n baseSvgUrl: input.baseSvgUrl,\n baseViewbox: input.baseViewbox,\n buildings: input.buildings,\n levels,\n connectors: input.connectors,\n amenities: input.amenities.filter((a) => a.isActive),\n graph: { nodes, edges },\n responsiveOverrides: input.responsiveOverrides,\n publishedAt: input.publishedAt ?? new Date().toISOString(),\n };\n}\n"],"names":["FLOOR_PREFIXES","BASE_PREFIXES","ROUTE_PATH_PREFIX","classifyId","id","mode","lower","table","prefix","kind","pointsToPath","points","nums","d","i","lineToPath","x1","y1","x2","y2","parseSvgString","svg","viewboxMatch","viewbox","parseViewBox","elements","routePathDs","tagRe","match","tag","attrs","idMatch","interactive","dMatch","pointsMatch","el","num","name","m","x","y","w","h","inner","childPaths","childRe","cm","ctag","cattrs","dm","pm","slugKey","importSvg","parsed","classified","unrecognized","guessed","warnings","shapes","walkableCount","voidCount","unitCount","isGuessed","entry","geometry","buildGeometryFromPaths","bbox","geometryBBox","diffImport","imported","existing","existingBySource","e","seen","items","shape","prev","compileDocument","input","theme","DEFAULT_THEME","assignmentByShape","a","resolve","k","levels","l","b","level","levelShapes","s","levelAnchors","nodes","edges","compileGraph"],"mappings":";;;AAkBA,MAAMA,IAA6D;AAAA,EACjE,EAAE,QAAQ,YAAY,MAAM,WAAA;AAAA,EAC5B,EAAE,QAAQ,QAAQ,MAAM,OAAA;AAAA,EACxB,EAAE,QAAQ,QAAQ,MAAM,OAAA;AAAA,EACxB,EAAE,QAAQ,SAAS,MAAM,OAAA;AAAA;AAAA,EACzB,EAAE,QAAQ,QAAQ,MAAM,OAAA;AAAA,EACxB,EAAE,QAAQ,YAAY,MAAM,WAAA;AAAA,EAC5B,EAAE,QAAQ,cAAc,MAAM,OAAA;AAAA,EAC9B,EAAE,QAAQ,YAAY,MAAM,UAAA;AAAA,EAC5B,EAAE,QAAQ,UAAU,MAAM,eAAA;AAAA,EAC1B,EAAE,QAAQ,cAAc,MAAM,YAAA;AAAA,EAC9B,EAAE,QAAQ,aAAa,MAAM,YAAA;AAAA,EAC7B,EAAE,QAAQ,WAAW,MAAM,YAAA;AAAA,EAC3B,EAAE,QAAQ,aAAa,MAAM,WAAA;AAAA,EAC7B,EAAE,QAAQ,SAAS,MAAM,OAAA;AAAA,EACzB,EAAE,QAAQ,UAAU,MAAM,QAAA;AAAA,EAC1B,EAAE,QAAQ,cAAc,MAAM,aAAA;AAAA,EAC9B,EAAE,QAAQ,QAAQ,MAAM,aAAA;AAAA,EACxB,EAAE,QAAQ,SAAS,MAAM,QAAA;AAAA,EACzB,EAAE,QAAQ,iBAAiB,MAAM,QAAA;AAAA,EACjC,EAAE,QAAQ,WAAW,MAAM,QAAA;AAC7B,GAGMC,IAA4D;AAAA,EAChE,EAAE,QAAQ,gBAAgB,MAAM,eAAA;AAAA,EAChC,EAAE,QAAQ,gBAAgB,MAAM,eAAA;AAAA,EAChC,EAAE,QAAQ,gBAAgB,MAAM,QAAA;AAAA,EAChC,EAAE,QAAQ,gBAAgB,MAAM,eAAA;AAAA,EAChC,EAAE,QAAQ,cAAc,MAAM,aAAA;AAAA,EAC9B,EAAE,QAAQ,SAAS,MAAM,QAAA;AAAA,EACzB,EAAE,QAAQ,SAAS,MAAM,QAAA;AAAA,EACzB,EAAE,QAAQ,aAAa,MAAM,WAAA;AAAA,EAC7B,EAAE,QAAQ,QAAQ,MAAM,OAAA;AAAA,EACxB,EAAE,QAAQ,SAAS,MAAM,OAAA;AAAA,EACzB,EAAE,QAAQ,gBAAgB,MAAM,OAAA;AAAA,EAChC,EAAE,QAAQ,YAAY,MAAM,WAAA;AAAA,EAC5B,EAAE,QAAQ,YAAY,MAAM,UAAA;AAC9B,GAGMC,IAAoB;AAoBnB,SAASC,EACdC,GACAC,IAAyB,SACqB;AAC9C,QAAMC,IAAQF,EAAG,YAAA,GACXG,IAAQF,MAAS,SAASJ,IAAgBD;AAChD,aAAW,EAAE,QAAAQ,GAAQ,MAAAC,EAAA,KAAUF;AAC7B,QAAID,MAAUE,KAAUF,EAAM,WAAWE,CAAM;AAC7C,aAAO,EAAE,MAAAC,GAAM,SAAS,GAAA;AAI5B,SAAIH,EAAM,WAAW,aAAa,IACzB,EAAE,MAAM,QAAQ,SAAS,GAAA,IAE3B,EAAE,MAAM,MAAM,SAAS,GAAA;AAChC;AAEA,SAASI,EAAaC,GAAwB;AAC5C,QAAMC,IAAOD,EAAO,KAAA,EAAO,MAAM,QAAQ,EAAE,IAAI,MAAM;AACrD,MAAIC,EAAK,SAAS,EAAG,QAAO;AAC5B,MAAIC,IAAI,KAAKD,EAAK,CAAC,CAAC,IAAIA,EAAK,CAAC,CAAC;AAC/B,WAASE,IAAI,GAAGA,IAAIF,EAAK,QAAQE,KAAK;AACpC,IAAAD,KAAK,MAAMD,EAAKE,CAAC,CAAC,IAAIF,EAAKE,IAAI,CAAC,CAAC;AAEnC,SAAAD,KAAK,MACEA;AACT;AAEA,SAASE,EAAWC,GAAYC,GAAYC,GAAYC,GAAoB;AAC1E,SAAO,KAAKH,CAAE,IAAIC,CAAE,MAAMC,CAAE,IAAIC,CAAE;AACpC;AAMO,SAASC,EAAeC,GAAwB;AACrD,QAAMC,IAAeD,EAAI,MAAM,iCAAiC,GAC1DE,IAAUC,EAAaF,KAAA,gBAAAA,EAAe,EAAE,GAExCG,IAA4B,CAAA,GAC5BC,IAAwB,CAAA,GAGxBC,IACJ;AACF,MAAIC;AACJ,UAAQA,IAAQD,EAAM,KAAKN,CAAG,OAAO,QAAM;AACzC,UAAMQ,IAAMD,EAAM,CAAC,EAAE,YAAA,GACfE,IAAQF,EAAM,CAAC,KAAK,IACpBG,IAAUD,EAAM,MAAM,8BAA8B;AAC1D,QAAI,CAACC,EAAS;AACd,UAAM3B,IAAK2B,EAAQ,CAAC,GACdC,IAAc,8CAA8C,KAAKF,CAAK;AAE5E,QAAI1B,EAAG,YAAA,EAAc,WAAWF,CAAiB,GAAG;AAClD,YAAM+B,IAASH,EAAM,MAAM,6BAA6B;AACxD,MAAIG,KAAQP,EAAY,KAAKO,EAAO,CAAC,CAAC;AACtC,YAAMC,IAAcJ,EAAM,MAAM,kCAAkC;AAClE,MAAII,KAAaR,EAAY,KAAKhB,EAAawB,EAAY,CAAC,CAAC,EAAE,QAAQ,OAAO,EAAE,CAAC;AACjF;AAAA,IACF;AAEA,UAAMC,IAAoB,EAAE,IAAA/B,GAAI,KAAAyB,GAAK,aAAAG,EAAA;AAErC,QAAIH,MAAQ,QAAQ;AAClB,YAAMI,IAASH,EAAM,MAAM,6BAA6B;AACxD,MAAIG,MAAQE,EAAG,IAAIF,EAAO,CAAC;AAAA,IAC7B,WAAWJ,MAAQ,aAAaA,MAAQ,YAAY;AAClD,YAAMK,IAAcJ,EAAM,MAAM,kCAAkC;AAClE,MAAII,MAAaC,EAAG,IAAIzB,EAAawB,EAAY,CAAC,CAAC;AAAA,IACrD,WAAWL,MAAQ,QAAQ;AACzB,YAAMO,IAAM,CAACC,MAAiB;AAC5B,cAAMC,IAAIR,EAAM,MAAM,IAAI,OAAO,MAAMO,CAAI,6BAA6B,GAAG,CAAC;AAC5E,eAAOC,IAAI,OAAOA,EAAE,CAAC,CAAC,IAAI;AAAA,MAC5B;AACA,MAAAH,EAAG,IAAIpB,EAAWqB,EAAI,IAAI,GAAGA,EAAI,IAAI,GAAGA,EAAI,IAAI,GAAGA,EAAI,IAAI,CAAC;AAAA,IAC9D,WAAWP,MAAQ,QAAQ;AACzB,YAAMO,IAAM,CAACC,MAAiB;AAC5B,cAAM,IAAIP,EAAM,MAAM,IAAI,OAAO,MAAMO,CAAI,6BAA6B,GAAG,CAAC;AAC5E,eAAO,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI;AAAA,MAC5B,GACME,IAAIH,EAAI,GAAG,GACXI,IAAIJ,EAAI,GAAG,GACXK,IAAIL,EAAI,OAAO,GACfM,IAAIN,EAAI,QAAQ;AACtB,MAAAD,EAAG,IAAI,KAAKI,CAAC,IAAIC,CAAC,MAAMD,IAAIE,CAAC,IAAID,CAAC,MAAMD,IAAIE,CAAC,IAAID,IAAIE,CAAC,MAAMH,CAAC,IAAIC,IAAIE,CAAC;AAAA,IACxE,WAAWb,MAAQ,KAAK;AAEtB,YAAMc,IAAQf,EAAM,CAAC,KAAK,IACpBgB,IAAuB,CAAA,GACvBC,IAAU;AAChB,UAAIC;AACJ,cAAQA,IAAKD,EAAQ,KAAKF,CAAK,OAAO,QAAM;AAC1C,cAAMI,IAAOD,EAAG,CAAC,EAAE,YAAA,GACbE,IAASF,EAAG,CAAC,KAAK;AACxB,YAAIC,MAAS,QAAQ;AACnB,gBAAME,IAAKD,EAAO,MAAM,6BAA6B;AACrD,UAAIC,KAAIL,EAAW,KAAKK,EAAG,CAAC,CAAC;AAAA,QAC/B,WAAWF,MAAS,aAAaA,MAAS,YAAY;AACpD,gBAAMG,IAAKF,EAAO,MAAM,kCAAkC;AAC1D,UAAIE,KAAIN,EAAW,KAAKlC,EAAawC,EAAG,CAAC,CAAC,CAAC;AAAA,QAC7C;AAAA,MACF;AACA,MAAIN,EAAW,SAAS,MACtBT,EAAG,IAAIS,EAAW,KAAK,GAAG;AAAA,IAE9B;AAEA,KAAIT,EAAG,KAAKN,MAAQ,QAClBJ,EAAS,KAAKU,CAAE;AAAA,EAEpB;AAEA,SAAO,EAAE,SAAAZ,GAAS,UAAAE,GAAU,aAAAC,EAAA;AAC9B;AAWA,SAASyB,EAAQ/C,GAAoB;AACnC,SAAOA,EACJ,YAAA,EACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE,EACpB,MAAM,GAAG,EAAE;AAChB;AAEO,SAASgD,EACd/B,GACAhB,IAAyB,SAC+E;AACxG,QAAMgD,IAASjC,EAAeC,CAAG,GAC3BiC,IAAqC,CAAA,GACrCC,IAAyB,CAAA,GACzBC,IAAkC,CAAA,GAClCC,IAAqB,CAAA,GACrBC,IAA+B,CAAA;AAErC,MAAIC,IAAgB,GAChBC,IAAY,GACZC,IAAY;AAEhB,aAAW1B,KAAMkB,EAAO,UAAU;AAChC,QAAI,EAAE,MAAA5C,GAAM,SAASqD,EAAA,IAAc3D,EAAWgC,EAAG,IAAI9B,CAAI;AACzD,IAAI8B,EAAG,eAAe,CAAC1B,MACrBA,IAAO,QACPqD,IAAY;AAGd,UAAMC,IAA8B;AAAA,MAClC,aAAa5B,EAAG;AAAA,MAChB,MAAA1B;AAAA,MACA,SAASqD;AAAA,IAAA;AAGX,QAAI,CAACrD,GAAM;AACT,MAAA8C,EAAa,KAAKpB,EAAG,EAAE,GACvB4B,EAAM,UAAU,+BAChBT,EAAW,KAAKS,CAAK;AACrB;AAAA,IACF;AAEA,QAAI,CAAC5B,EAAG,GAAG;AACT,MAAAsB,EAAS,KAAK,WAAWtB,EAAG,EAAE,2BAA2B;AACzD;AAAA,IACF;AAEA,IAAI2B,MACFN,EAAQ,KAAKO,CAAK,GAClBA,EAAM,UAAU,gDAElBT,EAAW,KAAKS,CAAK,GAEjBtD,MAAS,cAAYkD,KACrBlD,MAAS,UAAQmD,KACjBnD,MAAS,UAAQoD;AAErB,UAAMG,IAAWC,EAAuB,CAAC9B,EAAG,CAAC,GAAGkB,EAAO,SAAS,EAAI,GAC9Da,IAAOC,EAAaH,CAAQ;AAElC,IAAAN,EAAO,KAAK;AAAA,MACV,KAAKP,EAAQhB,EAAG,EAAE;AAAA,MAClB,MAAA1B;AAAA,MACA,UAAAuD;AAAA,MACA,MAAAE;AAAA,MACA,aAAa/B,EAAG;AAAA,MAChB,OAAO,CAAA;AAAA,IAAC,CACT;AAAA,EACH;AAEA,SAAI9B,MAAS,WAAWsD,MAAkB,KACxCF,EAAS;AAAA,IACP;AAAA,EAAA,GAIG;AAAA,IACL,QAAQ;AAAA,MACN,YAAAH;AAAA,MACA,cAAAC;AAAA,MACA,SAAAC;AAAA,MACA,eAAAG;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,UAAAJ;AAAA,IAAA;AAAA,IAEF,QAAAC;AAAA,IACA,SAASL,EAAO;AAAA,IAChB,aAAaA,EAAO;AAAA,EAAA;AAExB;AAYO,SAASe,EACdC,GACAC,GACA/C,GACY;AACZ,QAAMgD,IAAmB,IAAI;AAAA,IAC3BD,EACG,OAAO,CAACE,MAAMA,EAAE,WAAW,EAC3B,IAAI,CAACA,MAAM,CAACA,EAAE,aAAuBA,CAAC,CAAC;AAAA,EAAA,GAEtCC,wBAAW,IAAA,GACXC,IAA0B,CAAA;AAEhC,aAAWC,KAASN,GAAU;AAC5B,UAAMO,IAAOL,EAAiB,IAAII,EAAM,WAAW;AACnD,IAAAF,EAAK,IAAIE,EAAM,WAAW,GACrBC,IAMMA,EAAK,SAASD,EAAM,OAC7BD,EAAM,KAAK;AAAA,MACT,aAAaC,EAAM;AAAA,MACnB,QAAQ;AAAA,MACR,iBAAiBC,EAAK;AAAA,MACtB,cAAcA,EAAK;AAAA,MACnB,SAASD,EAAM;AAAA,MACf,UAAU,EAAE,KAAKC,EAAK,KAAK,YAAY,IAAM,SAAS,GAAA;AAAA,IAAK,CAC5D,IAEDF,EAAM,KAAK;AAAA,MACT,aAAaC,EAAM;AAAA,MACnB,QAAQ;AAAA,MACR,iBAAiBC,EAAK;AAAA,MACtB,cAAcA,EAAK;AAAA,MACnB,SAASD,EAAM;AAAA,MACf,UAAU,EAAE,KAAKC,EAAK,KAAK,YAAY,IAAM,SAAS,GAAA;AAAA,IAAK,CAC5D,IAtBDF,EAAM,KAAK;AAAA,MACT,aAAaC,EAAM;AAAA,MACnB,QAAQ;AAAA,MACR,SAASA,EAAM;AAAA,IAAA,CAChB;AAAA,EAoBL;AAEA,aAAWC,KAAQN;AACjB,IAAIM,EAAK,eAAe,CAACH,EAAK,IAAIG,EAAK,WAAW,KAChDF,EAAM,KAAK;AAAA,MACT,aAAaE,EAAK;AAAA,MAClB,QAAQ;AAAA,MACR,iBAAiBA,EAAK;AAAA,MACtB,cAAcA,EAAK;AAAA,IAAA,CACpB;AAIL,SAAO;AAAA,IACL,OAAAF;AAAA,IACA,QAAQL;AAAA,IACR,SAAA9C;AAAA,EAAA;AAEJ;ACrUO,SAASsD,EAAgBC,GAAwC;AACtE,QAAMC,IAAuB,EAAE,GAAGC,GAAe,GAAGF,EAAM,MAAA,GACpDG,IAAoB,IAAI;AAAA,IAC5BH,EAAM,YAAY,IAAI,CAACI,MAAM,CAACA,EAAE,SAASA,CAAC,CAAC;AAAA,EAAA,GAEvCC,IAAUL,EAAM,kBAAkB,CAACM,MAAqBA,IAExDC,IAASP,EAAM,OAClB,OAAO,CAACQ,MAAMA,EAAE,QAAQ,EACxB,KAAK,CAACJ,GAAGK,MAAML,EAAE,WAAWK,EAAE,QAAQ,EACtC,IAAI,CAACC,MAAU;AACd,UAAMC,IAAcX,EAAM,OACvB,OAAO,CAACY,MAAMA,EAAE,YAAYF,EAAM,EAAE,EACpC,IAAI,CAACE,OAAO;AAAA,MACX,GAAGA;AAAA,MACH,YAAYT,EAAkB,IAAIS,EAAE,EAAE,KAAK;AAAA,IAAA,EAC3C,GACEC,IAAeb,EAAM,QAAQ,OAAO,CAACI,MAAMA,EAAE,YAAYM,EAAM,EAAE;AACvE,WAAO;AAAA,MACL,IAAIA,EAAM;AAAA,MACV,YAAYA,EAAM;AAAA,MAClB,MAAMA,EAAM;AAAA,MACZ,MAAMA,EAAM;AAAA,MACZ,YAAYA,EAAM;AAAA,MAClB,UAAUA,EAAM;AAAA,MAChB,cAAcL,EAAQK,EAAM,YAAY;AAAA,MACxC,SAASA,EAAM;AAAA,MACf,WAAWA,EAAM;AAAA,MACjB,QAAQC;AAAA,MACR,SAASE;AAAA,IAAA;AAAA,EAEb,CAAC,GAEG,EAAE,OAAAC,GAAO,OAAAC,EAAA,IAAUC;AAAA,IACvBhB,EAAM;AAAA,IACNA,EAAM;AAAA,IACNA,EAAM;AAAA,EAAA;AAGR,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAYA,EAAM;AAAA,IAClB,gBAAgBA,EAAM;AAAA,IACtB,UAAUA,EAAM;AAAA,IAChB,OAAOA,EAAM;AAAA,IACb,OAAAC;AAAA,IACA,YAAYD,EAAM;AAAA,IAClB,aAAaA,EAAM;AAAA,IACnB,WAAWA,EAAM;AAAA,IACjB,QAAAO;AAAA,IACA,YAAYP,EAAM;AAAA,IAClB,WAAWA,EAAM,UAAU,OAAO,CAACI,MAAMA,EAAE,QAAQ;AAAA,IACnD,OAAO,EAAE,OAAAU,GAAO,OAAAC,EAAA;AAAA,IAChB,qBAAqBf,EAAM;AAAA,IAC3B,aAAaA,EAAM,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAE7D;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Code-only static layer styling for recognized SVG layer-name prefixes.
3
+ * Never loaded from or saved to portal / database theme settings — mirrors
4
+ * v1 `staticMapLayerSettings` in `@eyeon/threejs-map`.
5
+ */
6
+ export interface StaticLayerStyle {
7
+ fill?: string;
8
+ stroke?: string;
9
+ strokeWidth?: number;
10
+ renderOrder: number;
11
+ extrudeHeight?: number;
12
+ }
13
+ /**
14
+ * v1 walking-path has no portal setting — it keeps the SVG fill, and every
15
+ * published mall file uses this icy walkway color. v2 locks the same hex.
16
+ */
17
+ export declare const WALKING_PATH_COLOR = "#E9F7FC";
18
+ /**
19
+ * Prefix → house style. Matching is normalized so `parking-lane`,
20
+ * `parking_lane`, and `parking-lanes` all resolve to the same entry.
21
+ */
22
+ export declare const STATIC_LAYER_STYLES: Record<string, StaticLayerStyle>;
23
+ /** Collapse punctuation so `parking_lane_2` and `parking-lanes` compare as words. */
24
+ export declare function normalizeLayerName(label: string): string;
25
+ /**
26
+ * Resolve a static house style from an SVG element / group id.
27
+ * Returns null when the name is not a reserved decoration layer.
28
+ *
29
+ * Matches when the normalized name equals the key, starts with the key as a
30
+ * word (`parking lane 2`), or is a simple plural (`parking lanes`).
31
+ */
32
+ export declare function resolveLayerStyle(layerName: string | null | undefined): StaticLayerStyle | null;
33
+ /**
34
+ * sourceSvgId values the live outdoor SVG should skip because `cm_shapes`
35
+ * already owns them. Static house layers stay in the SVG so walking-path
36
+ * (and parking / green) keep their code colors even when an older import
37
+ * also persisted a walkable row.
38
+ */
39
+ export declare function svgIdsOwnedByShapes(shapes: Iterable<{
40
+ sourceSvgId?: string | null;
41
+ }>, options?: {
42
+ omitStaticLayers?: boolean;
43
+ }): Set<string>;
44
+ //# sourceMappingURL=layerStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerStyles.d.ts","sourceRoot":"","sources":["../../src/core/layerStyles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAgChE,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAgB/F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,CAAC;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EACjD,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACvC,GAAG,CAAC,MAAM,CAAC,CAUb"}
@@ -0,0 +1,3 @@
1
+ /** Same contract as v1 `getMediaProxyUrl`: proxy base + encoded URL, no query key. */
2
+ export declare function resolveFetchUrl(url: string, imageProxyUrl?: string | null): string;
3
+ //# sourceMappingURL=mediaUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaUrl.d.ts","sourceRoot":"","sources":["../../src/core/mediaUrl.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGlF"}
@@ -0,0 +1,16 @@
1
+ export interface OutdoorDecorationPath {
2
+ id: string;
3
+ d: string;
4
+ fill?: string;
5
+ stroke?: string;
6
+ strokeWidth?: number;
7
+ opacity?: number;
8
+ }
9
+ /**
10
+ * Paths the assign viewer draws from the live outdoor SVG: house-style
11
+ * decoration (green area, parking lanes, icons) and any other
12
+ * non-interactive art. Interactive / store folders stay out — those are
13
+ * `cm_shapes` rows.
14
+ */
15
+ export declare function outdoorDecorationFromSvg(svgText: string, suppressIds?: ReadonlySet<string>): OutdoorDecorationPath[];
16
+ //# sourceMappingURL=outdoorDecoration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outdoorDecoration.d.ts","sourceRoot":"","sources":["../../src/core/outdoorDecoration.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,qBAAqB,EAAE,CAyBzB"}
@@ -21,8 +21,14 @@ export interface PublishInput {
21
21
  publishedAt?: string;
22
22
  }
23
23
  /**
24
- * Compile draft rows into an immutable published document.
25
- * Used by both the admin publish endpoint and the draft preview (?draft=1).
24
+ * Compile live cm_* rows into the current production document.
25
+ * Used by Save Changes (overwrite-in-place) and draft preview (?draft=1).
26
26
  */
27
27
  export declare function compileDocument(input: PublishInput): PublishedDocument;
28
+ /**
29
+ * Heal a document that was compiled before the Y-flip removal. Viewer hosts
30
+ * load `cm_revisions` JSON as-is (they never re-run `compileDocument`), so
31
+ * stale polygons would otherwise render upside down relative to the editor.
32
+ */
33
+ export declare function normalizePublishedDocument(doc: PublishedDocument): PublishedDocument;
28
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,WAAW,EACX,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,UAAU,CAAC;AAIlB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;IAC5C,sDAAsD;IACtD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAwDtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,WAAW,EACX,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,UAAU,CAAC;AAKlB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;IAC5C,sDAAsD;IACtD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CA8DtE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,iBAAiB,GACrB,iBAAiB,CAmBnB"}