@ubuilder-ai/workspace 0.1.0-alpha.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.
- package/README.md +7 -0
- package/dist/floorplan-annotation-obstacles.d.ts +4 -0
- package/dist/floorplan-annotation-obstacles.d.ts.map +1 -0
- package/dist/floorplan-annotation-obstacles.js +25 -0
- package/dist/floorplan-camera-sync.d.ts +24 -0
- package/dist/floorplan-camera-sync.d.ts.map +1 -0
- package/dist/floorplan-camera-sync.js +187 -0
- package/dist/floorplan-coordinates.d.ts +10 -0
- package/dist/floorplan-coordinates.d.ts.map +1 -0
- package/dist/floorplan-coordinates.js +25 -0
- package/dist/floorplan-dimension-renderer.d.ts +42 -0
- package/dist/floorplan-dimension-renderer.d.ts.map +1 -0
- package/dist/floorplan-dimension-renderer.js +245 -0
- package/dist/floorplan-geometry-renderer.d.ts +56 -0
- package/dist/floorplan-geometry-renderer.d.ts.map +1 -0
- package/dist/floorplan-geometry-renderer.js +319 -0
- package/dist/floorplan-initial-view.d.ts +29 -0
- package/dist/floorplan-initial-view.d.ts.map +1 -0
- package/dist/floorplan-initial-view.js +30 -0
- package/dist/floorplan-label-angle.d.ts +24 -0
- package/dist/floorplan-label-angle.d.ts.map +1 -0
- package/dist/floorplan-label-angle.js +60 -0
- package/dist/floorplan-navigation-presentation.d.ts +57 -0
- package/dist/floorplan-navigation-presentation.d.ts.map +1 -0
- package/dist/floorplan-navigation-presentation.js +81 -0
- package/dist/floorplan-navigation-shell.d.ts +87 -0
- package/dist/floorplan-navigation-shell.d.ts.map +1 -0
- package/dist/floorplan-navigation-shell.js +1178 -0
- package/dist/floorplan-navigation-types.d.ts +10 -0
- package/dist/floorplan-navigation-types.d.ts.map +1 -0
- package/dist/floorplan-navigation-types.js +1 -0
- package/dist/floorplan-registry-projection.d.ts +84 -0
- package/dist/floorplan-registry-projection.d.ts.map +1 -0
- package/dist/floorplan-registry-projection.js +260 -0
- package/dist/floorplan-render-context.d.ts +56 -0
- package/dist/floorplan-render-context.d.ts.map +1 -0
- package/dist/floorplan-render-context.js +75 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/spatial-workspace-camera-action-control.d.ts +18 -0
- package/dist/spatial-workspace-camera-action-control.d.ts.map +1 -0
- package/dist/spatial-workspace-camera-action-control.js +13 -0
- package/dist/spatial-workspace-display-control.d.ts +64 -0
- package/dist/spatial-workspace-display-control.d.ts.map +1 -0
- package/dist/spatial-workspace-display-control.js +81 -0
- package/dist/spatial-workspace-gis-control.d.ts +58 -0
- package/dist/spatial-workspace-gis-control.d.ts.map +1 -0
- package/dist/spatial-workspace-gis-control.js +38 -0
- package/dist/spatial-workspace-instance.d.ts +2 -0
- package/dist/spatial-workspace-instance.d.ts.map +1 -0
- package/dist/spatial-workspace-instance.js +14 -0
- package/dist/spatial-workspace-level-selector.d.ts +21 -0
- package/dist/spatial-workspace-level-selector.d.ts.map +1 -0
- package/dist/spatial-workspace-level-selector.js +11 -0
- package/dist/spatial-workspace-level-wall-control.d.ts +38 -0
- package/dist/spatial-workspace-level-wall-control.d.ts.map +1 -0
- package/dist/spatial-workspace-level-wall-control.js +41 -0
- package/dist/spatial-workspace-mode.d.ts +11 -0
- package/dist/spatial-workspace-mode.d.ts.map +1 -0
- package/dist/spatial-workspace-mode.js +29 -0
- package/dist/spatial-workspace-styles.d.ts +3 -0
- package/dist/spatial-workspace-styles.d.ts.map +1 -0
- package/dist/spatial-workspace-styles.js +72 -0
- package/dist/spatial-workspace-view-mode-control.d.ts +19 -0
- package/dist/spatial-workspace-view-mode-control.d.ts.map +1 -0
- package/dist/spatial-workspace-view-mode-control.js +14 -0
- package/dist/spatial-workspace-viewport.d.ts +25 -0
- package/dist/spatial-workspace-viewport.d.ts.map +1 -0
- package/dist/spatial-workspace-viewport.js +75 -0
- package/package.json +47 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export function setFloorplanCompassRotation(compass, rotationDeg) {
|
|
2
|
+
if (compass) {
|
|
3
|
+
compass.style.transform = `rotate(${rotationDeg}deg)`;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export function queueFloorplanRotationPresentationRestore(pending, presentation) {
|
|
7
|
+
pending.current = presentation;
|
|
8
|
+
}
|
|
9
|
+
export function flushFloorplanRotationPresentationRestore(pending) {
|
|
10
|
+
const presentation = pending.current;
|
|
11
|
+
if (!presentation)
|
|
12
|
+
return;
|
|
13
|
+
presentation.svg.style.transform = presentation.svgStyle.transform;
|
|
14
|
+
presentation.svg.style.transformOrigin = presentation.svgStyle.transformOrigin;
|
|
15
|
+
presentation.svg.style.willChange = presentation.svgStyle.willChange;
|
|
16
|
+
pending.current = null;
|
|
17
|
+
}
|
|
18
|
+
export function getFloorplanRotationOverscanViewBox(viewBox) {
|
|
19
|
+
const size = Math.hypot(viewBox.width, viewBox.height);
|
|
20
|
+
const centerX = viewBox.minX + viewBox.width / 2;
|
|
21
|
+
const centerY = viewBox.minY + viewBox.height / 2;
|
|
22
|
+
return {
|
|
23
|
+
minX: centerX - size / 2,
|
|
24
|
+
minY: centerY - size / 2,
|
|
25
|
+
width: size,
|
|
26
|
+
height: size,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function resolveFloorplanPresentationViewBox(reactViewBox, imperativeViewBox, interactionInProgress) {
|
|
30
|
+
return interactionInProgress && imperativeViewBox ? imperativeViewBox : reactViewBox;
|
|
31
|
+
}
|
|
32
|
+
export function canZoomFloorplanDuringNavigation(rotationInProgress) {
|
|
33
|
+
return !rotationInProgress;
|
|
34
|
+
}
|
|
35
|
+
export function canApplyFloorplanNavigationSync(interactionInProgress) {
|
|
36
|
+
return !interactionInProgress;
|
|
37
|
+
}
|
|
38
|
+
export function createFloorplanNavigationSyncScheduler({ applyPresentation, commit, settleMs = 120, schedule = globalThis.setTimeout, cancel = globalThis.clearTimeout, }) {
|
|
39
|
+
let latestPose = null;
|
|
40
|
+
let settleTimer = null;
|
|
41
|
+
const clearSettleTimer = () => {
|
|
42
|
+
if (settleTimer === null)
|
|
43
|
+
return;
|
|
44
|
+
cancel(settleTimer);
|
|
45
|
+
settleTimer = null;
|
|
46
|
+
};
|
|
47
|
+
const flush = () => {
|
|
48
|
+
clearSettleTimer();
|
|
49
|
+
if (latestPose === null)
|
|
50
|
+
return;
|
|
51
|
+
const pose = latestPose;
|
|
52
|
+
latestPose = null;
|
|
53
|
+
commit(pose);
|
|
54
|
+
};
|
|
55
|
+
const update = (pose) => {
|
|
56
|
+
latestPose = pose;
|
|
57
|
+
applyPresentation(pose);
|
|
58
|
+
clearSettleTimer();
|
|
59
|
+
settleTimer = schedule(() => {
|
|
60
|
+
settleTimer = null;
|
|
61
|
+
if (latestPose === null)
|
|
62
|
+
return;
|
|
63
|
+
const settledPose = latestPose;
|
|
64
|
+
latestPose = null;
|
|
65
|
+
commit(settledPose);
|
|
66
|
+
}, settleMs);
|
|
67
|
+
};
|
|
68
|
+
const discard = () => {
|
|
69
|
+
clearSettleTimer();
|
|
70
|
+
latestPose = null;
|
|
71
|
+
};
|
|
72
|
+
return { update, flush, discard };
|
|
73
|
+
}
|
|
74
|
+
export function finalizeFloorplanNavigation({ zoomPending, panActive, rotationState, commitZoom, commitPan, commitRotation, }) {
|
|
75
|
+
if (zoomPending)
|
|
76
|
+
commitZoom();
|
|
77
|
+
if (panActive)
|
|
78
|
+
commitPan();
|
|
79
|
+
if (rotationState)
|
|
80
|
+
commitRotation(rotationState);
|
|
81
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ReactElement, type MouseEvent as ReactMouseEvent, type ReactNode, type PointerEvent as ReactPointerEvent, type RefObject } from 'react';
|
|
2
|
+
import { type FloorplanPoint } from './floorplan-coordinates';
|
|
3
|
+
import { type FloorplanPresentationViewBox } from './floorplan-navigation-presentation';
|
|
4
|
+
import type { FloorplanNavigationPose, FloorplanNavigationPoseInput } from './floorplan-navigation-types';
|
|
5
|
+
export type FloorplanViewport = {
|
|
6
|
+
centerX: number;
|
|
7
|
+
centerY: number;
|
|
8
|
+
width: number;
|
|
9
|
+
};
|
|
10
|
+
type FloorplanNavigationNativeEventHandlers = {
|
|
11
|
+
wheel: EventListener;
|
|
12
|
+
gesturestart: EventListener;
|
|
13
|
+
gesturechange: EventListener;
|
|
14
|
+
gestureend: EventListener;
|
|
15
|
+
};
|
|
16
|
+
export declare const __testFloorplanNavigationNativeEvents: {
|
|
17
|
+
register(svg: Pick<SVGSVGElement, "addEventListener" | "removeEventListener">, handlers: FloorplanNavigationNativeEventHandlers): () => void;
|
|
18
|
+
};
|
|
19
|
+
export declare function rotateFloorplanPoint(point: FloorplanPoint, rotationDegrees: number): FloorplanPoint;
|
|
20
|
+
export type UseFloorplanNavigationOptions = {
|
|
21
|
+
active: boolean;
|
|
22
|
+
activationAzimuth: number | null;
|
|
23
|
+
baselineRotationDeg: number;
|
|
24
|
+
contentKey: string | null;
|
|
25
|
+
fitPoints: readonly FloorplanPoint[];
|
|
26
|
+
fitSuspended: () => boolean;
|
|
27
|
+
hasContent: boolean;
|
|
28
|
+
initialNavigationPose: FloorplanNavigationPose | null;
|
|
29
|
+
onNavigationStart?: () => void;
|
|
30
|
+
planeWorldY: number;
|
|
31
|
+
publishContinuously: () => boolean;
|
|
32
|
+
publishNavigationPose: (pose: FloorplanNavigationPoseInput) => void;
|
|
33
|
+
subscribeNavigationPose: (listener: (pose: FloorplanNavigationPose) => void) => () => void;
|
|
34
|
+
worldOrigin: readonly [number, number, number];
|
|
35
|
+
worldRotationY: number;
|
|
36
|
+
};
|
|
37
|
+
export type FloorplanNavigationController = {
|
|
38
|
+
active: boolean;
|
|
39
|
+
alignToNorth: () => void;
|
|
40
|
+
averageUnitsPerPixel: number;
|
|
41
|
+
backgroundRef: RefObject<SVGRectElement | null>;
|
|
42
|
+
compassNeedleRef: RefObject<SVGSVGElement | null>;
|
|
43
|
+
contentRef: RefObject<SVGGElement | null>;
|
|
44
|
+
floorplanUserRotationDeg: number;
|
|
45
|
+
getLiveUnitsPerPixel: () => number;
|
|
46
|
+
getScenePointFromClientPoint: (clientX: number, clientY: number) => FloorplanPoint | null;
|
|
47
|
+
getSceneRotationDeg: () => number;
|
|
48
|
+
handlePointerDownCapture: (event: ReactPointerEvent<SVGSVGElement>) => void;
|
|
49
|
+
handlePointerMove: (event: ReactPointerEvent<SVGSVGElement>) => boolean;
|
|
50
|
+
isNavigating: boolean;
|
|
51
|
+
navigationCursor: string | null;
|
|
52
|
+
navigationOverlayVisible: boolean;
|
|
53
|
+
paintViewBox: FloorplanPresentationViewBox;
|
|
54
|
+
presentationPaintViewBox: FloorplanPresentationViewBox;
|
|
55
|
+
presentationViewBox: FloorplanPresentationViewBox;
|
|
56
|
+
sceneRef: RefObject<SVGGElement | null>;
|
|
57
|
+
sceneRotationDeg: number;
|
|
58
|
+
consumeSuppressedClick: () => boolean;
|
|
59
|
+
surfaceSize: {
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
|
+
};
|
|
63
|
+
svgRef: RefObject<SVGSVGElement | null>;
|
|
64
|
+
unitsPerPixel: number;
|
|
65
|
+
viewBox: FloorplanPresentationViewBox;
|
|
66
|
+
viewportHostRef: RefObject<HTMLDivElement | null>;
|
|
67
|
+
endPointerNavigation: (event?: ReactPointerEvent<SVGSVGElement>) => void;
|
|
68
|
+
};
|
|
69
|
+
export declare function useFloorplanNavigation({ active, activationAzimuth, baselineRotationDeg, contentKey, fitPoints, fitSuspended, hasContent, initialNavigationPose, onNavigationStart, planeWorldY, publishContinuously, publishNavigationPose, subscribeNavigationPose, worldOrigin, worldRotationY, }: UseFloorplanNavigationOptions): FloorplanNavigationController;
|
|
70
|
+
export interface FloorplanNavigationShellProps extends Omit<ComponentPropsWithoutRef<'svg'>, 'children' | 'onClick' | 'onPointerCancel' | 'onPointerDownCapture' | 'onPointerMove' | 'onPointerUp' | 'ref' | 'viewBox'> {
|
|
71
|
+
active: boolean;
|
|
72
|
+
available: boolean;
|
|
73
|
+
backgroundFill: string;
|
|
74
|
+
children?: ReactNode;
|
|
75
|
+
compassHost?: HTMLElement | null;
|
|
76
|
+
compassLabel: string;
|
|
77
|
+
definitions?: ReactNode;
|
|
78
|
+
emptyState?: ReactNode;
|
|
79
|
+
navigation: FloorplanNavigationController;
|
|
80
|
+
onClick?: (event: ReactMouseEvent<SVGSVGElement>) => void;
|
|
81
|
+
onPointerMove?: (event: ReactPointerEvent<SVGSVGElement>) => void;
|
|
82
|
+
overlays?: ReactNode;
|
|
83
|
+
renderCompassTooltip?: (button: ReactElement, label: string) => ReactNode;
|
|
84
|
+
}
|
|
85
|
+
export declare function FloorplanNavigationShell({ active, available, backgroundFill, children, compassHost, compassLabel, definitions, emptyState, navigation, onClick, onPointerMove, overlays, renderCompassTooltip, style, ...svgProps }: FloorplanNavigationShellProps): import("react").JSX.Element;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=floorplan-navigation-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floorplan-navigation-shell.d.ts","sourceRoot":"","sources":["../src/floorplan-navigation-shell.tsx"],"names":[],"mappings":"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"}
|