@ubuilder-ai/workspace 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +7 -0
  2. package/dist/floorplan-annotation-obstacles.d.ts +4 -0
  3. package/dist/floorplan-annotation-obstacles.d.ts.map +1 -0
  4. package/dist/floorplan-annotation-obstacles.js +25 -0
  5. package/dist/floorplan-camera-sync.d.ts +24 -0
  6. package/dist/floorplan-camera-sync.d.ts.map +1 -0
  7. package/dist/floorplan-camera-sync.js +187 -0
  8. package/dist/floorplan-coordinates.d.ts +10 -0
  9. package/dist/floorplan-coordinates.d.ts.map +1 -0
  10. package/dist/floorplan-coordinates.js +25 -0
  11. package/dist/floorplan-dimension-renderer.d.ts +42 -0
  12. package/dist/floorplan-dimension-renderer.d.ts.map +1 -0
  13. package/dist/floorplan-dimension-renderer.js +245 -0
  14. package/dist/floorplan-geometry-renderer.d.ts +56 -0
  15. package/dist/floorplan-geometry-renderer.d.ts.map +1 -0
  16. package/dist/floorplan-geometry-renderer.js +319 -0
  17. package/dist/floorplan-initial-view.d.ts +29 -0
  18. package/dist/floorplan-initial-view.d.ts.map +1 -0
  19. package/dist/floorplan-initial-view.js +30 -0
  20. package/dist/floorplan-label-angle.d.ts +24 -0
  21. package/dist/floorplan-label-angle.d.ts.map +1 -0
  22. package/dist/floorplan-label-angle.js +60 -0
  23. package/dist/floorplan-navigation-presentation.d.ts +57 -0
  24. package/dist/floorplan-navigation-presentation.d.ts.map +1 -0
  25. package/dist/floorplan-navigation-presentation.js +81 -0
  26. package/dist/floorplan-navigation-shell.d.ts +87 -0
  27. package/dist/floorplan-navigation-shell.d.ts.map +1 -0
  28. package/dist/floorplan-navigation-shell.js +1212 -0
  29. package/dist/floorplan-navigation-types.d.ts +10 -0
  30. package/dist/floorplan-navigation-types.d.ts.map +1 -0
  31. package/dist/floorplan-navigation-types.js +1 -0
  32. package/dist/floorplan-registry-projection.d.ts +84 -0
  33. package/dist/floorplan-registry-projection.d.ts.map +1 -0
  34. package/dist/floorplan-registry-projection.js +260 -0
  35. package/dist/floorplan-render-context.d.ts +56 -0
  36. package/dist/floorplan-render-context.d.ts.map +1 -0
  37. package/dist/floorplan-render-context.js +75 -0
  38. package/dist/index.d.ts +21 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +19 -0
  41. package/dist/marquee-geometry.d.ts +22 -0
  42. package/dist/marquee-geometry.d.ts.map +1 -0
  43. package/dist/marquee-geometry.js +151 -0
  44. package/dist/spatial-workspace-camera-action-control.d.ts +18 -0
  45. package/dist/spatial-workspace-camera-action-control.d.ts.map +1 -0
  46. package/dist/spatial-workspace-camera-action-control.js +13 -0
  47. package/dist/spatial-workspace-display-control.d.ts +64 -0
  48. package/dist/spatial-workspace-display-control.d.ts.map +1 -0
  49. package/dist/spatial-workspace-display-control.js +81 -0
  50. package/dist/spatial-workspace-gis-control.d.ts +58 -0
  51. package/dist/spatial-workspace-gis-control.d.ts.map +1 -0
  52. package/dist/spatial-workspace-gis-control.js +38 -0
  53. package/dist/spatial-workspace-instance.d.ts +2 -0
  54. package/dist/spatial-workspace-instance.d.ts.map +1 -0
  55. package/dist/spatial-workspace-instance.js +14 -0
  56. package/dist/spatial-workspace-level-selector.d.ts +25 -0
  57. package/dist/spatial-workspace-level-selector.d.ts.map +1 -0
  58. package/dist/spatial-workspace-level-selector.js +18 -0
  59. package/dist/spatial-workspace-level-wall-control.d.ts +38 -0
  60. package/dist/spatial-workspace-level-wall-control.d.ts.map +1 -0
  61. package/dist/spatial-workspace-level-wall-control.js +43 -0
  62. package/dist/spatial-workspace-mode.d.ts +11 -0
  63. package/dist/spatial-workspace-mode.d.ts.map +1 -0
  64. package/dist/spatial-workspace-mode.js +29 -0
  65. package/dist/spatial-workspace-styles.d.ts +3 -0
  66. package/dist/spatial-workspace-styles.d.ts.map +1 -0
  67. package/dist/spatial-workspace-styles.js +72 -0
  68. package/dist/spatial-workspace-view-mode-control.d.ts +19 -0
  69. package/dist/spatial-workspace-view-mode-control.d.ts.map +1 -0
  70. package/dist/spatial-workspace-view-mode-control.js +14 -0
  71. package/dist/spatial-workspace-viewport.d.ts +25 -0
  72. package/dist/spatial-workspace-viewport.d.ts.map +1 -0
  73. package/dist/spatial-workspace-viewport.js +106 -0
  74. package/package.json +47 -0
@@ -0,0 +1,56 @@
1
+ import { type FloorplanGeometry } from '@ubuilder-ai/core';
2
+ export declare const FLOORPLAN_INTERACTION_POINTER_EVENTS_VARIABLE = "--pascal-floorplan-interaction-pointer-events";
3
+ export declare function controlledFloorplanPointerEvents(pointerEvents: string): string;
4
+ type FloorplanRenderMode = 'screen' | 'pdf';
5
+ /**
6
+ * Pure-data → SVG converter. Walks a `FloorplanGeometry` tree returned by
7
+ * `def.floorplan(node, ctx)` and emits the matching React-SVG nodes.
8
+ *
9
+ * Coordinates are level-local meters. The wrapping floor-plan panel
10
+ * applies the world→SVG transform via its viewBox, so kinds emit
11
+ * geometry in the same units they reason about in 3D.
12
+ *
13
+ * Group transforms compose: `transform={translate(x y) rotate(deg)}`.
14
+ * Rotations are radians at the data layer (consistent with three.js
15
+ * conventions used by `def.geometry`) and converted to degrees for SVG
16
+ * here — kinds never touch units.
17
+ *
18
+ * Styling props map straight onto SVG attributes. Builders that need
19
+ * theme colors should declare them inline or expose them as registry
20
+ * tokens later (deferred until a real need surfaces — AI-authored kinds
21
+ * can pick safe defaults today).
22
+ */
23
+ export declare const FloorplanGeometryRenderer: import("react").MemoExoticComponent<({ geometry, pointerEventsOverride, sceneRotationDeg, annotationUnitsPerPoint, screenUnitsPerPixel, renderMode, }: {
24
+ geometry: FloorplanGeometry;
25
+ pointerEventsOverride?: string;
26
+ sceneRotationDeg?: number;
27
+ annotationUnitsPerPoint?: number;
28
+ screenUnitsPerPixel?: number;
29
+ renderMode?: FloorplanRenderMode;
30
+ }) => import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | null>;
31
+ export declare function resolveDocumentFloorplanAnnotationStyle(geometry: FloorplanGeometry & {
32
+ kind: Exclude<FloorplanGeometry['kind'], 'group'>;
33
+ }, annotationUnitsPerPoint?: number): {
34
+ fill?: string;
35
+ stroke?: string;
36
+ strokeWidth?: number;
37
+ vectorEffect?: 'non-scaling-stroke';
38
+ };
39
+ export declare function documentRectGeometryAttrs(geometry: Extract<FloorplanGeometry, {
40
+ kind: 'rect';
41
+ }>, annotationUnitsPerPoint?: number): {
42
+ x: number;
43
+ y: number;
44
+ width: number;
45
+ height: number;
46
+ rx: number | undefined;
47
+ ry: number | undefined;
48
+ };
49
+ export declare function documentCircleGeometryAttrs(geometry: Extract<FloorplanGeometry, {
50
+ kind: 'circle';
51
+ }>, annotationUnitsPerPoint?: number): {
52
+ r: number;
53
+ };
54
+ export declare function resolveDocumentAnnotationGroupChildren(children: FloorplanGeometry[], annotationUnitsPerPoint?: number): FloorplanGeometry[];
55
+ export {};
56
+ //# sourceMappingURL=floorplan-geometry-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-geometry-renderer.d.ts","sourceRoot":"","sources":["../src/floorplan-geometry-renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,mBAAmB,CAAA;AAwBxE,eAAO,MAAM,6CAA6C,kDACT,CAAA;AAEjD,wBAAgB,gCAAgC,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,KAAK,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAA;AAE3C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,yBAAyB,yJAOnC;IACD,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,mBAAmB,CAAA;CACjC,uGAUC,CAAA;AAyDF,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,iBAAiB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;CAAE,EACnF,uBAAuB,CAAC,EAAE,MAAM,GAC/B;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,oBAAoB,CAAA;CACpC,CA6BA;AA8BD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,uBAAuB,CAAC,EAAE,MAAM;;;;;;;EAyBjC;AAMD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EACxD,uBAAuB,CAAC,EAAE,MAAM;;EAMjC;AAMD,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,uBAAuB,CAAC,EAAE,MAAM,GAC/B,iBAAiB,EAAE,CA0BrB"}
@@ -0,0 +1,319 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { loadAssetUrl } from '@ubuilder-ai/core';
4
+ import { readFloorplanGeometryMetadata } from '@ubuilder-ai/floorplan-contract';
5
+ import { memo, useEffect, useState } from 'react';
6
+ import { floorplanAnnotationObstacleMode, isFloorplanAnnotationObstacleGeometry, } from './floorplan-annotation-obstacles';
7
+ import { FloorplanDimensionRenderer, FloorplanDimensionStringRenderer, } from './floorplan-dimension-renderer';
8
+ import { resolveFloorplanLabelAngle } from './floorplan-label-angle';
9
+ const STATIC_LABEL_UNITS_PER_PIXEL = 0.01;
10
+ const DOCUMENT_DEFAULT_TEXT_SIZE_PT = 8;
11
+ const DOCUMENT_ROOM_NAME_TEXT_SIZE_PT = 8;
12
+ const DOCUMENT_ROOM_NUMBER_TEXT_SIZE_PT = 7;
13
+ const DOCUMENT_ROOM_DETAIL_TEXT_SIZE_PT = 5.5;
14
+ const DOCUMENT_COLUMN_MARK_TEXT_SIZE_PT = 7;
15
+ const DOCUMENT_DEFAULT_STROKE_WIDTH_PT = 0.5;
16
+ const DOCUMENT_TEXT_OUTLINE_MIN_WIDTH_PT = 0.75;
17
+ const DOCUMENT_MARK_HEIGHT_PT = 14;
18
+ const PDF_ANNOTATION_STROKE_WIDTH_PT = 0.5;
19
+ export const FLOORPLAN_INTERACTION_POINTER_EVENTS_VARIABLE = '--pascal-floorplan-interaction-pointer-events';
20
+ export function controlledFloorplanPointerEvents(pointerEvents) {
21
+ return `var(${FLOORPLAN_INTERACTION_POINTER_EVENTS_VARIABLE}, ${pointerEvents})`;
22
+ }
23
+ /**
24
+ * Pure-data → SVG converter. Walks a `FloorplanGeometry` tree returned by
25
+ * `def.floorplan(node, ctx)` and emits the matching React-SVG nodes.
26
+ *
27
+ * Coordinates are level-local meters. The wrapping floor-plan panel
28
+ * applies the world→SVG transform via its viewBox, so kinds emit
29
+ * geometry in the same units they reason about in 3D.
30
+ *
31
+ * Group transforms compose: `transform={translate(x y) rotate(deg)}`.
32
+ * Rotations are radians at the data layer (consistent with three.js
33
+ * conventions used by `def.geometry`) and converted to degrees for SVG
34
+ * here — kinds never touch units.
35
+ *
36
+ * Styling props map straight onto SVG attributes. Builders that need
37
+ * theme colors should declare them inline or expose them as registry
38
+ * tokens later (deferred until a real need surfaces — AI-authored kinds
39
+ * can pick safe defaults today).
40
+ */
41
+ export const FloorplanGeometryRenderer = memo(function FloorplanGeometryRenderer({ geometry, pointerEventsOverride, sceneRotationDeg = 0, annotationUnitsPerPoint, screenUnitsPerPixel, renderMode = 'screen', }) {
42
+ return renderNode(geometry, 0, pointerEventsOverride, sceneRotationDeg, annotationUnitsPerPoint, screenUnitsPerPixel, renderMode);
43
+ });
44
+ function styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode = 'screen') {
45
+ // Shared SVG attribute mapping for any styled primitive. Keeps the per-
46
+ // primitive switch arms terse and ensures new style fields land
47
+ // everywhere at once. `as any` avoids re-asserting every variant
48
+ // includes the style fields — they all do, except `group` (which is
49
+ // filtered out by the caller's type bound).
50
+ const s = g;
51
+ const annotationMetadata = readFloorplanGeometryMetadata(g);
52
+ const documentStyle = resolveDocumentFloorplanAnnotationStyle(g, annotationUnitsPerPoint);
53
+ const vectorEffect = documentStyle.vectorEffect ?? s.vectorEffect;
54
+ const resolvedStrokeWidth = documentStyle.strokeWidth ?? s.strokeWidth;
55
+ const strokeWidth = renderMode === 'pdf' &&
56
+ vectorEffect === 'non-scaling-stroke' &&
57
+ resolvedStrokeWidth !== undefined
58
+ ? Math.min(PDF_ANNOTATION_STROKE_WIDTH_PT, resolvedStrokeWidth)
59
+ : resolvedStrokeWidth;
60
+ return {
61
+ 'data-floorplan-annotation-obstacle': floorplanAnnotationObstacleMode(g),
62
+ 'data-floorplan-annotation-role': annotationMetadata.annotationRole,
63
+ fill: documentStyle.fill ?? s.fill ?? 'none',
64
+ fillOpacity: s.fillOpacity,
65
+ stroke: documentStyle.stroke ?? s.stroke,
66
+ strokeWidth,
67
+ strokeDasharray: s.strokeDasharray,
68
+ strokeLinecap: s.strokeLinecap,
69
+ strokeLinejoin: s.strokeLinejoin,
70
+ strokeOpacity: s.strokeOpacity,
71
+ opacity: s.opacity,
72
+ vectorEffect,
73
+ pointerEvents: pointerEventsOverride ??
74
+ (s.pointerEvents ? controlledFloorplanPointerEvents(s.pointerEvents) : undefined),
75
+ style: s.cursor ? { cursor: s.cursor } : undefined,
76
+ };
77
+ }
78
+ export function resolveDocumentFloorplanAnnotationStyle(geometry, annotationUnitsPerPoint) {
79
+ if (annotationUnitsPerPoint === undefined)
80
+ return {};
81
+ const styled = geometry;
82
+ if (!styled.stroke && geometry.kind !== 'text')
83
+ return {};
84
+ if (geometry.kind === 'text') {
85
+ const sourceFontSize = Math.max(geometry.fontSize, 1e-6);
86
+ const sourceStrokeWidth = geometry.strokeWidth ?? 0;
87
+ const outlineRatio = sourceStrokeWidth > 0 ? sourceStrokeWidth / sourceFontSize : 0;
88
+ const fontSize = documentTextFontSize(geometry, annotationUnitsPerPoint);
89
+ return {
90
+ strokeWidth: geometry.stroke && outlineRatio > 0
91
+ ? Math.max(DOCUMENT_TEXT_OUTLINE_MIN_WIDTH_PT * annotationUnitsPerPoint, fontSize * outlineRatio)
92
+ : undefined,
93
+ };
94
+ }
95
+ return {
96
+ strokeWidth: documentStrokeWidth(styled, annotationUnitsPerPoint),
97
+ vectorEffect: 'non-scaling-stroke',
98
+ };
99
+ }
100
+ function documentTextFontSize(geometry, annotationUnitsPerPoint) {
101
+ return documentTextSizePt(geometry) * annotationUnitsPerPoint;
102
+ }
103
+ function documentTextSizePt(geometry) {
104
+ switch (readFloorplanGeometryMetadata(geometry).annotationRole) {
105
+ case 'room-label':
106
+ if (geometry.fontSize >= 0.18)
107
+ return DOCUMENT_ROOM_NAME_TEXT_SIZE_PT;
108
+ if (geometry.fontSize >= 0.145)
109
+ return DOCUMENT_ROOM_NUMBER_TEXT_SIZE_PT;
110
+ return DOCUMENT_ROOM_DETAIL_TEXT_SIZE_PT;
111
+ case 'column-center':
112
+ case 'stair-annotation':
113
+ return DOCUMENT_COLUMN_MARK_TEXT_SIZE_PT;
114
+ default:
115
+ return DOCUMENT_DEFAULT_TEXT_SIZE_PT;
116
+ }
117
+ }
118
+ function documentStrokeWidth(geometry, annotationUnitsPerPoint) {
119
+ return Math.max(DOCUMENT_DEFAULT_STROKE_WIDTH_PT, Math.min(1.2, geometry.strokeWidth ?? 0.5));
120
+ }
121
+ export function documentRectGeometryAttrs(geometry, annotationUnitsPerPoint) {
122
+ if (annotationUnitsPerPoint === undefined || !isAnnotationMarkRect(geometry)) {
123
+ return {
124
+ x: geometry.x,
125
+ y: geometry.y,
126
+ width: geometry.width,
127
+ height: geometry.height,
128
+ rx: geometry.rx,
129
+ ry: geometry.ry,
130
+ };
131
+ }
132
+ const centerX = geometry.x + geometry.width / 2;
133
+ const centerY = geometry.y + geometry.height / 2;
134
+ const height = DOCUMENT_MARK_HEIGHT_PT * annotationUnitsPerPoint;
135
+ const width = Math.max(height * 1.6, (geometry.width / Math.max(geometry.height, 1e-6)) * height);
136
+ return {
137
+ x: centerX - width / 2,
138
+ y: centerY - height / 2,
139
+ width,
140
+ height,
141
+ rx: height / 2,
142
+ ry: height / 2,
143
+ };
144
+ }
145
+ function isAnnotationMarkRect(geometry) {
146
+ return geometry.fill === '#ffffff' && !!geometry.stroke && geometry.height <= 0.5;
147
+ }
148
+ export function documentCircleGeometryAttrs(geometry, annotationUnitsPerPoint) {
149
+ if (annotationUnitsPerPoint === undefined || !isAnnotationMarkCircle(geometry)) {
150
+ return { r: geometry.r };
151
+ }
152
+ return { r: Math.max(geometry.r, (DOCUMENT_MARK_HEIGHT_PT / 2) * annotationUnitsPerPoint) };
153
+ }
154
+ function isAnnotationMarkCircle(geometry) {
155
+ return geometry.fill === '#ffffff' && !!geometry.stroke && geometry.r <= 0.25;
156
+ }
157
+ export function resolveDocumentAnnotationGroupChildren(children, annotationUnitsPerPoint) {
158
+ if (annotationUnitsPerPoint === undefined)
159
+ return children;
160
+ const next = [...children];
161
+ let start = 0;
162
+ while (start < next.length) {
163
+ const first = next[start];
164
+ if (!isDocumentTextLine(first)) {
165
+ start++;
166
+ continue;
167
+ }
168
+ let end = start + 1;
169
+ while (end < next.length && isSameDocumentTextRun(first, next[end]))
170
+ end++;
171
+ if (end - start > 1) {
172
+ const run = next.slice(start, end);
173
+ const adjusted = positionDocumentTextRun(run, annotationUnitsPerPoint);
174
+ for (let index = 0; index < adjusted.length; index++) {
175
+ const line = adjusted[index];
176
+ if (line)
177
+ next[start + index] = line;
178
+ }
179
+ }
180
+ start = end;
181
+ }
182
+ return next;
183
+ }
184
+ function isDocumentTextLine(geometry) {
185
+ return geometry?.kind === 'text' && geometry.upright === true;
186
+ }
187
+ function isSameDocumentTextRun(first, candidate) {
188
+ return (isDocumentTextLine(candidate) &&
189
+ Math.abs(candidate.x - first.x) < 1e-6 &&
190
+ candidate.textAnchor === first.textAnchor &&
191
+ readFloorplanGeometryMetadata(candidate).annotationRole ===
192
+ readFloorplanGeometryMetadata(first).annotationRole);
193
+ }
194
+ function positionDocumentTextRun(run, annotationUnitsPerPoint) {
195
+ const centerY = run.reduce((sum, line) => sum + line.y, 0) / run.length;
196
+ const steps = run.slice(0, -1).map((line, index) => {
197
+ const next = run[index + 1] ?? line;
198
+ const largerFontPt = Math.max(documentTextSizePt(line), documentTextSizePt(next));
199
+ return largerFontPt * 1.25 * annotationUnitsPerPoint;
200
+ });
201
+ const totalHeight = steps.reduce((sum, step) => sum + step, 0);
202
+ let y = centerY - totalHeight / 2;
203
+ return run.map((line, index) => {
204
+ if (index > 0)
205
+ y += steps[index - 1] ?? 0;
206
+ return { ...line, y };
207
+ });
208
+ }
209
+ function renderNode(g, keyHint, pointerEventsOverride, sceneRotationDeg = 0, annotationUnitsPerPoint, screenUnitsPerPixel, renderMode = 'screen') {
210
+ switch (g.kind) {
211
+ case 'path':
212
+ return (_jsx("path", { d: g.d, ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
213
+ case 'polygon':
214
+ return (_jsx("polygon", { points: pointsToAttr(g.points), ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
215
+ case 'polyline':
216
+ return (_jsx("polyline", { points: pointsToAttr(g.points), ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
217
+ case 'rect': {
218
+ const attrs = documentRectGeometryAttrs(g, annotationUnitsPerPoint);
219
+ return (_jsx("rect", { height: attrs.height, rx: attrs.rx, ry: attrs.ry, width: attrs.width, x: attrs.x, y: attrs.y, ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
220
+ }
221
+ case 'circle': {
222
+ const attrs = documentCircleGeometryAttrs(g, annotationUnitsPerPoint);
223
+ return (_jsx("circle", { cx: g.cx, cy: g.cy, r: attrs.r, ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
224
+ }
225
+ case 'line':
226
+ return (_jsx("line", { x1: g.x1, x2: g.x2, y1: g.y1, y2: g.y2, ...styleAttrs(g, pointerEventsOverride, annotationUnitsPerPoint, renderMode) }, keyHint));
227
+ case 'text': {
228
+ const fontSize = annotationUnitsPerPoint !== undefined
229
+ ? documentTextFontSize(g, annotationUnitsPerPoint)
230
+ : g.fontSize;
231
+ const textStyle = resolveDocumentFloorplanAnnotationStyle(g, annotationUnitsPerPoint);
232
+ const pdfOutlinedText = renderMode === 'pdf' && g.paintOrder === 'stroke' && !!g.stroke;
233
+ const fill = pdfOutlinedText && g.fill?.toLocaleLowerCase() === '#ffffff'
234
+ ? g.stroke
235
+ : (g.fill ?? '#171717');
236
+ if (g.upright) {
237
+ return (_jsx("g", { "data-floorplan-annotation-obstacle": floorplanAnnotationObstacleMode(g), transform: `translate(${g.x} ${g.y}) rotate(${-sceneRotationDeg})`, children: _jsx("text", { dominantBaseline: g.dominantBaseline ?? 'middle', fill: fill, fontFamily: g.fontFamily, fontSize: fontSize, fontWeight: g.fontWeight, opacity: g.opacity, paintOrder: pdfOutlinedText ? undefined : g.paintOrder, pointerEvents: pointerEventsOverride, stroke: pdfOutlinedText ? undefined : g.stroke, strokeLinecap: !pdfOutlinedText && g.stroke ? 'round' : undefined, strokeLinejoin: !pdfOutlinedText && g.stroke ? 'round' : undefined, strokeWidth: pdfOutlinedText ? undefined : (textStyle.strokeWidth ?? g.strokeWidth), textAnchor: g.textAnchor ?? 'start', x: 0, y: 0, children: g.text }) }, keyHint));
238
+ }
239
+ return (_jsx("text", { "data-floorplan-annotation-obstacle": floorplanAnnotationObstacleMode(g), dominantBaseline: g.dominantBaseline ?? 'middle', fill: fill, fontFamily: g.fontFamily, fontSize: fontSize, fontWeight: g.fontWeight, opacity: g.opacity, paintOrder: pdfOutlinedText ? undefined : g.paintOrder, stroke: pdfOutlinedText ? undefined : g.stroke, strokeLinecap: !pdfOutlinedText && g.stroke ? 'round' : undefined, strokeLinejoin: !pdfOutlinedText && g.stroke ? 'round' : undefined, strokeWidth: pdfOutlinedText ? undefined : (textStyle.strokeWidth ?? g.strokeWidth), textAnchor: g.textAnchor ?? 'start', pointerEvents: pointerEventsOverride, x: g.x, y: g.y, children: g.text }, keyHint));
240
+ }
241
+ case 'dimension':
242
+ return (_jsx(FloorplanDimensionRenderer, { geometry: g, sceneRotationDeg: sceneRotationDeg, annotationUnitsPerPoint: annotationUnitsPerPoint, renderMode: renderMode }, keyHint));
243
+ case 'dimension-string':
244
+ return (_jsx(FloorplanDimensionStringRenderer, { annotationUnitsPerPoint: annotationUnitsPerPoint, geometry: g, renderMode: renderMode, sceneRotationDeg: sceneRotationDeg }, keyHint));
245
+ case 'dimension-label': {
246
+ const unitsPerPixel = annotationUnitsPerPoint ?? screenUnitsPerPixel ?? STATIC_LABEL_UNITS_PER_PIXEL;
247
+ const documentMode = annotationUnitsPerPoint !== undefined;
248
+ const outlined = g.appearance === 'outlined';
249
+ const pdfOutlined = outlined && renderMode === 'pdf';
250
+ const padX = unitsPerPixel * 6;
251
+ const padY = unitsPerPixel * 3;
252
+ const fontSize = unitsPerPixel * (documentMode ? 8 : outlined ? 12 : 10);
253
+ const textWidth = g.text.length * unitsPerPixel * 6.2;
254
+ const plateW = textWidth + padX * 2;
255
+ const plateH = fontSize + padY * 2;
256
+ const degrees = resolveFloorplanLabelAngle(g.angle, sceneRotationDeg, g.screenUpright);
257
+ const labelTransform = `translate(${g.cx} ${g.cy}) rotate(${degrees}) translate(0 ${-(g.offsetPx ?? 0) * unitsPerPixel})`;
258
+ return (_jsxs("g", { "data-floorplan-annotation-angle-radians": g.angle, "data-floorplan-annotation-default-transform": labelTransform, "data-floorplan-annotation-label": "", "data-floorplan-annotation-priority": "20", "data-floorplan-annotation-screen-upright": g.screenUpright ? 'true' : undefined, "data-floorplan-annotation-transform-after-rotation": `translate(0 ${-(g.offsetPx ?? 0) * unitsPerPixel})`, "data-floorplan-annotation-transform-before-rotation": `translate(${g.cx} ${g.cy})`, pointerEvents: "none", transform: labelTransform, children: [outlined && !pdfOutlined ? null : (_jsx("rect", { "data-floorplan-dimension-label-plate": pdfOutlined ? '' : undefined, fill: "#ffffff", height: plateH, opacity: 0.92, rx: unitsPerPixel * 3, ry: unitsPerPixel * 3, stroke: pdfOutlined ? undefined : '#334155', strokeWidth: pdfOutlined ? undefined : unitsPerPixel * 0.5, width: plateW, x: -plateW / 2, y: -plateH / 2 })), _jsx("text", { dominantBaseline: "middle", fill: pdfOutlined ? '#111827' : outlined ? '#ffffff' : '#111827', fontFamily: outlined && !pdfOutlined
259
+ ? 'system-ui, -apple-system, sans-serif'
260
+ : 'ui-monospace, SFMono-Regular, Menlo, monospace', fontSize: fontSize, fontWeight: outlined ? 500 : 600, paintOrder: outlined && !pdfOutlined ? 'stroke' : undefined, stroke: outlined && !pdfOutlined ? '#334155' : undefined, strokeLinecap: outlined && !pdfOutlined ? 'round' : undefined, strokeLinejoin: outlined && !pdfOutlined ? 'round' : undefined, strokeWidth: outlined && !pdfOutlined ? fontSize * 0.35 : undefined, textAnchor: "middle", x: 0, y: 0, children: g.text })] }, keyHint));
261
+ }
262
+ case 'image':
263
+ return (_jsx(FloorplanImage, { center: g.center, height: g.height, opacity: g.opacity, preserveAspectRatio: g.preserveAspectRatio ?? 'xMidYMid meet', rotation: g.rotation ?? 0, url: g.url, width: g.width }, keyHint));
264
+ case 'group': {
265
+ const transform = formatTransform(g.transform);
266
+ const children = resolveDocumentAnnotationGroupChildren(g.children, annotationUnitsPerPoint);
267
+ return (_jsx("g", { "data-floorplan-annotation-obstacle": isFloorplanAnnotationObstacleGeometry(g) ? '' : undefined, transform: transform, children: children.map((child, i) => renderNode(child, i, pointerEventsOverride, sceneRotationDeg, annotationUnitsPerPoint, screenUnitsPerPixel, renderMode)) }, keyHint));
268
+ }
269
+ // The remaining interactive primitives (hatch / hit-line / endpoint-handle)
270
+ // need the SVG context + theme palette + units-per-
271
+ // pixel that only the registry layer has access to. They're rendered
272
+ // by `floorplan-registry-layer.tsx`'s interactive walker instead. If
273
+ // a caller routes one of these through this pure renderer it
274
+ // silently drops — the static renderer is for static output.
275
+ default:
276
+ return null;
277
+ }
278
+ }
279
+ function pointsToAttr(points) {
280
+ return points.map(([x, y]) => `${x},${y}`).join(' ');
281
+ }
282
+ function formatTransform(t) {
283
+ if (!t)
284
+ return undefined;
285
+ const parts = [];
286
+ if (t.translate)
287
+ parts.push(`translate(${t.translate[0]} ${t.translate[1]})`);
288
+ if (t.rotate !== undefined)
289
+ parts.push(`rotate(${(t.rotate * 180) / Math.PI})`);
290
+ return parts.length > 0 ? parts.join(' ') : undefined;
291
+ }
292
+ /**
293
+ * `image` primitive renderer. Resolves the URL asynchronously via
294
+ * `loadAssetUrl` (handles CDN / Supabase storage) and renders an SVG
295
+ * `<image>` centered at `center`, rotated around it, sized in plan-local
296
+ * metres. While the resolution is in flight, renders nothing.
297
+ */
298
+ function FloorplanImage({ url, center, width, height, rotation, preserveAspectRatio, opacity, }) {
299
+ const [resolvedUrl, setResolvedUrl] = useState(null);
300
+ useEffect(() => {
301
+ if (!url) {
302
+ setResolvedUrl(null);
303
+ return;
304
+ }
305
+ let cancelled = false;
306
+ setResolvedUrl(null);
307
+ loadAssetUrl(url).then((next) => {
308
+ if (!cancelled)
309
+ setResolvedUrl(next);
310
+ });
311
+ return () => {
312
+ cancelled = true;
313
+ };
314
+ }, [url]);
315
+ if (!resolvedUrl)
316
+ return null;
317
+ const rotationDeg = (rotation * 180) / Math.PI;
318
+ return (_jsx("g", { pointerEvents: "none", transform: `translate(${center[0]} ${center[1]}) rotate(${rotationDeg})`, children: _jsx("image", { height: height, href: resolvedUrl, opacity: opacity, preserveAspectRatio: preserveAspectRatio, width: width, x: -width / 2, y: -height / 2 }) }));
319
+ }
@@ -0,0 +1,29 @@
1
+ export type FloorplanViewPoint = {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ export type FloorplanSyncedView = {
6
+ localCenter: FloorplanViewPoint;
7
+ userRotationDeg: number;
8
+ viewWidth: number;
9
+ };
10
+ /**
11
+ * Gives a blank level a room-scale viewport on every screen shape. Wide
12
+ * desktop canvases keep more horizontal context, but never inherit a
13
+ * city/GIS-scale camera width; narrow/mobile canvases retain at least 12 m.
14
+ */
15
+ export declare function resolveEmptyFloorplanViewWidth(aspectRatio: number): number;
16
+ /**
17
+ * A linked 3D camera is authoritative once a level contains authored content.
18
+ * For a genuinely blank level it may still carry the Site/GIS camera pose from
19
+ * the preceding workflow, so use the fitted room-scale origin instead.
20
+ */
21
+ export declare function resolveFloorplanSyncedView(input: {
22
+ emptyLocalCenter: FloorplanViewPoint;
23
+ emptyViewWidth: number;
24
+ hasAuthoredContent: boolean;
25
+ navigationLocalCenter: FloorplanViewPoint;
26
+ navigationUserRotationDeg: number;
27
+ navigationViewWidth: number;
28
+ }): FloorplanSyncedView;
29
+ //# sourceMappingURL=floorplan-initial-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-initial-view.d.ts","sourceRoot":"","sources":["../src/floorplan-initial-view.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,kBAAkB,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAKD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,gBAAgB,EAAE,kBAAkB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,qBAAqB,EAAE,kBAAkB,CAAA;IACzC,yBAAyB,EAAE,MAAM,CAAA;IACjC,mBAAmB,EAAE,MAAM,CAAA;CAC5B,GAAG,mBAAmB,CActB"}
@@ -0,0 +1,30 @@
1
+ const EMPTY_FLOORPLAN_MIN_VIEW_WIDTH = 12;
2
+ const EMPTY_FLOORPLAN_MAX_VIEW_WIDTH = 20;
3
+ /**
4
+ * Gives a blank level a room-scale viewport on every screen shape. Wide
5
+ * desktop canvases keep more horizontal context, but never inherit a
6
+ * city/GIS-scale camera width; narrow/mobile canvases retain at least 12 m.
7
+ */
8
+ export function resolveEmptyFloorplanViewWidth(aspectRatio) {
9
+ const safeAspectRatio = Number.isFinite(aspectRatio) && aspectRatio > 0 ? aspectRatio : 1;
10
+ return Math.min(EMPTY_FLOORPLAN_MAX_VIEW_WIDTH, Math.max(EMPTY_FLOORPLAN_MIN_VIEW_WIDTH, EMPTY_FLOORPLAN_MIN_VIEW_WIDTH * safeAspectRatio));
11
+ }
12
+ /**
13
+ * A linked 3D camera is authoritative once a level contains authored content.
14
+ * For a genuinely blank level it may still carry the Site/GIS camera pose from
15
+ * the preceding workflow, so use the fitted room-scale origin instead.
16
+ */
17
+ export function resolveFloorplanSyncedView(input) {
18
+ if (input.hasAuthoredContent) {
19
+ return {
20
+ localCenter: input.navigationLocalCenter,
21
+ userRotationDeg: input.navigationUserRotationDeg,
22
+ viewWidth: input.navigationViewWidth,
23
+ };
24
+ }
25
+ return {
26
+ localCenter: input.emptyLocalCenter,
27
+ userRotationDeg: 0,
28
+ viewWidth: input.emptyViewWidth,
29
+ };
30
+ }
@@ -0,0 +1,24 @@
1
+ export declare function resolveFloorplanLabelAngle(angleRadians: number, sceneRotationDeg: number, screenUpright?: boolean): number;
2
+ export declare function shouldUpdateFloorplanLabelRotation(previousRotationDeg: number | null, nextRotationDeg: number, minimumDeltaDeg?: number): boolean;
3
+ export declare function resolveFloorplanAnnotationUpdate({ layoutInputsChanged, previousRotationDeg, nextRotationDeg, }: {
4
+ layoutInputsChanged: boolean;
5
+ previousRotationDeg: number | null;
6
+ nextRotationDeg: number;
7
+ }): {
8
+ resolveCollisions: boolean;
9
+ updateLabelPresentation: boolean;
10
+ };
11
+ export declare function resolveFloorplanAnnotationLabelTransform({ angleRadians, sceneRotationDeg, screenUpright, beforeRotation, afterRotation, layoutDx, layoutDy, }: {
12
+ angleRadians: number;
13
+ sceneRotationDeg: number;
14
+ screenUpright: boolean;
15
+ beforeRotation: string;
16
+ afterRotation: string;
17
+ layoutDx?: number;
18
+ layoutDy?: number;
19
+ }): {
20
+ defaultTransform: string;
21
+ transform: string;
22
+ };
23
+ export declare function updateSvgFloorplanLabelOrientations(labels: Iterable<SVGGElement>, sceneRotationDeg: number): number;
24
+ //# sourceMappingURL=floorplan-label-angle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-label-angle.d.ts","sourceRoot":"","sources":["../src/floorplan-label-angle.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,aAAa,UAAQ,GACpB,MAAM,CASR;AAED,wBAAgB,kCAAkC,CAChD,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,eAAe,EAAE,MAAM,EACvB,eAAe,SAAI,GAClB,OAAO,CAIT;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,GAChB,EAAE;IACD,mBAAmB,EAAE,OAAO,CAAA;IAC5B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;CACxB,GAAG;IACF,iBAAiB,EAAE,OAAO,CAAA;IAC1B,uBAAuB,EAAE,OAAO,CAAA;CACjC,CAOA;AAED,wBAAgB,wCAAwC,CAAC,EACvD,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,EACb,QAAY,EACZ,QAAY,GACb,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG;IACF,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB,CAYA;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC7B,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAwBR"}
@@ -0,0 +1,60 @@
1
+ export function resolveFloorplanLabelAngle(angleRadians, sceneRotationDeg, screenUpright = false) {
2
+ if (screenUpright)
3
+ return -sceneRotationDeg;
4
+ let localAngleDeg = (angleRadians * 180) / Math.PI;
5
+ let screenAngleDeg = localAngleDeg + sceneRotationDeg;
6
+ screenAngleDeg = ((((screenAngleDeg + 180) % 360) + 360) % 360) - 180;
7
+ if (screenAngleDeg > 90)
8
+ localAngleDeg -= 180;
9
+ else if (screenAngleDeg <= -90)
10
+ localAngleDeg += 180;
11
+ return ((((localAngleDeg + 180) % 360) + 360) % 360) - 180;
12
+ }
13
+ export function shouldUpdateFloorplanLabelRotation(previousRotationDeg, nextRotationDeg, minimumDeltaDeg = 1) {
14
+ if (previousRotationDeg === null)
15
+ return true;
16
+ const deltaDeg = ((((nextRotationDeg - previousRotationDeg + 180) % 360) + 360) % 360) - 180;
17
+ return Math.abs(deltaDeg) >= minimumDeltaDeg;
18
+ }
19
+ export function resolveFloorplanAnnotationUpdate({ layoutInputsChanged, previousRotationDeg, nextRotationDeg, }) {
20
+ return {
21
+ resolveCollisions: layoutInputsChanged,
22
+ updateLabelPresentation: layoutInputsChanged ||
23
+ shouldUpdateFloorplanLabelRotation(previousRotationDeg, nextRotationDeg),
24
+ };
25
+ }
26
+ export function resolveFloorplanAnnotationLabelTransform({ angleRadians, sceneRotationDeg, screenUpright, beforeRotation, afterRotation, layoutDx = 0, layoutDy = 0, }) {
27
+ const degrees = resolveFloorplanLabelAngle(angleRadians, sceneRotationDeg, screenUpright);
28
+ const defaultTransform = [beforeRotation, `rotate(${degrees})`, afterRotation]
29
+ .filter(Boolean)
30
+ .join(' ');
31
+ return {
32
+ defaultTransform,
33
+ transform: layoutDx === 0 && layoutDy === 0
34
+ ? defaultTransform
35
+ : `${defaultTransform} translate(${layoutDx} ${layoutDy})`,
36
+ };
37
+ }
38
+ export function updateSvgFloorplanLabelOrientations(labels, sceneRotationDeg) {
39
+ let updated = 0;
40
+ for (const label of labels) {
41
+ const angleRadians = Number(label.dataset.floorplanAnnotationAngleRadians);
42
+ if (!Number.isFinite(angleRadians))
43
+ continue;
44
+ const { defaultTransform, transform } = resolveFloorplanAnnotationLabelTransform({
45
+ angleRadians,
46
+ sceneRotationDeg,
47
+ screenUpright: label.dataset.floorplanAnnotationScreenUpright === 'true',
48
+ beforeRotation: label.dataset.floorplanAnnotationTransformBeforeRotation ?? '',
49
+ afterRotation: label.dataset.floorplanAnnotationTransformAfterRotation ?? '',
50
+ layoutDx: Number(label.dataset.floorplanAnnotationLayoutDx ?? 0),
51
+ layoutDy: Number(label.dataset.floorplanAnnotationLayoutDy ?? 0),
52
+ });
53
+ if (label.getAttribute('transform') === transform)
54
+ continue;
55
+ label.dataset.floorplanAnnotationDefaultTransform = defaultTransform;
56
+ label.setAttribute('transform', transform);
57
+ updated += 1;
58
+ }
59
+ return updated;
60
+ }
@@ -0,0 +1,57 @@
1
+ export type FloorplanPresentationViewBox = {
2
+ minX: number;
3
+ minY: number;
4
+ width: number;
5
+ height: number;
6
+ };
7
+ export declare function setFloorplanCompassRotation(compass: {
8
+ style: {
9
+ transform: string;
10
+ };
11
+ } | null, rotationDeg: number): void;
12
+ type FloorplanRotationPresentation = {
13
+ svg: {
14
+ style: {
15
+ transform: string;
16
+ transformOrigin: string;
17
+ willChange: string;
18
+ };
19
+ };
20
+ svgStyle: {
21
+ transform: string;
22
+ transformOrigin: string;
23
+ willChange: string;
24
+ };
25
+ };
26
+ export declare function queueFloorplanRotationPresentationRestore<Presentation extends FloorplanRotationPresentation>(pending: {
27
+ current: Presentation | null;
28
+ }, presentation: Presentation): void;
29
+ export declare function flushFloorplanRotationPresentationRestore<Presentation extends FloorplanRotationPresentation>(pending: {
30
+ current: Presentation | null;
31
+ }): void;
32
+ export declare function getFloorplanRotationOverscanViewBox(viewBox: FloorplanPresentationViewBox): FloorplanPresentationViewBox;
33
+ export declare function resolveFloorplanPresentationViewBox(reactViewBox: FloorplanPresentationViewBox, imperativeViewBox: FloorplanPresentationViewBox | null, interactionInProgress: boolean): FloorplanPresentationViewBox;
34
+ export declare function canZoomFloorplanDuringNavigation(rotationInProgress: boolean): boolean;
35
+ export declare function canApplyFloorplanNavigationSync(interactionInProgress: boolean): boolean;
36
+ export type FloorplanNavigationSyncScheduler<Pose> = {
37
+ update: (pose: Pose) => void;
38
+ flush: () => void;
39
+ discard: () => void;
40
+ };
41
+ export declare function createFloorplanNavigationSyncScheduler<Pose>({ applyPresentation, commit, settleMs, schedule, cancel, }: {
42
+ applyPresentation: (pose: Pose) => void;
43
+ commit: (pose: Pose) => void;
44
+ settleMs?: number;
45
+ schedule?: (callback: () => void, delay: number) => ReturnType<typeof globalThis.setTimeout>;
46
+ cancel?: (timer: ReturnType<typeof globalThis.setTimeout>) => void;
47
+ }): FloorplanNavigationSyncScheduler<Pose>;
48
+ export declare function finalizeFloorplanNavigation<RotationState>({ zoomPending, panActive, rotationState, commitZoom, commitPan, commitRotation, }: {
49
+ zoomPending: boolean;
50
+ panActive: boolean;
51
+ rotationState: RotationState | null;
52
+ commitZoom: () => void;
53
+ commitPan: () => void;
54
+ commitRotation: (rotationState: RotationState) => void;
55
+ }): void;
56
+ export {};
57
+ //# sourceMappingURL=floorplan-navigation-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan-navigation-presentation.d.ts","sourceRoot":"","sources":["../src/floorplan-navigation-presentation.ts"],"names":[],"mappings":"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"}