@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,151 @@
1
+ // Pure 2D geometry for the screen-rect marquee's membership test. The
2
+ // marquee intersects each node's ORIENTED bounding box projected to screen —
3
+ // a convex hull — instead of a screen-space AABB of the world AABB, whose
4
+ // double inflation (world AABB around rotated geometry, then a 2D AABB
5
+ // around its projection) selected objects visually far from the cursor.
6
+ function cross(o, a, b) {
7
+ return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
8
+ }
9
+ /** Andrew monotone-chain convex hull. Returns CCW hull without the closing
10
+ * point; degenerate inputs (0–2 points, collinear sets) pass through. */
11
+ export function convexHull2D(points) {
12
+ if (points.length <= 2)
13
+ return [...points];
14
+ const sorted = [...points].sort((a, b) => a[0] - b[0] || a[1] - b[1]);
15
+ const lower = [];
16
+ for (const p of sorted) {
17
+ while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) {
18
+ lower.pop();
19
+ }
20
+ lower.push(p);
21
+ }
22
+ const upper = [];
23
+ for (let i = sorted.length - 1; i >= 0; i--) {
24
+ const p = sorted[i];
25
+ while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) {
26
+ upper.pop();
27
+ }
28
+ upper.push(p);
29
+ }
30
+ lower.pop();
31
+ upper.pop();
32
+ const hull = [...lower, ...upper];
33
+ return hull.length > 0 ? hull : [sorted[0]];
34
+ }
35
+ function pointInRect(p, rect) {
36
+ return p[0] >= rect.minX && p[0] <= rect.maxX && p[1] >= rect.minY && p[1] <= rect.maxY;
37
+ }
38
+ /** Ray-crossing point-in-polygon — works for convex and degenerate hulls. */
39
+ function pointInPolygon(p, polygon) {
40
+ let inside = false;
41
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
42
+ const [xi, yi] = polygon[i];
43
+ const [xj, yj] = polygon[j];
44
+ if (yi > p[1] !== yj > p[1] && p[0] < ((xj - xi) * (p[1] - yi)) / (yj - yi) + xi) {
45
+ inside = !inside;
46
+ }
47
+ }
48
+ return inside;
49
+ }
50
+ function orientation(a, b, c) {
51
+ const v = cross(a, b, c);
52
+ if (v > 0)
53
+ return 1;
54
+ if (v < 0)
55
+ return -1;
56
+ return 0;
57
+ }
58
+ function onSegment(a, b, p) {
59
+ return (Math.min(a[0], b[0]) <= p[0] &&
60
+ p[0] <= Math.max(a[0], b[0]) &&
61
+ Math.min(a[1], b[1]) <= p[1] &&
62
+ p[1] <= Math.max(a[1], b[1]));
63
+ }
64
+ function segmentsIntersect(a1, a2, b1, b2) {
65
+ const o1 = orientation(a1, a2, b1);
66
+ const o2 = orientation(a1, a2, b2);
67
+ const o3 = orientation(b1, b2, a1);
68
+ const o4 = orientation(b1, b2, a2);
69
+ if (o1 !== o2 && o3 !== o4)
70
+ return true;
71
+ if (o1 === 0 && onSegment(a1, a2, b1))
72
+ return true;
73
+ if (o2 === 0 && onSegment(a1, a2, b2))
74
+ return true;
75
+ if (o3 === 0 && onSegment(b1, b2, a1))
76
+ return true;
77
+ if (o4 === 0 && onSegment(b1, b2, a2))
78
+ return true;
79
+ return false;
80
+ }
81
+ /** Segment vs polygon (general, possibly concave): endpoint containment or
82
+ * any edge crossing. */
83
+ export function segmentIntersectsPolygon(a, b, polygon) {
84
+ if (polygon.length === 0)
85
+ return false;
86
+ if (polygon.length === 1)
87
+ return false;
88
+ if (polygon.length >= 3 && (pointInPolygon(a, polygon) || pointInPolygon(b, polygon)))
89
+ return true;
90
+ for (let i = 0; i < polygon.length; i++) {
91
+ if (segmentsIntersect(a, b, polygon[i], polygon[(i + 1) % polygon.length]))
92
+ return true;
93
+ }
94
+ return false;
95
+ }
96
+ /** Polygon vs polygon (general): containment either way or any edge crossing. */
97
+ export function polygonsIntersect(a, b) {
98
+ if (a.length === 0 || b.length === 0)
99
+ return false;
100
+ if (a.length >= 3 && b.some((p) => pointInPolygon(p, a)))
101
+ return true;
102
+ if (b.length >= 3 && a.some((p) => pointInPolygon(p, b)))
103
+ return true;
104
+ for (let i = 0; i < a.length; i++) {
105
+ const a1 = a[i];
106
+ const a2 = a[(i + 1) % a.length];
107
+ for (let j = 0; j < b.length; j++) {
108
+ if (segmentsIntersect(a1, a2, b[j], b[(j + 1) % b.length]))
109
+ return true;
110
+ }
111
+ }
112
+ return false;
113
+ }
114
+ /**
115
+ * Does the axis-aligned marquee rect intersect the (convex) hull polygon?
116
+ * Covers all cases: hull vertex inside the rect, rect fully inside the hull,
117
+ * and pure edge crossings.
118
+ */
119
+ export function rectIntersectsHull(rect, hull) {
120
+ if (hull.length === 0)
121
+ return false;
122
+ for (const p of hull) {
123
+ if (pointInRect(p, rect))
124
+ return true;
125
+ }
126
+ if (hull.length === 1)
127
+ return false;
128
+ const rectCorners = [
129
+ [rect.minX, rect.minY],
130
+ [rect.maxX, rect.minY],
131
+ [rect.maxX, rect.maxY],
132
+ [rect.minX, rect.maxY],
133
+ ];
134
+ if (hull.length >= 3) {
135
+ for (const c of rectCorners) {
136
+ if (pointInPolygon(c, hull))
137
+ return true;
138
+ }
139
+ }
140
+ for (let i = 0; i < hull.length; i++) {
141
+ const h1 = hull[i];
142
+ const h2 = hull[(i + 1) % hull.length];
143
+ for (let j = 0; j < 4; j++) {
144
+ const r1 = rectCorners[j];
145
+ const r2 = rectCorners[(j + 1) % 4];
146
+ if (segmentsIntersect(h1, h2, r1, r2))
147
+ return true;
148
+ }
149
+ }
150
+ return false;
151
+ }
@@ -0,0 +1,18 @@
1
+ import { type ComponentPropsWithoutRef, type ReactElement, type ReactNode } from 'react';
2
+ export type SpatialWorkspaceCameraAction = 'fit' | 'orbit-ccw' | 'orbit-cw' | 'top-view' | 'restore-north';
3
+ export type SpatialWorkspaceCameraActionButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'children' | 'disabled' | 'onClick' | 'type'> & {
4
+ 'data-pascal-spatial-workspace-camera-action'?: never;
5
+ };
6
+ export type SpatialWorkspaceCameraActionControlItem = {
7
+ action: SpatialWorkspaceCameraAction;
8
+ buttonProps?: SpatialWorkspaceCameraActionButtonProps;
9
+ content: ReactNode;
10
+ disabled?: boolean;
11
+ renderButton?: (button: ReactElement, item: SpatialWorkspaceCameraActionControlItem) => ReactNode;
12
+ };
13
+ export type SpatialWorkspaceCameraActionControlProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'role'> & {
14
+ items: readonly SpatialWorkspaceCameraActionControlItem[];
15
+ onActionRequest: (action: SpatialWorkspaceCameraAction) => void;
16
+ };
17
+ export declare function SpatialWorkspaceCameraActionControl({ items, onActionRequest, ...rootProps }: SpatialWorkspaceCameraActionControlProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=spatial-workspace-camera-action-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-camera-action-control.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-camera-action-control.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,wBAAwB,EAAY,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAElG,MAAM,MAAM,4BAA4B,GACpC,KAAK,GACL,WAAW,GACX,UAAU,GACV,UAAU,GACV,eAAe,CAAA;AAEnB,MAAM,MAAM,uCAAuC,GAAG,IAAI,CACxD,wBAAwB,CAAC,QAAQ,CAAC,EAClC,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC7C,GAAG;IACF,6CAA6C,CAAC,EAAE,KAAK,CAAA;CACtD,CAAA;AAED,MAAM,MAAM,uCAAuC,GAAG;IACpD,MAAM,EAAE,4BAA4B,CAAA;IACpC,WAAW,CAAC,EAAE,uCAAuC,CAAA;IACrD,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,uCAAuC,KAAK,SAAS,CAAA;CAClG,CAAA;AAED,MAAM,MAAM,wCAAwC,GAAG,IAAI,CACzD,wBAAwB,CAAC,KAAK,CAAC,EAC/B,UAAU,GAAG,MAAM,CACpB,GAAG;IACF,KAAK,EAAE,SAAS,uCAAuC,EAAE,CAAA;IACzD,eAAe,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,CAAA;CAChE,CAAA;AAED,wBAAgB,mCAAmC,CAAC,EAClD,KAAK,EACL,eAAe,EACf,GAAG,SAAS,EACb,EAAE,wCAAwC,+BA2B1C"}
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createElement as _createElement } from "react";
4
+ import { Fragment } from 'react';
5
+ export function SpatialWorkspaceCameraActionControl({ items, onActionRequest, ...rootProps }) {
6
+ return (_jsx("div", { ...rootProps, "data-pascal-spatial-workspace-camera-action-control": "", role: "group", children: items.map((item) => {
7
+ const button = (_createElement("button", { ...item.buttonProps, "aria-disabled": item.disabled ?? false, "data-pascal-spatial-workspace-camera-action": item.action, key: item.action, onClick: () => {
8
+ if (!item.disabled)
9
+ onActionRequest(item.action);
10
+ }, type: "button" }, item.content));
11
+ return item.renderButton ? (_jsx(Fragment, { children: item.renderButton(button, item) }, item.action)) : (button);
12
+ }) }));
13
+ }
@@ -0,0 +1,64 @@
1
+ import { type ComponentPropsWithoutRef, type ReactElement, type ReactNode } from 'react';
2
+ export type SpatialWorkspaceProjection = 'orthographic' | 'perspective';
3
+ export type SpatialWorkspaceShading = 'rendered' | 'solid';
4
+ export type SpatialWorkspaceEdgeMode = 'off' | 'soft' | 'strong';
5
+ export type SpatialWorkspaceDisplayState = {
6
+ edges: SpatialWorkspaceEdgeMode;
7
+ projection: SpatialWorkspaceProjection;
8
+ sceneTheme: string;
9
+ shading: SpatialWorkspaceShading;
10
+ shadows: boolean;
11
+ textures: boolean;
12
+ };
13
+ export type SpatialWorkspaceDisplayAction = {
14
+ kind: 'toggle-shadows';
15
+ } | {
16
+ kind: 'toggle-projection';
17
+ } | {
18
+ kind: 'toggle-textures';
19
+ } | {
20
+ kind: 'set-shading';
21
+ value: SpatialWorkspaceShading;
22
+ } | {
23
+ kind: 'set-scene-theme';
24
+ value: string;
25
+ } | {
26
+ kind: 'set-edges';
27
+ value: SpatialWorkspaceEdgeMode;
28
+ };
29
+ export type SpatialWorkspaceDisplayController = {
30
+ setEdges: (mode: SpatialWorkspaceEdgeMode) => void;
31
+ setProjection: (projection: SpatialWorkspaceProjection) => void;
32
+ setSceneTheme: (id: string) => void;
33
+ setShading: (shading: SpatialWorkspaceShading) => void;
34
+ setShadows: (enabled: boolean) => void;
35
+ setTextures: (enabled: boolean) => void;
36
+ };
37
+ type SpatialWorkspaceDataAttributes = {
38
+ [attribute: `data-${string}`]: boolean | number | string | undefined;
39
+ };
40
+ export type SpatialWorkspaceDisplayButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'aria-pressed' | 'children' | 'disabled' | 'onClick' | 'type'> & SpatialWorkspaceDataAttributes & {
41
+ 'data-pascal-spatial-workspace-display-action'?: never;
42
+ };
43
+ export type SpatialWorkspaceDisplayControlProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'role'> & {
44
+ actions?: readonly SpatialWorkspaceDisplayAction[];
45
+ buttonProps?: (action: SpatialWorkspaceDisplayAction, active: boolean) => SpatialWorkspaceDisplayButtonProps | undefined;
46
+ controller: SpatialWorkspaceDisplayController;
47
+ renderButton?: (button: ReactElement, action: SpatialWorkspaceDisplayAction, active: boolean) => ReactNode;
48
+ renderContent: (action: SpatialWorkspaceDisplayAction, active: boolean) => ReactNode;
49
+ sceneThemeIds: readonly string[];
50
+ state: SpatialWorkspaceDisplayState;
51
+ };
52
+ export type SpatialWorkspaceDisplayActionGroups = {
53
+ edges: readonly SpatialWorkspaceDisplayAction[];
54
+ primary: readonly SpatialWorkspaceDisplayAction[];
55
+ sceneThemes: readonly SpatialWorkspaceDisplayAction[];
56
+ shading: readonly SpatialWorkspaceDisplayAction[];
57
+ };
58
+ export declare function createSpatialWorkspaceDisplayActionGroups(sceneThemeIds: readonly string[]): SpatialWorkspaceDisplayActionGroups;
59
+ export declare function createSpatialWorkspaceDisplayActions(sceneThemeIds: readonly string[]): SpatialWorkspaceDisplayAction[];
60
+ export declare function isSpatialWorkspaceDisplayActionActive(state: SpatialWorkspaceDisplayState, action: SpatialWorkspaceDisplayAction): boolean;
61
+ export declare function applySpatialWorkspaceDisplayAction(state: SpatialWorkspaceDisplayState, controller: SpatialWorkspaceDisplayController, action: SpatialWorkspaceDisplayAction): void;
62
+ export declare function SpatialWorkspaceDisplayControl({ actions, buttonProps, controller, renderButton, renderContent, sceneThemeIds, state, ...rootProps }: SpatialWorkspaceDisplayControlProps): import("react").JSX.Element;
63
+ export {};
64
+ //# sourceMappingURL=spatial-workspace-display-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-display-control.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-display-control.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,wBAAwB,EAAY,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAElG,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG,aAAa,CAAA;AACvE,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAA;AAC1D,MAAM,MAAM,wBAAwB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhE,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,wBAAwB,CAAA;IAC/B,UAAU,EAAE,0BAA0B,CAAA;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,uBAAuB,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,CAAA;AAE1D,MAAM,MAAM,iCAAiC,GAAG;IAC9C,QAAQ,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAA;IAClD,aAAa,EAAE,CAAC,UAAU,EAAE,0BAA0B,KAAK,IAAI,CAAA;IAC/D,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,UAAU,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAA;IACtD,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,KAAK,8BAA8B,GAAG;IACpC,CAAC,SAAS,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG,IAAI,CACnD,wBAAwB,CAAC,QAAQ,CAAC,EAClC,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC9D,GACC,8BAA8B,GAAG;IAC/B,8CAA8C,CAAC,EAAE,KAAK,CAAA;CACvD,CAAA;AAEH,MAAM,MAAM,mCAAmC,GAAG,IAAI,CACpD,wBAAwB,CAAC,KAAK,CAAC,EAC/B,UAAU,GAAG,MAAM,CACpB,GAAG;IACF,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAA;IAClD,WAAW,CAAC,EAAE,CACZ,MAAM,EAAE,6BAA6B,EACrC,MAAM,EAAE,OAAO,KACZ,kCAAkC,GAAG,SAAS,CAAA;IACnD,UAAU,EAAE,iCAAiC,CAAA;IAC7C,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,6BAA6B,EACrC,MAAM,EAAE,OAAO,KACZ,SAAS,CAAA;IACd,aAAa,EAAE,CAAC,MAAM,EAAE,6BAA6B,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAA;IACpF,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,KAAK,EAAE,4BAA4B,CAAA;CACpC,CAAA;AAaD,MAAM,MAAM,mCAAmC,GAAG;IAChD,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAA;IAC/C,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAA;IACjD,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAA;IACrD,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAClD,CAAA;AAED,wBAAgB,yCAAyC,CACvD,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,mCAAmC,CAcrC;AAED,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,6BAA6B,EAAE,CAGjC;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,4BAA4B,EACnC,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAeT;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,4BAA4B,EACnC,UAAU,EAAE,iCAAiC,EAC7C,MAAM,EAAE,6BAA6B,GACpC,IAAI,CAoBN;AAMD,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,EACP,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,KAAK,EACL,GAAG,SAAS,EACb,EAAE,mCAAmC,+BA4BrC"}
@@ -0,0 +1,81 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createElement as _createElement } from "react";
4
+ import { Fragment } from 'react';
5
+ const SHADING_ACTIONS = [
6
+ { kind: 'set-shading', value: 'solid' },
7
+ { kind: 'set-shading', value: 'rendered' },
8
+ ];
9
+ const EDGE_ACTIONS = [
10
+ { kind: 'set-edges', value: 'off' },
11
+ { kind: 'set-edges', value: 'soft' },
12
+ { kind: 'set-edges', value: 'strong' },
13
+ ];
14
+ export function createSpatialWorkspaceDisplayActionGroups(sceneThemeIds) {
15
+ return {
16
+ edges: EDGE_ACTIONS,
17
+ primary: [
18
+ { kind: 'toggle-shadows' },
19
+ { kind: 'toggle-projection' },
20
+ { kind: 'toggle-textures' },
21
+ ],
22
+ sceneThemes: sceneThemeIds.map((value) => ({
23
+ kind: 'set-scene-theme',
24
+ value,
25
+ })),
26
+ shading: SHADING_ACTIONS,
27
+ };
28
+ }
29
+ export function createSpatialWorkspaceDisplayActions(sceneThemeIds) {
30
+ const groups = createSpatialWorkspaceDisplayActionGroups(sceneThemeIds);
31
+ return [...groups.primary, ...groups.shading, ...groups.sceneThemes, ...groups.edges];
32
+ }
33
+ export function isSpatialWorkspaceDisplayActionActive(state, action) {
34
+ switch (action.kind) {
35
+ case 'toggle-shadows':
36
+ return state.shadows;
37
+ case 'toggle-projection':
38
+ return state.projection === 'orthographic';
39
+ case 'toggle-textures':
40
+ return state.textures;
41
+ case 'set-shading':
42
+ return state.shading === action.value;
43
+ case 'set-scene-theme':
44
+ return state.sceneTheme === action.value;
45
+ case 'set-edges':
46
+ return state.edges === action.value;
47
+ }
48
+ }
49
+ export function applySpatialWorkspaceDisplayAction(state, controller, action) {
50
+ switch (action.kind) {
51
+ case 'toggle-shadows':
52
+ controller.setShadows(!state.shadows);
53
+ return;
54
+ case 'toggle-projection':
55
+ controller.setProjection(state.projection === 'perspective' ? 'orthographic' : 'perspective');
56
+ return;
57
+ case 'toggle-textures':
58
+ controller.setTextures(!state.textures);
59
+ return;
60
+ case 'set-shading':
61
+ controller.setShading(action.value);
62
+ return;
63
+ case 'set-scene-theme':
64
+ controller.setSceneTheme(action.value);
65
+ return;
66
+ case 'set-edges':
67
+ controller.setEdges(action.value);
68
+ }
69
+ }
70
+ function displayActionKey(action) {
71
+ return 'value' in action ? `${action.kind}:${action.value}` : action.kind;
72
+ }
73
+ export function SpatialWorkspaceDisplayControl({ actions, buttonProps, controller, renderButton, renderContent, sceneThemeIds, state, ...rootProps }) {
74
+ const resolvedActions = actions ?? createSpatialWorkspaceDisplayActions(sceneThemeIds);
75
+ return (_jsx("div", { ...rootProps, "data-pascal-spatial-workspace-display-control": "", role: "group", children: resolvedActions.map((action) => {
76
+ const active = isSpatialWorkspaceDisplayActionActive(state, action);
77
+ const key = displayActionKey(action);
78
+ const button = (_createElement("button", { ...buttonProps?.(action, active), "aria-pressed": active, "data-pascal-spatial-workspace-display-action": key, key: key, onClick: () => applySpatialWorkspaceDisplayAction(state, controller, action), type: "button" }, renderContent(action, active)));
79
+ return renderButton ? (_jsx(Fragment, { children: renderButton(button, action, active) }, key)) : (button);
80
+ }) }));
81
+ }
@@ -0,0 +1,58 @@
1
+ import { type ComponentPropsWithoutRef, type ReactElement, type ReactNode } from 'react';
2
+ export type SpatialWorkspaceGisMeasurementKind = 'distance' | 'area' | 'perimeter';
3
+ export type SpatialWorkspaceGisAction = {
4
+ kind: 'toggle-world';
5
+ } | {
6
+ kind: 'toggle-surface';
7
+ } | {
8
+ kind: 'toggle-buildings';
9
+ } | {
10
+ kind: 'toggle-road-network';
11
+ } | {
12
+ kind: 'start-measurement';
13
+ value: SpatialWorkspaceGisMeasurementKind;
14
+ } | {
15
+ kind: 'cancel-measurement';
16
+ };
17
+ export type SpatialWorkspaceGisState = {
18
+ buildings: boolean;
19
+ measurement: SpatialWorkspaceGisMeasurementKind | null;
20
+ roadNetwork: boolean;
21
+ surface: boolean;
22
+ world: boolean;
23
+ };
24
+ export type SpatialWorkspaceGisButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'aria-pressed' | 'children' | 'disabled' | 'onClick' | 'type'> & {
25
+ 'data-pascal-spatial-workspace-gis-action'?: never;
26
+ };
27
+ export type SpatialWorkspaceGisControlProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'role'> & {
28
+ actions?: readonly SpatialWorkspaceGisAction[];
29
+ buttonProps?: (action: SpatialWorkspaceGisAction, active: boolean) => SpatialWorkspaceGisButtonProps | undefined;
30
+ onActionRequest: (action: SpatialWorkspaceGisAction) => void;
31
+ renderButton?: (button: ReactElement, action: SpatialWorkspaceGisAction, active: boolean) => ReactNode;
32
+ renderContent: (action: SpatialWorkspaceGisAction, active: boolean) => ReactNode;
33
+ state: SpatialWorkspaceGisState;
34
+ };
35
+ export declare const SPATIAL_WORKSPACE_GIS_ACTIONS: readonly [{
36
+ readonly kind: "toggle-world";
37
+ }, {
38
+ readonly kind: "toggle-surface";
39
+ }, {
40
+ readonly kind: "toggle-buildings";
41
+ }, {
42
+ readonly kind: "toggle-road-network";
43
+ }, {
44
+ readonly kind: "start-measurement";
45
+ readonly value: "distance";
46
+ }, {
47
+ readonly kind: "start-measurement";
48
+ readonly value: "area";
49
+ }, {
50
+ readonly kind: "start-measurement";
51
+ readonly value: "perimeter";
52
+ }, {
53
+ readonly kind: "cancel-measurement";
54
+ }];
55
+ export declare function spatialWorkspaceGisActionKey(action: SpatialWorkspaceGisAction): string;
56
+ export declare function isSpatialWorkspaceGisActionActive(state: SpatialWorkspaceGisState, action: SpatialWorkspaceGisAction): boolean;
57
+ export declare function SpatialWorkspaceGisControl({ actions, buttonProps, onActionRequest, renderButton, renderContent, state, ...rootProps }: SpatialWorkspaceGisControlProps): import("react").JSX.Element;
58
+ //# sourceMappingURL=spatial-workspace-gis-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-gis-control.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-gis-control.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,wBAAwB,EAAY,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAElG,MAAM,MAAM,kCAAkC,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAA;AAElF,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,kCAAkC,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAElC,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,kCAAkC,GAAG,IAAI,CAAA;IACtD,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAC/C,wBAAwB,CAAC,QAAQ,CAAC,EAClC,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC9D,GAAG;IACF,0CAA0C,CAAC,EAAE,KAAK,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG,IAAI,CAChD,wBAAwB,CAAC,KAAK,CAAC,EAC/B,UAAU,GAAG,MAAM,CACpB,GAAG;IACF,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC9C,WAAW,CAAC,EAAE,CACZ,MAAM,EAAE,yBAAyB,EACjC,MAAM,EAAE,OAAO,KACZ,8BAA8B,GAAG,SAAS,CAAA;IAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAA;IAC5D,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,yBAAyB,EACjC,MAAM,EAAE,OAAO,KACZ,SAAS,CAAA;IACd,aAAa,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAA;IAChF,KAAK,EAAE,wBAAwB,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;EASe,CAAA;AAEzD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAEtF;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAOT;AAED,wBAAgB,0BAA0B,CAAC,EACzC,OAAuC,EACvC,WAAW,EACX,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,EACL,GAAG,SAAS,EACb,EAAE,+BAA+B,+BA0BjC"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createElement as _createElement } from "react";
4
+ import { Fragment } from 'react';
5
+ export const SPATIAL_WORKSPACE_GIS_ACTIONS = [
6
+ { kind: 'toggle-world' },
7
+ { kind: 'toggle-surface' },
8
+ { kind: 'toggle-buildings' },
9
+ { kind: 'toggle-road-network' },
10
+ { kind: 'start-measurement', value: 'distance' },
11
+ { kind: 'start-measurement', value: 'area' },
12
+ { kind: 'start-measurement', value: 'perimeter' },
13
+ { kind: 'cancel-measurement' },
14
+ ];
15
+ export function spatialWorkspaceGisActionKey(action) {
16
+ return 'value' in action ? `${action.kind}:${action.value}` : action.kind;
17
+ }
18
+ export function isSpatialWorkspaceGisActionActive(state, action) {
19
+ if (action.kind === 'toggle-world')
20
+ return state.world;
21
+ if (action.kind === 'toggle-surface')
22
+ return state.surface;
23
+ if (action.kind === 'toggle-buildings')
24
+ return state.buildings;
25
+ if (action.kind === 'toggle-road-network')
26
+ return state.roadNetwork;
27
+ if (action.kind === 'start-measurement')
28
+ return state.measurement === action.value;
29
+ return state.measurement !== null;
30
+ }
31
+ export function SpatialWorkspaceGisControl({ actions = SPATIAL_WORKSPACE_GIS_ACTIONS, buttonProps, onActionRequest, renderButton, renderContent, state, ...rootProps }) {
32
+ return (_jsx("div", { ...rootProps, "data-pascal-spatial-workspace-gis-control": "", role: "group", children: actions.map((action) => {
33
+ const active = isSpatialWorkspaceGisActionActive(state, action);
34
+ const key = spatialWorkspaceGisActionKey(action);
35
+ const button = (_createElement("button", { ...buttonProps?.(action, active), "aria-pressed": active, "data-pascal-spatial-workspace-gis-action": key, key: key, onClick: () => onActionRequest(action), type: "button" }, renderContent(action, active)));
36
+ return renderButton ? (_jsx(Fragment, { children: renderButton(button, action, active) }, key)) : (button);
37
+ }) }));
38
+ }
@@ -0,0 +1,2 @@
1
+ export declare function acquireSpatialWorkspaceInstance(): () => void;
2
+ //# sourceMappingURL=spatial-workspace-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-instance.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-instance.ts"],"names":[],"mappings":"AAEA,wBAAgB,+BAA+B,IAAI,MAAM,IAAI,CAc5D"}
@@ -0,0 +1,14 @@
1
+ let activeSpatialWorkspaceInstances = 0;
2
+ export function acquireSpatialWorkspaceInstance() {
3
+ if (activeSpatialWorkspaceInstances > 0) {
4
+ throw new Error('Only one @ubuilder-ai/workspace instance may be mounted on a page in workspace v1.');
5
+ }
6
+ activeSpatialWorkspaceInstances += 1;
7
+ let released = false;
8
+ return () => {
9
+ if (released)
10
+ return;
11
+ released = true;
12
+ activeSpatialWorkspaceInstances -= 1;
13
+ };
14
+ }
@@ -0,0 +1,25 @@
1
+ import { type ComponentPropsWithoutRef, type MouseEvent, type ReactElement, type ReactNode } from 'react';
2
+ type SpatialWorkspaceDataAttributes = {
3
+ [attribute: `data-${string}`]: boolean | number | string | undefined;
4
+ };
5
+ export type SpatialWorkspaceLevelSelectorButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'aria-selected' | 'children' | 'disabled' | 'onClick' | 'type'> & SpatialWorkspaceDataAttributes & {
6
+ 'data-pascal-spatial-workspace-level-id'?: never;
7
+ };
8
+ export type SpatialWorkspaceLevelSelectorItem = {
9
+ buttonProps?: SpatialWorkspaceLevelSelectorButtonProps;
10
+ content: ReactNode;
11
+ id: string;
12
+ renderButton?: (button: ReactElement, item: SpatialWorkspaceLevelSelectorItem, active: boolean) => ReactNode;
13
+ };
14
+ export type SpatialWorkspaceLevelSelectorProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'role'> & {
15
+ visibleLevelIds?: readonly string[];
16
+ onVisibleLevelsRequest?: (ids: readonly string[]) => void;
17
+ visibilityLabel?: (item: SpatialWorkspaceLevelSelectorItem) => string;
18
+ disabled?: boolean;
19
+ activeLevelId?: string | null;
20
+ items: readonly SpatialWorkspaceLevelSelectorItem[];
21
+ onLevelRequest: (levelId: string, event: MouseEvent<HTMLButtonElement>) => void;
22
+ };
23
+ export declare function SpatialWorkspaceLevelSelector({ activeLevelId, visibleLevelIds, onVisibleLevelsRequest, visibilityLabel, disabled, items, onLevelRequest, ...rootProps }: SpatialWorkspaceLevelSelectorProps): import("react").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=spatial-workspace-level-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-level-selector.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-level-selector.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,wBAAwB,EAE7B,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,KAAK,8BAA8B,GAAG;IACpC,CAAC,SAAS,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,wCAAwC,GAAG,IAAI,CACzD,wBAAwB,CAAC,QAAQ,CAAC,EAClC,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC/D,GACC,8BAA8B,GAAG;IAC/B,wCAAwC,CAAC,EAAE,KAAK,CAAA;CACjD,CAAA;AAEH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,WAAW,CAAC,EAAE,wCAAwC,CAAA;IACtD,OAAO,EAAE,SAAS,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,iCAAiC,EACvC,MAAM,EAAE,OAAO,KACZ,SAAS,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kCAAkC,GAAG,IAAI,CACnD,wBAAwB,CAAC,KAAK,CAAC,EAC/B,UAAU,GAAG,MAAM,CACpB,GAAG;IACF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;IACzD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,iCAAiC,KAAK,MAAM,CAAA;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAA;IACnD,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;CAChF,CAAA;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,KAAK,EACL,cAAc,EACd,GAAG,SAAS,EACb,EAAE,kCAAkC,+BAiDpC"}
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createElement as _createElement } from "react";
4
+ import { Fragment, } from 'react';
5
+ export function SpatialWorkspaceLevelSelector({ activeLevelId, visibleLevelIds, onVisibleLevelsRequest, visibilityLabel, disabled, items, onLevelRequest, ...rootProps }) {
6
+ return (_jsx("div", { ...rootProps, "data-pascal-spatial-workspace-level-selector": "", role: onVisibleLevelsRequest ? 'group' : 'listbox', children: items.map((item) => {
7
+ const active = item.id === activeLevelId;
8
+ const button = (_createElement("button", { ...item.buttonProps, ...(onVisibleLevelsRequest
9
+ ? { 'aria-pressed': active }
10
+ : { 'aria-selected': active, role: 'option' }), disabled: disabled, "data-pascal-spatial-workspace-level-id": item.id, key: item.id, onClick: (event) => onLevelRequest(item.id, event), type: "button" }, item.content));
11
+ const rendered = item.renderButton ? item.renderButton(button, item, active) : button;
12
+ if (onVisibleLevelsRequest && visibleLevelIds)
13
+ return (_jsxs("span", { style: { display: 'inline-flex', alignItems: 'center', gap: 4 }, children: [_jsx("input", { type: "checkbox", "aria-label": visibilityLabel?.(item) ?? String(item.content), checked: visibleLevelIds.includes(item.id), disabled: disabled, onChange: (event) => onVisibleLevelsRequest(event.target.checked
14
+ ? [...visibleLevelIds, item.id]
15
+ : visibleLevelIds.filter((id) => id !== item.id)) }), rendered] }, item.id));
16
+ return item.renderButton ? _jsx(Fragment, { children: rendered }, item.id) : button;
17
+ }) }));
18
+ }
@@ -0,0 +1,38 @@
1
+ import type { ComponentPropsWithoutRef, MouseEvent, ReactElement, ReactNode } from 'react';
2
+ export type SpatialWorkspaceLevelMode = 'stacked' | 'exploded' | 'solo' | 'manual';
3
+ export type SpatialWorkspaceWallMode = 'cutaway' | 'up' | 'down' | 'flat' | 'translucent';
4
+ export type SpatialWorkspaceCanonicalWallMode = Exclude<SpatialWorkspaceWallMode, 'translucent'>;
5
+ type SpatialWorkspaceDataAttributes = {
6
+ [attribute: `data-${string}`]: boolean | number | string | undefined;
7
+ };
8
+ export type SpatialWorkspaceLevelModeButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'aria-disabled' | 'children' | 'disabled' | 'onClick' | 'type'> & SpatialWorkspaceDataAttributes & {
9
+ 'data-pascal-spatial-workspace-level-mode'?: never;
10
+ 'data-pascal-spatial-workspace-level-mode-control'?: never;
11
+ };
12
+ export type SpatialWorkspaceWallModeButtonProps = Omit<ComponentPropsWithoutRef<'button'>, 'aria-disabled' | 'children' | 'disabled' | 'onClick' | 'type'> & SpatialWorkspaceDataAttributes & {
13
+ 'data-pascal-spatial-workspace-wall-mode'?: never;
14
+ 'data-pascal-spatial-workspace-wall-mode-control'?: never;
15
+ };
16
+ export type SpatialWorkspaceLevelModeControlProps = {
17
+ buttonProps?: SpatialWorkspaceLevelModeButtonProps;
18
+ content: ReactNode;
19
+ disabled?: boolean;
20
+ mode: SpatialWorkspaceLevelMode;
21
+ onModeRequest: (mode: SpatialWorkspaceLevelMode, event: MouseEvent<HTMLButtonElement>) => void;
22
+ renderButton?: (button: ReactElement, mode: SpatialWorkspaceLevelMode) => ReactNode;
23
+ };
24
+ export type SpatialWorkspaceWallModeControlProps = {
25
+ buttonProps?: SpatialWorkspaceWallModeButtonProps;
26
+ content: ReactNode;
27
+ disabled?: boolean;
28
+ mode: SpatialWorkspaceWallMode;
29
+ onModeRequest: (mode: SpatialWorkspaceCanonicalWallMode, event: MouseEvent<HTMLButtonElement>) => void;
30
+ renderButton?: (button: ReactElement, mode: SpatialWorkspaceCanonicalWallMode) => ReactNode;
31
+ };
32
+ export declare function resolveNextSpatialWorkspaceLevelMode(mode: SpatialWorkspaceLevelMode): SpatialWorkspaceLevelMode;
33
+ export declare function normalizeSpatialWorkspaceWallMode(mode: SpatialWorkspaceWallMode): SpatialWorkspaceCanonicalWallMode;
34
+ export declare function resolveNextSpatialWorkspaceWallMode(mode: SpatialWorkspaceWallMode): SpatialWorkspaceCanonicalWallMode;
35
+ export declare function SpatialWorkspaceLevelModeControl({ buttonProps, content, disabled, mode, onModeRequest, renderButton, }: SpatialWorkspaceLevelModeControlProps): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
36
+ export declare function SpatialWorkspaceWallModeControl({ buttonProps, content, disabled, mode, onModeRequest, renderButton, }: SpatialWorkspaceWallModeControlProps): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
37
+ export {};
38
+ //# sourceMappingURL=spatial-workspace-level-wall-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-level-wall-control.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-level-wall-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1F,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAA;AAClF,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAA;AACzF,MAAM,MAAM,iCAAiC,GAAG,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAA;AAEhG,KAAK,8BAA8B,GAAG;IACpC,CAAC,SAAS,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,oCAAoC,GAAG,IAAI,CACrD,wBAAwB,CAAC,QAAQ,CAAC,EAClC,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC/D,GACC,8BAA8B,GAAG;IAC/B,0CAA0C,CAAC,EAAE,KAAK,CAAA;IAClD,kDAAkD,CAAC,EAAE,KAAK,CAAA;CAC3D,CAAA;AAEH,MAAM,MAAM,mCAAmC,GAAG,IAAI,CACpD,wBAAwB,CAAC,QAAQ,CAAC,EAClC,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAC/D,GACC,8BAA8B,GAAG;IAC/B,yCAAyC,CAAC,EAAE,KAAK,CAAA;IACjD,iDAAiD,CAAC,EAAE,KAAK,CAAA;CAC1D,CAAA;AAEH,MAAM,MAAM,qCAAqC,GAAG;IAClD,WAAW,CAAC,EAAE,oCAAoC,CAAA;IAClD,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,yBAAyB,CAAA;IAC/B,aAAa,EAAE,CAAC,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;IAC9F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,yBAAyB,KAAK,SAAS,CAAA;CACpF,CAAA;AAED,MAAM,MAAM,oCAAoC,GAAG;IACjD,WAAW,CAAC,EAAE,mCAAmC,CAAA;IACjD,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,wBAAwB,CAAA;IAC9B,aAAa,EAAE,CACb,IAAI,EAAE,iCAAiC,EACvC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KACjC,IAAI,CAAA;IACT,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,iCAAiC,KAAK,SAAS,CAAA;CAC5F,CAAA;AAED,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,yBAAyB,GAC9B,yBAAyB,CAK3B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,wBAAwB,GAC7B,iCAAiC,CAEnC;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,wBAAwB,GAC7B,iCAAiC,CAOnC;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,WAAW,EACX,OAAO,EACP,QAAgB,EAChB,IAAI,EACJ,aAAa,EACb,YAAY,GACb,EAAE,qCAAqC,+SAkBvC;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,WAAW,EACX,OAAO,EACP,QAAgB,EAChB,IAAI,EACJ,aAAa,EACb,YAAY,GACb,EAAE,oCAAoC,+SAmBtC"}
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export function resolveNextSpatialWorkspaceLevelMode(mode) {
4
+ if (mode === 'manual')
5
+ return 'stacked';
6
+ if (mode === 'stacked')
7
+ return 'exploded';
8
+ if (mode === 'exploded')
9
+ return 'stacked';
10
+ return 'stacked';
11
+ }
12
+ export function normalizeSpatialWorkspaceWallMode(mode) {
13
+ return mode === 'translucent' ? 'cutaway' : mode;
14
+ }
15
+ export function resolveNextSpatialWorkspaceWallMode(mode) {
16
+ if (mode === 'translucent')
17
+ return 'cutaway';
18
+ const canonicalMode = normalizeSpatialWorkspaceWallMode(mode);
19
+ if (canonicalMode === 'cutaway')
20
+ return 'up';
21
+ if (canonicalMode === 'up')
22
+ return 'down';
23
+ if (canonicalMode === 'down')
24
+ return 'flat';
25
+ return 'cutaway';
26
+ }
27
+ export function SpatialWorkspaceLevelModeControl({ buttonProps, content, disabled = false, mode, onModeRequest, renderButton, }) {
28
+ const button = (_jsx("button", { ...buttonProps, "aria-disabled": disabled, "data-pascal-spatial-workspace-level-mode": mode, "data-pascal-spatial-workspace-level-mode-control": "", onClick: (event) => {
29
+ if (disabled)
30
+ return;
31
+ onModeRequest(resolveNextSpatialWorkspaceLevelMode(mode), event);
32
+ }, type: "button", children: content }));
33
+ return renderButton ? renderButton(button, mode) : button;
34
+ }
35
+ export function SpatialWorkspaceWallModeControl({ buttonProps, content, disabled = false, mode, onModeRequest, renderButton, }) {
36
+ const canonicalMode = normalizeSpatialWorkspaceWallMode(mode);
37
+ const button = (_jsx("button", { ...buttonProps, "aria-disabled": disabled, "data-pascal-spatial-workspace-wall-mode": canonicalMode, "data-pascal-spatial-workspace-wall-mode-control": "", onClick: (event) => {
38
+ if (disabled)
39
+ return;
40
+ onModeRequest(resolveNextSpatialWorkspaceWallMode(mode), event);
41
+ }, type: "button", children: content }));
42
+ return renderButton ? renderButton(button, canonicalMode) : button;
43
+ }
@@ -0,0 +1,11 @@
1
+ import type { SpatialWorkspaceViewMode } from './spatial-workspace-viewport';
2
+ export type SpatialWorkspaceKind = 'building' | 'site';
3
+ export type SpatialWorkspaceViewPlan = {
4
+ cameraAction: 'set-top-view' | null;
5
+ disabled: boolean;
6
+ nextSiteTopViewActive: boolean;
7
+ viewMode: SpatialWorkspaceViewMode;
8
+ };
9
+ export declare function isBuildingSpatialWorkspace(workspaceKind: SpatialWorkspaceKind): workspaceKind is 'building';
10
+ export declare function resolveSpatialWorkspaceViewPlan(requestedMode: SpatialWorkspaceViewMode, workspaceKind: SpatialWorkspaceKind, siteTopViewActive: boolean): SpatialWorkspaceViewPlan;
11
+ //# sourceMappingURL=spatial-workspace-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-workspace-mode.d.ts","sourceRoot":"","sources":["../src/spatial-workspace-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAE5E,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,MAAM,CAAA;AAEtD,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAA;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,QAAQ,EAAE,wBAAwB,CAAA;CACnC,CAAA;AAED,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,oBAAoB,GAClC,aAAa,IAAI,UAAU,CAE7B;AAED,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,wBAAwB,EACvC,aAAa,EAAE,oBAAoB,EACnC,iBAAiB,EAAE,OAAO,GACzB,wBAAwB,CA2B1B"}