@pascal-app/viewer 1.1.0 → 1.1.2
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 +157 -0
- package/dist/components/viewer/drone-controller.d.ts.map +1 -1
- package/dist/components/viewer/drone-controller.js +1 -5
- package/dist/components/viewer/first-person/build-collider-world.d.ts +14 -0
- package/dist/components/viewer/first-person/build-collider-world.d.ts.map +1 -0
- package/dist/components/viewer/first-person/build-collider-world.js +426 -0
- package/dist/components/viewer/first-person/ground-holes.d.ts +22 -0
- package/dist/components/viewer/first-person/ground-holes.d.ts.map +1 -0
- package/dist/components/viewer/first-person/ground-holes.js +116 -0
- package/dist/components/viewer/first-person/mechanism-targets.d.ts +27 -0
- package/dist/components/viewer/first-person/mechanism-targets.d.ts.map +1 -0
- package/dist/components/viewer/first-person/mechanism-targets.js +79 -0
- package/dist/components/viewer/first-person/terrain-collider.d.ts +32 -0
- package/dist/components/viewer/first-person/terrain-collider.d.ts.map +1 -0
- package/dist/components/viewer/first-person/terrain-collider.js +175 -0
- package/dist/components/viewer/glb-walkthrough-controller.d.ts +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.d.ts.map +1 -1
- package/dist/components/viewer/glb-walkthrough-controller.js +3 -4
- package/dist/components/viewer/live-walkthrough-controller.d.ts +17 -0
- package/dist/components/viewer/live-walkthrough-controller.d.ts.map +1 -0
- package/dist/components/viewer/live-walkthrough-controller.js +1449 -0
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +22 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/lib/daylight/room-map.d.ts +29 -4
- package/dist/lib/daylight/room-map.d.ts.map +1 -1
- package/dist/lib/daylight/room-map.js +219 -36
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +9 -3
- package/dist/lib/daylight/rooms.d.ts +15 -6
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +49 -9
- package/dist/lib/measurement-presentation.d.ts +2 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -1
- package/dist/lib/measurement-presentation.js +6 -0
- package/dist/lib/typing-target.d.ts +2 -0
- package/dist/lib/typing-target.d.ts.map +1 -0
- package/dist/lib/typing-target.js +7 -0
- package/dist/lib/viewer-config.d.ts +6 -0
- package/dist/lib/viewer-config.d.ts.map +1 -1
- package/dist/lib/viewer-config.js +2 -0
- package/dist/sfx/audio-settings.d.ts +81 -0
- package/dist/sfx/audio-settings.d.ts.map +1 -0
- package/dist/sfx/audio-settings.js +166 -0
- package/dist/sfx/index.d.ts +6 -0
- package/dist/sfx/index.d.ts.map +1 -0
- package/dist/sfx/index.js +5 -0
- package/dist/sfx/interaction-sounds.d.ts +7 -0
- package/dist/sfx/interaction-sounds.d.ts.map +1 -0
- package/dist/sfx/interaction-sounds.js +39 -0
- package/dist/sfx/player.d.ts +31 -0
- package/dist/sfx/player.d.ts.map +1 -0
- package/dist/sfx/player.js +255 -0
- package/dist/sfx/sounds.d.ts +60 -0
- package/dist/sfx/sounds.d.ts.map +1 -0
- package/dist/sfx/sounds.js +25 -0
- package/dist/sfx/use-viewer-ui-sounds.d.ts +8 -0
- package/dist/sfx/use-viewer-ui-sounds.d.ts.map +1 -0
- package/dist/sfx/use-viewer-ui-sounds.js +42 -0
- package/dist/store/use-first-person-hud.d.ts +13 -0
- package/dist/store/use-first-person-hud.d.ts.map +1 -0
- package/dist/store/use-first-person-hud.js +21 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +27 -13
- package/dist/ui/components/action-button.d.ts +14 -0
- package/dist/ui/components/action-button.d.ts.map +1 -0
- package/dist/ui/components/action-button.js +21 -0
- package/dist/ui/components/action-menu-placement.d.ts +7 -0
- package/dist/ui/components/action-menu-placement.d.ts.map +1 -0
- package/dist/ui/components/action-menu-placement.js +10 -0
- package/dist/ui/components/floorplan-compass-button.d.ts +10 -0
- package/dist/ui/components/floorplan-compass-button.d.ts.map +1 -0
- package/dist/ui/components/floorplan-compass-button.js +22 -0
- package/dist/ui/components/follow-pascal-toggle.d.ts +6 -0
- package/dist/ui/components/follow-pascal-toggle.d.ts.map +1 -0
- package/dist/ui/components/follow-pascal-toggle.js +21 -0
- package/dist/ui/components/localized-html.d.ts +9 -0
- package/dist/ui/components/localized-html.d.ts.map +1 -0
- package/dist/ui/components/localized-html.js +16 -0
- package/dist/ui/components/render-settings-menu.d.ts +9 -0
- package/dist/ui/components/render-settings-menu.d.ts.map +1 -0
- package/dist/ui/components/render-settings-menu.js +145 -0
- package/dist/ui/components/rooms/room-highlight.d.ts +10 -0
- package/dist/ui/components/rooms/room-highlight.d.ts.map +1 -0
- package/dist/ui/components/rooms/room-highlight.js +56 -0
- package/dist/ui/components/rooms/room-labels.d.ts +278 -0
- package/dist/ui/components/rooms/room-labels.d.ts.map +1 -0
- package/dist/ui/components/rooms/room-labels.js +1295 -0
- package/dist/ui/components/rooms/viewer-rooms.d.ts +14 -0
- package/dist/ui/components/rooms/viewer-rooms.d.ts.map +1 -0
- package/dist/ui/components/rooms/viewer-rooms.js +123 -0
- package/dist/ui/components/scene-loader.d.ts +18 -0
- package/dist/ui/components/scene-loader.d.ts.map +1 -0
- package/dist/ui/components/scene-loader.js +29 -0
- package/dist/ui/components/sky-control.d.ts +37 -0
- package/dist/ui/components/sky-control.d.ts.map +1 -0
- package/dist/ui/components/sky-control.js +382 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.d.ts +4 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.d.ts.map +1 -0
- package/dist/ui/components/use-viewer-camera-navigation-sync.js +117 -0
- package/dist/ui/components/viewer-controls-bar.d.ts +20 -0
- package/dist/ui/components/viewer-controls-bar.d.ts.map +1 -0
- package/dist/ui/components/viewer-controls-bar.js +130 -0
- package/dist/ui/components/viewer-hover-label.d.ts +14 -0
- package/dist/ui/components/viewer-hover-label.d.ts.map +1 -0
- package/dist/ui/components/viewer-hover-label.js +28 -0
- package/dist/ui/components/viewer-scene-header.d.ts +34 -0
- package/dist/ui/components/viewer-scene-header.d.ts.map +1 -0
- package/dist/ui/components/viewer-scene-header.js +92 -0
- package/dist/ui/components/viewer-selection-manager.d.ts +7 -0
- package/dist/ui/components/viewer-selection-manager.d.ts.map +1 -0
- package/dist/ui/components/viewer-selection-manager.js +116 -0
- package/dist/ui/components/viewer-stage-modes.d.ts +7 -0
- package/dist/ui/components/viewer-stage-modes.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage-modes.js +42 -0
- package/dist/ui/components/viewer-stage-switcher.d.ts +10 -0
- package/dist/ui/components/viewer-stage-switcher.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage-switcher.js +16 -0
- package/dist/ui/components/viewer-stage.d.ts +25 -0
- package/dist/ui/components/viewer-stage.d.ts.map +1 -0
- package/dist/ui/components/viewer-stage.js +107 -0
- package/dist/ui/components/walkthrough-hud.d.ts +29 -0
- package/dist/ui/components/walkthrough-hud.d.ts.map +1 -0
- package/dist/ui/components/walkthrough-hud.js +55 -0
- package/dist/ui/floorplan/floorplan-camera-sync.d.ts +22 -0
- package/dist/ui/floorplan/floorplan-camera-sync.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-camera-sync.js +157 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.d.ts +61 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-dimension-renderer.js +280 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.d.ts +54 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-geometry-renderer.js +317 -0
- package/dist/ui/floorplan/floorplan-label-angle.d.ts +24 -0
- package/dist/ui/floorplan/floorplan-label-angle.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-label-angle.js +60 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.d.ts +18 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-navigation-sync.js +41 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.d.ts +26 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-geometry.js +173 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.d.ts +22 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-navigation.js +41 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.d.ts +8 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview-visibility.js +21 -0
- package/dist/ui/floorplan/floorplan-preview.d.ts +19 -0
- package/dist/ui/floorplan/floorplan-preview.d.ts.map +1 -0
- package/dist/ui/floorplan/floorplan-preview.js +700 -0
- package/dist/ui/hooks/use-mobile.d.ts +2 -0
- package/dist/ui/hooks/use-mobile.d.ts.map +1 -0
- package/dist/ui/hooks/use-mobile.js +14 -0
- package/dist/ui/index.d.ts +49 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +48 -0
- package/dist/ui/lib/below-grade.d.ts +38 -0
- package/dist/ui/lib/below-grade.d.ts.map +1 -0
- package/dist/ui/lib/below-grade.js +102 -0
- package/dist/ui/lib/camera-pose.d.ts +19 -0
- package/dist/ui/lib/camera-pose.d.ts.map +1 -0
- package/dist/ui/lib/camera-pose.js +113 -0
- package/dist/ui/lib/cn.d.ts +3 -0
- package/dist/ui/lib/cn.d.ts.map +1 -0
- package/dist/ui/lib/cn.js +5 -0
- package/dist/ui/lib/level-name.d.ts +10 -0
- package/dist/ui/lib/level-name.d.ts.map +1 -0
- package/dist/ui/lib/level-name.js +33 -0
- package/dist/ui/lib/node-display-label.d.ts +8 -0
- package/dist/ui/lib/node-display-label.d.ts.map +1 -0
- package/dist/ui/lib/node-display-label.js +36 -0
- package/dist/ui/lib/room-area.d.ts +3 -0
- package/dist/ui/lib/room-area.d.ts.map +1 -0
- package/dist/ui/lib/room-area.js +8 -0
- package/dist/ui/lib/room-assembly-overlay.d.ts +46 -0
- package/dist/ui/lib/room-assembly-overlay.d.ts.map +1 -0
- package/dist/ui/lib/room-assembly-overlay.js +222 -0
- package/dist/ui/lib/room-name-messages.d.ts +28 -0
- package/dist/ui/lib/room-name-messages.d.ts.map +1 -0
- package/dist/ui/lib/room-name-messages.js +112 -0
- package/dist/ui/lib/room-selection.d.ts +58 -0
- package/dist/ui/lib/room-selection.d.ts.map +1 -0
- package/dist/ui/lib/room-selection.js +297 -0
- package/dist/ui/lib/scene-theme-name.d.ts +4 -0
- package/dist/ui/lib/scene-theme-name.d.ts.map +1 -0
- package/dist/ui/lib/scene-theme-name.js +22 -0
- package/dist/ui/lib/selection-modifiers.d.ts +20 -0
- package/dist/ui/lib/selection-modifiers.d.ts.map +1 -0
- package/dist/ui/lib/selection-modifiers.js +15 -0
- package/dist/ui/lib/viewer-selection.d.ts +132 -0
- package/dist/ui/lib/viewer-selection.d.ts.map +1 -0
- package/dist/ui/lib/viewer-selection.js +462 -0
- package/dist/ui/lib/zone-content.d.ts +6 -0
- package/dist/ui/lib/zone-content.d.ts.map +1 -0
- package/dist/ui/lib/zone-content.js +96 -0
- package/dist/ui/primitives/button.d.ts +11 -0
- package/dist/ui/primitives/button.d.ts.map +1 -0
- package/dist/ui/primitives/button.js +35 -0
- package/dist/ui/primitives/dropdown-menu.d.ts +26 -0
- package/dist/ui/primitives/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/primitives/dropdown-menu.js +53 -0
- package/dist/ui/primitives/popover.d.ts +8 -0
- package/dist/ui/primitives/popover.d.ts.map +1 -0
- package/dist/ui/primitives/popover.js +17 -0
- package/dist/ui/primitives/switch.d.ts +5 -0
- package/dist/ui/primitives/switch.d.ts.map +1 -0
- package/dist/ui/primitives/switch.js +8 -0
- package/dist/ui/primitives/tooltip.d.ts +8 -0
- package/dist/ui/primitives/tooltip.d.ts.map +1 -0
- package/dist/ui/primitives/tooltip.js +17 -0
- package/dist/ui/store/camera-pose-store.d.ts +17 -0
- package/dist/ui/store/camera-pose-store.d.ts.map +1 -0
- package/dist/ui/store/camera-pose-store.js +15 -0
- package/dist/ui/store/navigation-sync-pose-store.d.ts +26 -0
- package/dist/ui/store/navigation-sync-pose-store.d.ts.map +1 -0
- package/dist/ui/store/navigation-sync-pose-store.js +16 -0
- package/dist/ui/store/use-follow-pascal.d.ts +30 -0
- package/dist/ui/store/use-follow-pascal.d.ts.map +1 -0
- package/dist/ui/store/use-follow-pascal.js +28 -0
- package/dist/ui/theme.css +339 -0
- package/package.json +34 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mobile.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/use-mobile.ts"],"names":[],"mappings":"AAgBA,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
const MOBILE_BREAKPOINT = 768;
|
|
3
|
+
const subscribe = (callback) => {
|
|
4
|
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
|
5
|
+
mql.addEventListener('change', callback);
|
|
6
|
+
return () => mql.removeEventListener('change', callback);
|
|
7
|
+
};
|
|
8
|
+
const getClientSnapshot = () => window.innerWidth < MOBILE_BREAKPOINT;
|
|
9
|
+
// Server can't know the viewport — assume desktop. React's useSyncExternalStore
|
|
10
|
+
// reconciles the SSR / client snapshots without a hydration mismatch warning.
|
|
11
|
+
const getServerSnapshot = () => false;
|
|
12
|
+
export function useIsMobile() {
|
|
13
|
+
return React.useSyncExternalStore(subscribe, getClientSnapshot, getServerSnapshot);
|
|
14
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export { type FirstPersonHudState, useFirstPersonHud, type WalkthroughInteract, } from '../store/use-first-person-hud';
|
|
2
|
+
export { ActionButton } from './components/action-button';
|
|
3
|
+
export { type ActionMenuPlacement, ActionMenuPlacementProvider, useActionMenuPopupSide, } from './components/action-menu-placement';
|
|
4
|
+
export { FloorplanCompassButton, type FloorplanCompassButtonProps, } from './components/floorplan-compass-button';
|
|
5
|
+
export { FollowPascalToggle } from './components/follow-pascal-toggle';
|
|
6
|
+
export { LocalizedHtml } from './components/localized-html';
|
|
7
|
+
export { DaylightMenu, EdgesToggleItem, QualityMenu } from './components/render-settings-menu';
|
|
8
|
+
export { RoomAssemblyMesh } from './components/rooms/room-highlight';
|
|
9
|
+
export { RoomLabelAnchor3D, type RoomLabelEntry, type RoomLabelSelection, RoomPillChip, RoomPillDetail, RoomPillsLayer2D, RoomPillsLayer3D, roomLabelEntries, roomLabelsVisible, useFadePresence, } from './components/rooms/room-labels';
|
|
10
|
+
export { ParametricViewerRooms, ViewerRooms } from './components/rooms/viewer-rooms';
|
|
11
|
+
export { SceneLoader, SceneLoadFailed } from './components/scene-loader';
|
|
12
|
+
export { openSkyPanel, SKY_DOCK_HEIGHT, SkyControl, useSkyPanel } from './components/sky-control';
|
|
13
|
+
export { useViewerCameraNavigationSync } from './components/use-viewer-camera-navigation-sync';
|
|
14
|
+
export { ViewerControlsBar, type ViewerControlsBarProps } from './components/viewer-controls-bar';
|
|
15
|
+
export { ViewerHoverLabel, viewerHoverLabel } from './components/viewer-hover-label';
|
|
16
|
+
export { type ViewerLinkProps, ViewerSceneHeader, type ViewerSceneHeaderProps, } from './components/viewer-scene-header';
|
|
17
|
+
export { ViewerSelectionManager } from './components/viewer-selection-manager';
|
|
18
|
+
export { ViewerStage, type ViewerStageProps } from './components/viewer-stage';
|
|
19
|
+
export { normalizeViewerStageModes, resolveMobileViewerStageMode, resolveViewerStageMode, VIEWER_STAGE_MODES, type ViewerStageMode, viewerStageIncludes3D, } from './components/viewer-stage-modes';
|
|
20
|
+
export { ViewerStageSwitcher, type ViewerStageSwitcherProps, } from './components/viewer-stage-switcher';
|
|
21
|
+
export { DroneHud, WalkthroughCrosshair, type WalkthroughHint, WalkthroughHud, type WalkthroughHudProps, } from './components/walkthrough-hud';
|
|
22
|
+
export { subscribeFloorplanCameraNavigation, useFloorplanCameraSyncBridge, } from './floorplan/floorplan-camera-sync';
|
|
23
|
+
export { type ArchitecturalDimensionLayout, computeArchitecturalDimensionLayout, FloorplanDimensionHitsProvider, FloorplanDimensionRenderer, } from './floorplan/floorplan-dimension-renderer';
|
|
24
|
+
export { documentCircleGeometryAttrs, documentRectGeometryAttrs, FloorplanGeometryRenderer, resolveDocumentAnnotationGroupChildren, } from './floorplan/floorplan-geometry-renderer';
|
|
25
|
+
export { resolveFloorplanAnnotationUpdate, resolveFloorplanLabelAngle, updateSvgFloorplanLabelOrientations, } from './floorplan/floorplan-label-angle';
|
|
26
|
+
export { createFloorplanNavigationSyncScheduler, type FloorplanNavigationSyncScheduler, setFloorplanCompassRotation, } from './floorplan/floorplan-navigation-sync';
|
|
27
|
+
export { FloorplanPreview, type FloorplanPreviewProps, type FloorplanPreviewScene, } from './floorplan/floorplan-preview';
|
|
28
|
+
export { useIsMobile } from './hooks/use-mobile';
|
|
29
|
+
export { belowGradeShown, followBelowGrade, followGroundWindowBox, gradeStandingShown, groundWindowBoxShown, useBelowGrade, useGroundWindowBox, } from './lib/below-grade';
|
|
30
|
+
export { type CameraPoseApplicationPlan, normalizeCameraPose, planCameraPoseApplication, publishInitialCameraPose, releaseCameraPoseEventSuppression, stepCameraPoseInterpolation, withCameraPoseDistance, } from './lib/camera-pose';
|
|
31
|
+
export { authoredLevelName, localizedLevelName } from './lib/level-name';
|
|
32
|
+
export { nodeDisplayLabel } from './lib/node-display-label';
|
|
33
|
+
export { formatRoomArea } from './lib/room-area';
|
|
34
|
+
export { type RoomAssemblyHeights, resolveRoomAssemblyHeights } from './lib/room-assembly-overlay';
|
|
35
|
+
export { type DescriptorTranslator, displayRoomName, editedRoomName, ROOM_NAME_MESSAGES, } from './lib/room-name-messages';
|
|
36
|
+
export { describeZoneOutline, type RoomKey, type RoomSelectionGeometry, RoomSelectionIndex, type RoomSelectionRecord, resolveRoomHit, sameRoom, shouldSelectRoom, } from './lib/room-selection';
|
|
37
|
+
export { sceneThemeName } from './lib/scene-theme-name';
|
|
38
|
+
export { type SelectionModifierKeys, selectionModifiersFromEvent } from './lib/selection-modifiers';
|
|
39
|
+
export { applyViewerClick, applyViewerHover, framedLookAt, frameViewerCamera, frameViewerNode, framingAnimates, resolveViewerClick, resolveViewerHover, roomOfObject, selectViewerBuilding, selectViewerLevel, selectViewerRoom, selectViewerUnit, useViewerFloorDisplay, type ViewerCrumb, type ViewerNodes, type ViewerPick, type ViewerSelection, type ViewerSidebarRow, type ViewerSidebarSection, type ViewerSource, viewerBreadcrumb, viewerPickFromNodeEvent, viewerRooms, viewerSidebarSections, zoneLabel, } from './lib/viewer-selection';
|
|
40
|
+
export { collectZoneContentIds } from './lib/zone-content';
|
|
41
|
+
export { Button, buttonVariants } from './primitives/button';
|
|
42
|
+
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from './primitives/dropdown-menu';
|
|
43
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './primitives/popover';
|
|
44
|
+
export { Switch } from './primitives/switch';
|
|
45
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './primitives/tooltip';
|
|
46
|
+
export { cameraPoseStore, publishCameraPose, subscribeCameraPose } from './store/camera-pose-store';
|
|
47
|
+
export { type NavigationSyncPose, type NavigationSyncPoseInput, type NavigationSyncSource, navigationSyncPoseStore, publishNavigationSyncPose, subscribeNavigationSyncPose, } from './store/navigation-sync-pose-store';
|
|
48
|
+
export { FOLLOW_PASCAL_STORAGE_KEY, useFollowPascal } from './store/use-follow-pascal';
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export { useFirstPersonHud, } from '../store/use-first-person-hud';
|
|
2
|
+
export { ActionButton } from './components/action-button';
|
|
3
|
+
export { ActionMenuPlacementProvider, useActionMenuPopupSide, } from './components/action-menu-placement';
|
|
4
|
+
export { FloorplanCompassButton, } from './components/floorplan-compass-button';
|
|
5
|
+
export { FollowPascalToggle } from './components/follow-pascal-toggle';
|
|
6
|
+
export { LocalizedHtml } from './components/localized-html';
|
|
7
|
+
export { DaylightMenu, EdgesToggleItem, QualityMenu } from './components/render-settings-menu';
|
|
8
|
+
export { RoomAssemblyMesh } from './components/rooms/room-highlight';
|
|
9
|
+
export { RoomLabelAnchor3D, RoomPillChip, RoomPillDetail, RoomPillsLayer2D, RoomPillsLayer3D, roomLabelEntries, roomLabelsVisible, useFadePresence, } from './components/rooms/room-labels';
|
|
10
|
+
export { ParametricViewerRooms, ViewerRooms } from './components/rooms/viewer-rooms';
|
|
11
|
+
export { SceneLoader, SceneLoadFailed } from './components/scene-loader';
|
|
12
|
+
export { openSkyPanel, SKY_DOCK_HEIGHT, SkyControl, useSkyPanel } from './components/sky-control';
|
|
13
|
+
export { useViewerCameraNavigationSync } from './components/use-viewer-camera-navigation-sync';
|
|
14
|
+
export { ViewerControlsBar } from './components/viewer-controls-bar';
|
|
15
|
+
export { ViewerHoverLabel, viewerHoverLabel } from './components/viewer-hover-label';
|
|
16
|
+
export { ViewerSceneHeader, } from './components/viewer-scene-header';
|
|
17
|
+
export { ViewerSelectionManager } from './components/viewer-selection-manager';
|
|
18
|
+
export { ViewerStage } from './components/viewer-stage';
|
|
19
|
+
export { normalizeViewerStageModes, resolveMobileViewerStageMode, resolveViewerStageMode, VIEWER_STAGE_MODES, viewerStageIncludes3D, } from './components/viewer-stage-modes';
|
|
20
|
+
export { ViewerStageSwitcher, } from './components/viewer-stage-switcher';
|
|
21
|
+
export { DroneHud, WalkthroughCrosshair, WalkthroughHud, } from './components/walkthrough-hud';
|
|
22
|
+
export { subscribeFloorplanCameraNavigation, useFloorplanCameraSyncBridge, } from './floorplan/floorplan-camera-sync';
|
|
23
|
+
export { computeArchitecturalDimensionLayout, FloorplanDimensionHitsProvider, FloorplanDimensionRenderer, } from './floorplan/floorplan-dimension-renderer';
|
|
24
|
+
export { documentCircleGeometryAttrs, documentRectGeometryAttrs, FloorplanGeometryRenderer, resolveDocumentAnnotationGroupChildren, } from './floorplan/floorplan-geometry-renderer';
|
|
25
|
+
export { resolveFloorplanAnnotationUpdate, resolveFloorplanLabelAngle, updateSvgFloorplanLabelOrientations, } from './floorplan/floorplan-label-angle';
|
|
26
|
+
export { createFloorplanNavigationSyncScheduler, setFloorplanCompassRotation, } from './floorplan/floorplan-navigation-sync';
|
|
27
|
+
export { FloorplanPreview, } from './floorplan/floorplan-preview';
|
|
28
|
+
export { useIsMobile } from './hooks/use-mobile';
|
|
29
|
+
export { belowGradeShown, followBelowGrade, followGroundWindowBox, gradeStandingShown, groundWindowBoxShown, useBelowGrade, useGroundWindowBox, } from './lib/below-grade';
|
|
30
|
+
export { normalizeCameraPose, planCameraPoseApplication, publishInitialCameraPose, releaseCameraPoseEventSuppression, stepCameraPoseInterpolation, withCameraPoseDistance, } from './lib/camera-pose';
|
|
31
|
+
export { authoredLevelName, localizedLevelName } from './lib/level-name';
|
|
32
|
+
export { nodeDisplayLabel } from './lib/node-display-label';
|
|
33
|
+
export { formatRoomArea } from './lib/room-area';
|
|
34
|
+
export { resolveRoomAssemblyHeights } from './lib/room-assembly-overlay';
|
|
35
|
+
export { displayRoomName, editedRoomName, ROOM_NAME_MESSAGES, } from './lib/room-name-messages';
|
|
36
|
+
export { describeZoneOutline, RoomSelectionIndex, resolveRoomHit, sameRoom, shouldSelectRoom, } from './lib/room-selection';
|
|
37
|
+
export { sceneThemeName } from './lib/scene-theme-name';
|
|
38
|
+
export { selectionModifiersFromEvent } from './lib/selection-modifiers';
|
|
39
|
+
export { applyViewerClick, applyViewerHover, framedLookAt, frameViewerCamera, frameViewerNode, framingAnimates, resolveViewerClick, resolveViewerHover, roomOfObject, selectViewerBuilding, selectViewerLevel, selectViewerRoom, selectViewerUnit, useViewerFloorDisplay, viewerBreadcrumb, viewerPickFromNodeEvent, viewerRooms, viewerSidebarSections, zoneLabel, } from './lib/viewer-selection';
|
|
40
|
+
export { collectZoneContentIds } from './lib/zone-content';
|
|
41
|
+
export { Button, buttonVariants } from './primitives/button';
|
|
42
|
+
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from './primitives/dropdown-menu';
|
|
43
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './primitives/popover';
|
|
44
|
+
export { Switch } from './primitives/switch';
|
|
45
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './primitives/tooltip';
|
|
46
|
+
export { cameraPoseStore, publishCameraPose, subscribeCameraPose } from './store/camera-pose-store';
|
|
47
|
+
export { navigationSyncPoseStore, publishNavigationSyncPose, subscribeNavigationSyncPose, } from './store/navigation-sync-pose-store';
|
|
48
|
+
export { FOLLOW_PASCAL_STORAGE_KEY, useFollowPascal } from './store/use-follow-pascal';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type AnyNode, type AnyNodeId, type GroundBox, type LevelGradeStanding } from '@pascal-app/core';
|
|
2
|
+
type LevelDisplay = {
|
|
3
|
+
hideLevelsAboveSelection: boolean;
|
|
4
|
+
selection: {
|
|
5
|
+
levelId: string | null;
|
|
6
|
+
buildingId?: string | null;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* The shown level's standing against the ground: the storeys above the selected level are
|
|
11
|
+
* hidden and that level's floor lies under the ground — all of it, or the part of it a
|
|
12
|
+
* hillside stands over — which is then veiled over it.
|
|
13
|
+
*/
|
|
14
|
+
export declare function gradeStandingShown(viewer: LevelDisplay, nodes: Record<AnyNodeId, AnyNode>): LevelGradeStanding;
|
|
15
|
+
/** Whether the level shown lies below grade, on all of its footprint or part of it. */
|
|
16
|
+
export declare function belowGradeShown(viewer: LevelDisplay, nodes: Record<AnyNodeId, AnyNode>): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Keeps the viewer's `belowGrade` and `gradeStanding` on the shown level while the
|
|
19
|
+
* selection, the level display and the scene change. The returned function stops, and the
|
|
20
|
+
* ground stands solid again.
|
|
21
|
+
*/
|
|
22
|
+
export declare function followBelowGrade(): () => void;
|
|
23
|
+
/** A host's level display marks a level below grade as shown while `active`. */
|
|
24
|
+
export declare function useBelowGrade(active: boolean): void;
|
|
25
|
+
/**
|
|
26
|
+
* The box the ground window opens for: the shown level while the editor's level display
|
|
27
|
+
* hides what is above it, the whole building when it stands whole (Preview).
|
|
28
|
+
*/
|
|
29
|
+
export declare function groundWindowBoxShown(viewer: LevelDisplay, nodes: Record<AnyNodeId, AnyNode>): GroundBox | null;
|
|
30
|
+
/**
|
|
31
|
+
* Keeps the viewer's `groundWindowBox` on {@link groundWindowBoxShown} while the selection,
|
|
32
|
+
* the level display and the scene change. The returned function stops, and the window closes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function followGroundWindowBox(): () => void;
|
|
35
|
+
/** The ground window follows the shown level or building while `active` (not on the site). */
|
|
36
|
+
export declare function useGroundWindowBox(active: boolean): void;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=below-grade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"below-grade.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/below-grade.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,SAAS,EACd,KAAK,kBAAkB,EAIxB,MAAM,kBAAkB,CAAA;AAIzB,KAAK,YAAY,GAAG;IAClB,wBAAwB,EAAE,OAAO,CAAA;IACjC,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAClE,CAAA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAChC,kBAAkB,CAIpB;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,IAAI,CA6B7C;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,QAE5C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAChC,SAAS,GAAG,IAAI,CAIlB;AAUD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,IAAI,CAwBlD;AAED,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,QAEjD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { buildingGroundBox, levelGradeStanding, levelGroundBox, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import useViewer from '../../store/use-viewer';
|
|
4
|
+
/**
|
|
5
|
+
* The shown level's standing against the ground: the storeys above the selected level are
|
|
6
|
+
* hidden and that level's floor lies under the ground — all of it, or the part of it a
|
|
7
|
+
* hillside stands over — which is then veiled over it.
|
|
8
|
+
*/
|
|
9
|
+
export function gradeStandingShown(viewer, nodes) {
|
|
10
|
+
const { levelId } = viewer.selection;
|
|
11
|
+
if (!viewer.hideLevelsAboveSelection || levelId === null)
|
|
12
|
+
return 'at-grade';
|
|
13
|
+
return levelGradeStanding(nodes, levelId);
|
|
14
|
+
}
|
|
15
|
+
/** Whether the level shown lies below grade, on all of its footprint or part of it. */
|
|
16
|
+
export function belowGradeShown(viewer, nodes) {
|
|
17
|
+
return gradeStandingShown(viewer, nodes) !== 'at-grade';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Keeps the viewer's `belowGrade` and `gradeStanding` on the shown level while the
|
|
21
|
+
* selection, the level display and the scene change. The returned function stops, and the
|
|
22
|
+
* ground stands solid again.
|
|
23
|
+
*/
|
|
24
|
+
export function followBelowGrade() {
|
|
25
|
+
const update = () => {
|
|
26
|
+
const gradeStanding = gradeStandingShown(useViewer.getState(), useScene.getState().nodes);
|
|
27
|
+
const viewer = useViewer.getState();
|
|
28
|
+
if (viewer.gradeStanding !== gradeStanding ||
|
|
29
|
+
viewer.belowGrade !== (gradeStanding !== 'at-grade'))
|
|
30
|
+
useViewer.setState({ gradeStanding, belowGrade: gradeStanding !== 'at-grade' });
|
|
31
|
+
};
|
|
32
|
+
update();
|
|
33
|
+
// The flag itself is watched too: the other host's level display, handing over, resets it.
|
|
34
|
+
const stopViewer = useViewer.subscribe((state, previous) => {
|
|
35
|
+
if (state.selection.levelId !== previous.selection.levelId ||
|
|
36
|
+
state.hideLevelsAboveSelection !== previous.hideLevelsAboveSelection ||
|
|
37
|
+
state.belowGrade !== previous.belowGrade ||
|
|
38
|
+
state.gradeStanding !== previous.gradeStanding)
|
|
39
|
+
update();
|
|
40
|
+
});
|
|
41
|
+
const stopScene = useScene.subscribe((state, previous) => {
|
|
42
|
+
if (state.nodes !== previous.nodes)
|
|
43
|
+
update();
|
|
44
|
+
});
|
|
45
|
+
return () => {
|
|
46
|
+
stopViewer();
|
|
47
|
+
stopScene();
|
|
48
|
+
useViewer.setState({ belowGrade: false, gradeStanding: 'at-grade' });
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** A host's level display marks a level below grade as shown while `active`. */
|
|
52
|
+
export function useBelowGrade(active) {
|
|
53
|
+
useEffect(() => (active ? followBelowGrade() : undefined), [active]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The box the ground window opens for: the shown level while the editor's level display
|
|
57
|
+
* hides what is above it, the whole building when it stands whole (Preview).
|
|
58
|
+
*/
|
|
59
|
+
export function groundWindowBoxShown(viewer, nodes) {
|
|
60
|
+
const { levelId, buildingId } = viewer.selection;
|
|
61
|
+
if (viewer.hideLevelsAboveSelection && levelId !== null)
|
|
62
|
+
return levelGroundBox(nodes, levelId);
|
|
63
|
+
return buildingGroundBox(nodes, buildingId ?? null);
|
|
64
|
+
}
|
|
65
|
+
function sameBox(a, b) {
|
|
66
|
+
if (a === null || b === null)
|
|
67
|
+
return a === b;
|
|
68
|
+
return (a.min.every((value, axis) => value === b.min[axis]) &&
|
|
69
|
+
a.max.every((value, axis) => value === b.max[axis]));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Keeps the viewer's `groundWindowBox` on {@link groundWindowBoxShown} while the selection,
|
|
73
|
+
* the level display and the scene change. The returned function stops, and the window closes.
|
|
74
|
+
*/
|
|
75
|
+
export function followGroundWindowBox() {
|
|
76
|
+
const update = () => {
|
|
77
|
+
const box = groundWindowBoxShown(useViewer.getState(), useScene.getState().nodes);
|
|
78
|
+
if (!sameBox(useViewer.getState().groundWindowBox, box))
|
|
79
|
+
useViewer.setState({ groundWindowBox: box });
|
|
80
|
+
};
|
|
81
|
+
update();
|
|
82
|
+
const stopViewer = useViewer.subscribe((state, previous) => {
|
|
83
|
+
if (state.selection.levelId !== previous.selection.levelId ||
|
|
84
|
+
state.selection.buildingId !== previous.selection.buildingId ||
|
|
85
|
+
state.hideLevelsAboveSelection !== previous.hideLevelsAboveSelection ||
|
|
86
|
+
state.groundWindowBox !== previous.groundWindowBox)
|
|
87
|
+
update();
|
|
88
|
+
});
|
|
89
|
+
const stopScene = useScene.subscribe((state, previous) => {
|
|
90
|
+
if (state.nodes !== previous.nodes)
|
|
91
|
+
update();
|
|
92
|
+
});
|
|
93
|
+
return () => {
|
|
94
|
+
stopViewer();
|
|
95
|
+
stopScene();
|
|
96
|
+
useViewer.setState({ groundWindowBox: null });
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** The ground window follows the shown level or building while `active` (not on the site). */
|
|
100
|
+
export function useGroundWindowBox(active) {
|
|
101
|
+
useEffect(() => (active ? followGroundWindowBox() : undefined), [active]);
|
|
102
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CameraPose } from '@pascal-app/core';
|
|
2
|
+
export type CameraPoseApplicationPlan = {
|
|
3
|
+
pose: CameraPose;
|
|
4
|
+
perspectiveFov: number | null;
|
|
5
|
+
};
|
|
6
|
+
export type CameraPoseInterpolationStep = {
|
|
7
|
+
position: [number, number, number];
|
|
8
|
+
settled: boolean;
|
|
9
|
+
target: [number, number, number];
|
|
10
|
+
};
|
|
11
|
+
export declare function publishInitialCameraPose(publishCurrentPose: () => void): void;
|
|
12
|
+
export declare function releaseCameraPoseEventSuppression(suppression: {
|
|
13
|
+
current: boolean;
|
|
14
|
+
}, publishCurrentPose: () => void): void;
|
|
15
|
+
export declare function normalizeCameraPose(value: unknown): CameraPose | null;
|
|
16
|
+
export declare function planCameraPoseApplication(value: unknown): CameraPoseApplicationPlan | null;
|
|
17
|
+
export declare function withCameraPoseDistance(pose: CameraPose, distance: number): CameraPose;
|
|
18
|
+
export declare function stepCameraPoseInterpolation(currentPosition: [number, number, number], currentTarget: [number, number, number], destination: CameraPose, deltaSeconds: number): CameraPoseInterpolationStep;
|
|
19
|
+
//# sourceMappingURL=camera-pose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera-pose.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/camera-pose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQlD,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAA;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED,wBAAgB,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,IAAI,GAAG,IAAI,CAE7E;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACjC,kBAAkB,EAAE,MAAM,IAAI,GAC7B,IAAI,CAGN;AAgBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CA2CrE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,GAAG,IAAI,CAa1F;AA8BD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAmBrF;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACzC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACvC,WAAW,EAAE,UAAU,EACvB,YAAY,EAAE,MAAM,GACnB,2BAA2B,CAY7B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const MIN_PERSPECTIVE_FOV = 1;
|
|
2
|
+
const MAX_PERSPECTIVE_FOV = 179;
|
|
3
|
+
const INTERPOLATION_TIME_CONSTANT_SECONDS = 0.08;
|
|
4
|
+
const MAX_INTERPOLATION_DELTA_SECONDS = 0.1;
|
|
5
|
+
const INTERPOLATION_SETTLE_DISTANCE = 0.001;
|
|
6
|
+
export function publishInitialCameraPose(publishCurrentPose) {
|
|
7
|
+
publishCurrentPose();
|
|
8
|
+
}
|
|
9
|
+
export function releaseCameraPoseEventSuppression(suppression, publishCurrentPose) {
|
|
10
|
+
suppression.current = false;
|
|
11
|
+
publishCurrentPose();
|
|
12
|
+
}
|
|
13
|
+
function finiteVectorTuple(value) {
|
|
14
|
+
if (!(Array.isArray(value) &&
|
|
15
|
+
value.length === 3 &&
|
|
16
|
+
value.every((component) => typeof component === 'number' && Number.isFinite(component)))) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return [value[0], value[1], value[2]];
|
|
20
|
+
}
|
|
21
|
+
export function normalizeCameraPose(value) {
|
|
22
|
+
if (!(typeof value === 'object' && value !== null)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const candidate = value;
|
|
26
|
+
const position = finiteVectorTuple(candidate.position);
|
|
27
|
+
const target = finiteVectorTuple(candidate.target);
|
|
28
|
+
if (!(position &&
|
|
29
|
+
target &&
|
|
30
|
+
(candidate.projection === 'perspective' || candidate.projection === 'orthographic'))) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (candidate.fov !== undefined &&
|
|
34
|
+
!(typeof candidate.fov === 'number' && Number.isFinite(candidate.fov))) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (candidate.viewWidth !== undefined &&
|
|
38
|
+
!(typeof candidate.viewWidth === 'number' &&
|
|
39
|
+
Number.isFinite(candidate.viewWidth) &&
|
|
40
|
+
candidate.viewWidth > 0)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
...(candidate.fov === undefined ? {} : { fov: candidate.fov }),
|
|
45
|
+
position,
|
|
46
|
+
projection: candidate.projection,
|
|
47
|
+
target,
|
|
48
|
+
...(candidate.viewWidth === undefined ? {} : { viewWidth: candidate.viewWidth }),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function planCameraPoseApplication(value) {
|
|
52
|
+
const pose = normalizeCameraPose(value);
|
|
53
|
+
if (!pose) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
pose,
|
|
58
|
+
perspectiveFov: pose.projection === 'perspective' && pose.fov !== undefined
|
|
59
|
+
? Math.min(Math.max(pose.fov, MIN_PERSPECTIVE_FOV), MAX_PERSPECTIVE_FOV)
|
|
60
|
+
: null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function interpolateVectorTuple(current, destination, alpha) {
|
|
64
|
+
const dx = destination[0] - current[0];
|
|
65
|
+
const dy = destination[1] - current[1];
|
|
66
|
+
const dz = destination[2] - current[2];
|
|
67
|
+
const settleDistanceSquared = INTERPOLATION_SETTLE_DISTANCE ** 2;
|
|
68
|
+
if (dx * dx + dy * dy + dz * dz <= settleDistanceSquared) {
|
|
69
|
+
return { settled: true, value: [...destination] };
|
|
70
|
+
}
|
|
71
|
+
const value = [
|
|
72
|
+
current[0] + dx * alpha,
|
|
73
|
+
current[1] + dy * alpha,
|
|
74
|
+
current[2] + dz * alpha,
|
|
75
|
+
];
|
|
76
|
+
const remainingX = destination[0] - value[0];
|
|
77
|
+
const remainingY = destination[1] - value[1];
|
|
78
|
+
const remainingZ = destination[2] - value[2];
|
|
79
|
+
const settled = remainingX * remainingX + remainingY * remainingY + remainingZ * remainingZ <=
|
|
80
|
+
settleDistanceSquared;
|
|
81
|
+
return { settled, value: settled ? [...destination] : value };
|
|
82
|
+
}
|
|
83
|
+
export function withCameraPoseDistance(pose, distance) {
|
|
84
|
+
const dx = pose.position[0] - pose.target[0];
|
|
85
|
+
const dy = pose.position[1] - pose.target[1];
|
|
86
|
+
const dz = pose.position[2] - pose.target[2];
|
|
87
|
+
const currentDistance = Math.hypot(dx, dy, dz);
|
|
88
|
+
if (!(Number.isFinite(distance) && distance > 0 && currentDistance > 0)) {
|
|
89
|
+
return { ...pose, position: [...pose.position], target: [...pose.target] };
|
|
90
|
+
}
|
|
91
|
+
const scale = distance / currentDistance;
|
|
92
|
+
return {
|
|
93
|
+
...pose,
|
|
94
|
+
position: [
|
|
95
|
+
pose.target[0] + dx * scale,
|
|
96
|
+
pose.target[1] + dy * scale,
|
|
97
|
+
pose.target[2] + dz * scale,
|
|
98
|
+
],
|
|
99
|
+
target: [...pose.target],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function stepCameraPoseInterpolation(currentPosition, currentTarget, destination, deltaSeconds) {
|
|
103
|
+
const finiteDelta = Number.isFinite(deltaSeconds) ? deltaSeconds : 0;
|
|
104
|
+
const elapsed = Math.min(Math.max(finiteDelta, 0), MAX_INTERPOLATION_DELTA_SECONDS);
|
|
105
|
+
const alpha = 1 - Math.exp(-elapsed / INTERPOLATION_TIME_CONSTANT_SECONDS);
|
|
106
|
+
const position = interpolateVectorTuple(currentPosition, destination.position, alpha);
|
|
107
|
+
const target = interpolateVectorTuple(currentTarget, destination.target, alpha);
|
|
108
|
+
return {
|
|
109
|
+
position: position.value,
|
|
110
|
+
settled: position.settled && target.settled,
|
|
111
|
+
target: target.value,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type PascalI18n } from '@pascal-app/core';
|
|
2
|
+
type DisplayLevel = {
|
|
3
|
+
level?: number;
|
|
4
|
+
name?: string;
|
|
5
|
+
};
|
|
6
|
+
/** The level's own name, or undefined while it carries a generated default. */
|
|
7
|
+
export declare function authoredLevelName(level: DisplayLevel): string | undefined;
|
|
8
|
+
export declare function localizedLevelName(level: DisplayLevel, i18n: PascalI18n, locale: string): string;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=level-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"level-name.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/level-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE3F,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAMzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBhG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getDefaultLevelName, levelDisplayNumber } from '@pascal-app/core';
|
|
2
|
+
/** The level's own name, or undefined while it carries a generated default. */
|
|
3
|
+
export function authoredLevelName(level) {
|
|
4
|
+
const levelNumber = level.level ?? 0;
|
|
5
|
+
const name = level.name?.trim();
|
|
6
|
+
return name && name !== `Level ${levelNumber}` && name !== getDefaultLevelName(levelNumber)
|
|
7
|
+
? name
|
|
8
|
+
: undefined;
|
|
9
|
+
}
|
|
10
|
+
export function localizedLevelName(level, i18n, locale) {
|
|
11
|
+
const levelNumber = level.level ?? 0;
|
|
12
|
+
const authoredName = authoredLevelName(level);
|
|
13
|
+
if (authoredName)
|
|
14
|
+
return authoredName;
|
|
15
|
+
if (levelNumber === 0) {
|
|
16
|
+
return i18n._({ id: 'core.level.groundFloor', message: 'Ground floor' });
|
|
17
|
+
}
|
|
18
|
+
if (levelNumber === -1) {
|
|
19
|
+
return i18n._({ id: 'core.level.basement', message: 'Basement' });
|
|
20
|
+
}
|
|
21
|
+
if (levelNumber < -1) {
|
|
22
|
+
return i18n._({
|
|
23
|
+
id: 'core.level.basementNumber',
|
|
24
|
+
message: 'Basement {number}',
|
|
25
|
+
values: { number: -levelNumber },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return i18n._({
|
|
29
|
+
id: 'core.level.floorNumber',
|
|
30
|
+
message: 'Floor {number}',
|
|
31
|
+
values: { number: levelDisplayNumber(levelNumber, locale) },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyNode } from '@pascal-app/core';
|
|
2
|
+
/**
|
|
3
|
+
* A node's human label, the same in the baked artifact (`extras.label`) and the
|
|
4
|
+
* viewer's breadcrumb: an explicit name wins, items fall back to their catalog
|
|
5
|
+
* asset name, other kinds to a type word.
|
|
6
|
+
*/
|
|
7
|
+
export declare function nodeDisplayLabel(node: AnyNode): string;
|
|
8
|
+
//# sourceMappingURL=node-display-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-display-label.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/node-display-label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CA6BtD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node's human label, the same in the baked artifact (`extras.label`) and the
|
|
3
|
+
* viewer's breadcrumb: an explicit name wins, items fall back to their catalog
|
|
4
|
+
* asset name, other kinds to a type word.
|
|
5
|
+
*/
|
|
6
|
+
export function nodeDisplayLabel(node) {
|
|
7
|
+
if (node.name)
|
|
8
|
+
return node.name;
|
|
9
|
+
switch (node.type) {
|
|
10
|
+
case 'item':
|
|
11
|
+
return node.asset?.name || 'Item';
|
|
12
|
+
case 'wall':
|
|
13
|
+
return 'Wall';
|
|
14
|
+
case 'door':
|
|
15
|
+
return 'Door';
|
|
16
|
+
case 'window':
|
|
17
|
+
return 'Window';
|
|
18
|
+
case 'cabinet':
|
|
19
|
+
case 'cabinet-module':
|
|
20
|
+
return 'Cabinet';
|
|
21
|
+
case 'slab':
|
|
22
|
+
return 'Slab';
|
|
23
|
+
case 'ceiling':
|
|
24
|
+
return 'Ceiling';
|
|
25
|
+
case 'roof':
|
|
26
|
+
return 'Roof';
|
|
27
|
+
case 'fence':
|
|
28
|
+
return 'Fence';
|
|
29
|
+
case 'column':
|
|
30
|
+
return 'Column';
|
|
31
|
+
case 'stair':
|
|
32
|
+
return 'Stairs';
|
|
33
|
+
default:
|
|
34
|
+
return node.type;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-area.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/room-area.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,kBAAkB,CAAA;AAEzB,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9F"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { formatNumber, getAreaUnitLabel, squareMetersToAreaUnit, } from '@pascal-app/core';
|
|
2
|
+
export function formatRoomArea(squareMeters, unit, locale) {
|
|
3
|
+
return `${formatNumber(squareMetersToAreaUnit(squareMeters, unit), {
|
|
4
|
+
min: 1,
|
|
5
|
+
max: 1,
|
|
6
|
+
locale,
|
|
7
|
+
})} ${getAreaUnitLabel(unit)}`;
|
|
8
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type AnyNode } from '@pascal-app/core';
|
|
2
|
+
import type { RoomSelectionGeometry, RoomSelectionRecord } from './room-selection';
|
|
3
|
+
type Point = readonly [number, number];
|
|
4
|
+
type Ring = readonly Point[];
|
|
5
|
+
/** Everything the assembly depends on besides the room's topology geometry. */
|
|
6
|
+
export type RoomAssemblyHeights = {
|
|
7
|
+
/** Level-local Y of the room's plate top (the level plane without a plate). */
|
|
8
|
+
floorY: number;
|
|
9
|
+
/** Level-local Y of each boundary wall's top. */
|
|
10
|
+
wallTops: ReadonlyMap<string, number>;
|
|
11
|
+
ceiling: {
|
|
12
|
+
polygon: Ring;
|
|
13
|
+
holes: readonly Ring[];
|
|
14
|
+
y: number;
|
|
15
|
+
} | null;
|
|
16
|
+
};
|
|
17
|
+
export type RoomWallFacePortion = {
|
|
18
|
+
wallId: string;
|
|
19
|
+
face: 'a' | 'b';
|
|
20
|
+
from: Point;
|
|
21
|
+
to: Point;
|
|
22
|
+
};
|
|
23
|
+
/** Flat level-local position buffers; the renderer only wraps them. */
|
|
24
|
+
export type RoomAssembly = {
|
|
25
|
+
floor: Float32Array;
|
|
26
|
+
surfaces: Float32Array;
|
|
27
|
+
outline: Float32Array;
|
|
28
|
+
faces: RoomWallFacePortion[];
|
|
29
|
+
};
|
|
30
|
+
export declare function resolveRoomAssemblyHeights(room: RoomSelectionRecord, nodes: Readonly<Record<string, AnyNode>>): RoomAssemblyHeights;
|
|
31
|
+
/**
|
|
32
|
+
* The room geometry object is reused for as long as the level topology
|
|
33
|
+
* revision stands, so it keys the cache; heights and the ceiling outline are
|
|
34
|
+
* compared by value. Hover changes and pointer moves only ever hit.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRoomAssembly(geometry: RoomSelectionGeometry, heights: RoomAssemblyHeights): RoomAssembly;
|
|
37
|
+
/**
|
|
38
|
+
* The room-facing part of each boundary wall face. The clear polygon's
|
|
39
|
+
* boundary is exactly the mitered faces the room sees, clipped by T-stems
|
|
40
|
+
* and separators, so its edges are matched against each wall's footprint
|
|
41
|
+
* face edges; that also keeps collinear walls apart.
|
|
42
|
+
*/
|
|
43
|
+
export declare function roomWallFaces(geometry: RoomSelectionGeometry): RoomWallFacePortion[];
|
|
44
|
+
export declare function buildRoomAssembly(geometry: RoomSelectionGeometry, heights: RoomAssemblyHeights): RoomAssembly;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=room-assembly-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-assembly-overlay.d.ts","sourceRoot":"","sources":["../../../src/ui/lib/room-assembly-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAWb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAElF,KAAK,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACtC,KAAK,IAAI,GAAG,SAAS,KAAK,EAAE,CAAA;AAE5B,+EAA+E;AAC/E,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,OAAO,EAAE;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAAA;AAE7F,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B,CAAA;AAgBD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,mBAAmB,CAoCrB;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAOd;AAyCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CA8BpF;AA4BD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAyCd"}
|