@kerros/viewer 0.0.0-stage → 0.1.0-rc.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/LICENSE +21 -0
- package/README.md +31 -2
- package/dist/adapters/basemap.js +11 -0
- package/dist/adapters/basemap.js.map +1 -0
- package/dist/adapters/persistence.js +121 -0
- package/dist/adapters/persistence.js.map +1 -0
- package/dist/adapters/status.js +18 -0
- package/dist/adapters/status.js.map +1 -0
- package/dist/components/ElevatorPanel.js +120 -0
- package/dist/components/ElevatorPanel.js.map +1 -0
- package/dist/components/Icons.js +57 -0
- package/dist/components/Icons.js.map +1 -0
- package/dist/components/Inspector.js +1184 -0
- package/dist/components/Inspector.js.map +1 -0
- package/dist/components/NavigatePanel.js +301 -0
- package/dist/components/NavigatePanel.js.map +1 -0
- package/dist/components/NavigationGraph.js +234 -0
- package/dist/components/NavigationGraph.js.map +1 -0
- package/dist/components/StructureExplorer.js +510 -0
- package/dist/components/StructureExplorer.js.map +1 -0
- package/dist/components/StructureView.js +286 -0
- package/dist/components/StructureView.js.map +1 -0
- package/dist/components/controls.js +170 -0
- package/dist/components/controls.js.map +1 -0
- package/dist/components/graphLayout.js +27 -0
- package/dist/components/graphLayout.js.map +1 -0
- package/dist/host.js +169 -0
- package/dist/host.js.map +1 -0
- package/dist/i18n.js +88 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/map/CabinMaterials.js +81 -0
- package/dist/map/CabinMaterials.js.map +1 -0
- package/dist/map/CabinMirror.js +43 -0
- package/dist/map/CabinMirror.js.map +1 -0
- package/dist/map/Doors.js +80 -0
- package/dist/map/Doors.js.map +1 -0
- package/dist/map/ElevatorCabin.js +93 -0
- package/dist/map/ElevatorCabin.js.map +1 -0
- package/dist/map/FixtureLights.js +117 -0
- package/dist/map/FixtureLights.js.map +1 -0
- package/dist/map/MapCanvas.js +2161 -0
- package/dist/map/MapCanvas.js.map +1 -0
- package/dist/map/Passenger.js +69 -0
- package/dist/map/Passenger.js.map +1 -0
- package/dist/map/SceneLayer.js +1534 -0
- package/dist/map/SceneLayer.js.map +1 -0
- package/dist/map/UndergroundContext.js +153 -0
- package/dist/map/UndergroundContext.js.map +1 -0
- package/dist/map/ambience.js +194 -0
- package/dist/map/ambience.js.map +1 -0
- package/dist/map/architecture.js +305 -0
- package/dist/map/architecture.js.map +1 -0
- package/dist/map/bathMusic.js +92 -0
- package/dist/map/bathMusic.js.map +1 -0
- package/dist/map/cameraAim.js +33 -0
- package/dist/map/cameraAim.js.map +1 -0
- package/dist/map/elevators.js +56 -0
- package/dist/map/elevators.js.map +1 -0
- package/dist/map/excavation.js +52 -0
- package/dist/map/excavation.js.map +1 -0
- package/dist/map/exteriors.js +25 -0
- package/dist/map/exteriors.js.map +1 -0
- package/dist/map/features.js +218 -0
- package/dist/map/features.js.map +1 -0
- package/dist/map/fences.js +29 -0
- package/dist/map/fences.js.map +1 -0
- package/dist/map/journey.js +112 -0
- package/dist/map/journey.js.map +1 -0
- package/dist/map/levels.js +6 -0
- package/dist/map/levels.js.map +1 -0
- package/dist/map/lighting.js +142 -0
- package/dist/map/lighting.js.map +1 -0
- package/dist/map/loadBasemap.js +26 -0
- package/dist/map/loadBasemap.js.map +1 -0
- package/dist/map/materials.js +183 -0
- package/dist/map/materials.js.map +1 -0
- package/dist/map/poolLighting.js +39 -0
- package/dist/map/poolLighting.js.map +1 -0
- package/dist/map/projection.js +24 -0
- package/dist/map/projection.js.map +1 -0
- package/dist/map/rampGeometry.js +38 -0
- package/dist/map/rampGeometry.js.map +1 -0
- package/dist/map/route.js +107 -0
- package/dist/map/route.js.map +1 -0
- package/dist/map/stairSurfaces.js +115 -0
- package/dist/map/stairSurfaces.js.map +1 -0
- package/dist/map/surfaces.js +136 -0
- package/dist/map/surfaces.js.map +1 -0
- package/dist/map/textures.js +95 -0
- package/dist/map/textures.js.map +1 -0
- package/dist/map/underground.js +34 -0
- package/dist/map/underground.js.map +1 -0
- package/dist/map/walk.js +433 -0
- package/dist/map/walk.js.map +1 -0
- package/dist/map/walkContext.js +46 -0
- package/dist/map/walkContext.js.map +1 -0
- package/dist/map/walkDimensions.js +7 -0
- package/dist/map/walkDimensions.js.map +1 -0
- package/dist/map/walkJourney.js +85 -0
- package/dist/map/walkJourney.js.map +1 -0
- package/dist/map/walkSurfaces.js +106 -0
- package/dist/map/walkSurfaces.js.map +1 -0
- package/dist/map/wallJoins.js +70 -0
- package/dist/map/wallJoins.js.map +1 -0
- package/dist/map/water.js +274 -0
- package/dist/map/water.js.map +1 -0
- package/dist/model/authoring.js +80 -0
- package/dist/model/authoring.js.map +1 -0
- package/dist/model/boundaries.js +548 -0
- package/dist/model/boundaries.js.map +1 -0
- package/dist/model/coverage.js +30 -0
- package/dist/model/coverage.js.map +1 -0
- package/dist/model/document.js +52 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/doors.js +47 -0
- package/dist/model/doors.js.map +1 -0
- package/dist/model/factory.js +56 -0
- package/dist/model/factory.js.map +1 -0
- package/dist/model/geometry.js +394 -0
- package/dist/model/geometry.js.map +1 -0
- package/dist/model/inference.js +182 -0
- package/dist/model/inference.js.map +1 -0
- package/dist/model/materials.js +11 -0
- package/dist/model/materials.js.map +1 -0
- package/dist/model/mutations.js +157 -0
- package/dist/model/mutations.js.map +1 -0
- package/dist/model/navigation.js +275 -0
- package/dist/model/navigation.js.map +1 -0
- package/dist/model/ontology.js +109 -0
- package/dist/model/ontology.js.map +1 -0
- package/dist/model/passages.js +5 -0
- package/dist/model/passages.js.map +1 -0
- package/dist/model/portals.js +42 -0
- package/dist/model/portals.js.map +1 -0
- package/dist/model/precision.js +11 -0
- package/dist/model/precision.js.map +1 -0
- package/dist/model/project.js +17 -0
- package/dist/model/project.js.map +1 -0
- package/dist/model/ramps.js +10 -0
- package/dist/model/ramps.js.map +1 -0
- package/dist/model/roomNavigation.js +87 -0
- package/dist/model/roomNavigation.js.map +1 -0
- package/dist/model/routeClearance.js +72 -0
- package/dist/model/routeClearance.js.map +1 -0
- package/dist/model/spaces.js +104 -0
- package/dist/model/spaces.js.map +1 -0
- package/dist/model/stairGeometry.js +40 -0
- package/dist/model/stairGeometry.js.map +1 -0
- package/dist/model/stairTraversal.js +48 -0
- package/dist/model/stairTraversal.js.map +1 -0
- package/dist/model/topology.js +63 -0
- package/dist/model/topology.js.map +1 -0
- package/dist/model/types.js +35 -0
- package/dist/model/types.js.map +1 -0
- package/dist/model/validate.js +240 -0
- package/dist/model/validate.js.map +1 -0
- package/dist/model/vertical.js +129 -0
- package/dist/model/vertical.js.map +1 -0
- package/dist/model/walls.js +71 -0
- package/dist/model/walls.js.map +1 -0
- package/dist/styles.css +4931 -0
- package/dist/theme/index.js +34 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/types/adapters/basemap.d.ts +2 -0
- package/dist/types/adapters/persistence.d.ts +29 -0
- package/dist/types/adapters/status.d.ts +4 -0
- package/dist/types/components/ElevatorPanel.d.ts +18 -0
- package/dist/types/components/Icons.d.ts +8 -0
- package/dist/types/components/Inspector.d.ts +38 -0
- package/dist/types/components/NavigatePanel.d.ts +27 -0
- package/dist/types/components/NavigationGraph.d.ts +10 -0
- package/dist/types/components/StructureExplorer.d.ts +8 -0
- package/dist/types/components/StructureView.d.ts +22 -0
- package/dist/types/components/controls.d.ts +52 -0
- package/dist/types/components/graphLayout.d.ts +9 -0
- package/dist/types/i18n.d.ts +85 -0
- package/dist/types/import/analysisPreview.d.ts +27 -0
- package/dist/types/import/brief.d.ts +22 -0
- package/dist/types/import/checkpoint.d.ts +49 -0
- package/dist/types/import/instructions.d.ts +7 -0
- package/dist/types/import/usage.d.ts +10 -0
- package/dist/types/map/CabinMaterials.d.ts +18 -0
- package/dist/types/map/CabinMirror.d.ts +13 -0
- package/dist/types/map/Doors.d.ts +11 -0
- package/dist/types/map/ElevatorCabin.d.ts +20 -0
- package/dist/types/map/FixtureLights.d.ts +35 -0
- package/dist/types/map/MapCanvas.d.ts +87 -0
- package/dist/types/map/Passenger.d.ts +18 -0
- package/dist/types/map/SceneLayer.d.ts +306 -0
- package/dist/types/map/UndergroundContext.d.ts +18 -0
- package/dist/types/map/ambience.d.ts +29 -0
- package/dist/types/map/architecture.d.ts +8 -0
- package/dist/types/map/bathMusic.d.ts +14 -0
- package/dist/types/map/cameraAim.d.ts +20 -0
- package/dist/types/map/elevators.d.ts +16 -0
- package/dist/types/map/excavation.d.ts +9 -0
- package/dist/types/map/exteriors.d.ts +3 -0
- package/dist/types/map/features.d.ts +33 -0
- package/dist/types/map/fences.d.ts +4 -0
- package/dist/types/map/journey.d.ts +36 -0
- package/dist/types/map/levels.d.ts +4 -0
- package/dist/types/map/lighting.d.ts +103 -0
- package/dist/types/map/loadBasemap.d.ts +4 -0
- package/dist/types/map/materials.d.ts +38 -0
- package/dist/types/map/poolLighting.d.ts +11 -0
- package/dist/types/map/projection.d.ts +9 -0
- package/dist/types/map/rampGeometry.d.ts +8 -0
- package/dist/types/map/route.d.ts +59 -0
- package/dist/types/map/stairSurfaces.d.ts +29 -0
- package/dist/types/map/surfaces.d.ts +36 -0
- package/dist/types/map/textures.d.ts +8 -0
- package/dist/types/map/underground.d.ts +30 -0
- package/dist/types/map/walk.d.ts +232 -0
- package/dist/types/map/walkContext.d.ts +11 -0
- package/dist/types/map/walkDimensions.d.ts +5 -0
- package/dist/types/map/walkJourney.d.ts +33 -0
- package/dist/types/map/walkSurfaces.d.ts +27 -0
- package/dist/types/map/wallJoins.d.ts +6 -0
- package/dist/types/map/water.d.ts +12 -0
- package/dist/types/model/authoring.d.ts +38 -0
- package/dist/types/model/boundaries.d.ts +41 -0
- package/dist/types/model/coverage.d.ts +8 -0
- package/dist/types/model/document.d.ts +9 -0
- package/dist/types/model/doors.d.ts +19 -0
- package/dist/types/model/factory.d.ts +5 -0
- package/dist/types/model/geometry.d.ts +99 -0
- package/dist/types/model/host.d.ts +154 -0
- package/dist/types/model/inference.d.ts +46 -0
- package/dist/types/model/live.d.ts +60 -0
- package/dist/types/model/materials.d.ts +28 -0
- package/dist/types/model/mutations.d.ts +178 -0
- package/dist/types/model/navigation.d.ts +70 -0
- package/dist/types/model/ontology.d.ts +43 -0
- package/dist/types/model/passages.d.ts +2 -0
- package/dist/types/model/portals.d.ts +9 -0
- package/dist/types/model/precision.d.ts +11 -0
- package/dist/types/model/project.d.ts +8 -0
- package/dist/types/model/ramps.d.ts +7 -0
- package/dist/types/model/roomNavigation.d.ts +15 -0
- package/dist/types/model/routeClearance.d.ts +11 -0
- package/dist/types/model/spaces.d.ts +46 -0
- package/dist/types/model/stairGeometry.d.ts +27 -0
- package/dist/types/model/stairTraversal.d.ts +8 -0
- package/dist/types/model/topology.d.ts +14 -0
- package/dist/types/model/types.d.ts +369 -0
- package/dist/types/model/validate.d.ts +38 -0
- package/dist/types/model/vertical.d.ts +145 -0
- package/dist/types/model/walls.d.ts +71 -0
- package/dist/types/schema/index.d.ts +25 -0
- package/dist/types/theme/index.d.ts +55 -0
- package/dist/types/viewer/FloorViewer.d.ts +76 -0
- package/dist/types/viewer/ViewerWorkspace.d.ts +2 -0
- package/dist/types/viewer/host.d.ts +11 -0
- package/dist/types/viewer/index.d.ts +2 -0
- package/dist/types/viewer/panels.d.ts +12 -0
- package/dist/viewer/FloorViewer.js +104 -0
- package/dist/viewer/FloorViewer.js.map +1 -0
- package/dist/viewer/ViewerWorkspace.js +370 -0
- package/dist/viewer/ViewerWorkspace.js.map +1 -0
- package/dist/viewer/panels.js +35 -0
- package/dist/viewer/panels.js.map +1 -0
- package/package.json +58 -4
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode } from 'react';
|
|
2
|
+
import type { SiteObject } from '../model/types';
|
|
3
|
+
import type { StatusTone } from '../model/live';
|
|
4
|
+
import { type En } from '../i18n';
|
|
5
|
+
type DeepPartial<T> = {
|
|
6
|
+
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
7
|
+
};
|
|
8
|
+
/** App-wide dark mode: a `dark` class on the root element, remembered per browser. */
|
|
9
|
+
export declare function useDarkMode(): [boolean, () => void];
|
|
10
|
+
export interface ConfirmOptions {
|
|
11
|
+
title: string;
|
|
12
|
+
body?: string;
|
|
13
|
+
danger?: boolean;
|
|
14
|
+
confirmLabel?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Plan/route/device rendering colours, per deployment ("operation model"). Basemap is separate (BasemapConfig). */
|
|
17
|
+
export interface MapStyleOptions {
|
|
18
|
+
/** Plan area fill and wall colour (top-down 2D). */
|
|
19
|
+
room?: string;
|
|
20
|
+
wall?: string;
|
|
21
|
+
route?: string;
|
|
22
|
+
routeActive?: string;
|
|
23
|
+
/** Selection/hover/draft highlight colours, applied on both the 2D plan and the 3D scene. */
|
|
24
|
+
selection?: string;
|
|
25
|
+
/** Soft (translucent) selection fill for areas; defaults to a light tint of the selection colour. */
|
|
26
|
+
selectionFill?: string;
|
|
27
|
+
hover?: string;
|
|
28
|
+
draft?: string;
|
|
29
|
+
statusTones?: Partial<Record<StatusTone, string>>;
|
|
30
|
+
/** Last-word override for any area/object fill and marker accent; return undefined to fall through. */
|
|
31
|
+
objectColor?: (object: SiteObject) => string | undefined;
|
|
32
|
+
}
|
|
33
|
+
export interface KerrosTheme {
|
|
34
|
+
/** CSS custom-property overrides (e.g. { '--accent': '#e8562f' }); applied to the theme wrapper. */
|
|
35
|
+
tokens?: Record<string, string>;
|
|
36
|
+
/** Per kind/tool/POI-symbol icon overrides; keys match EntityIcon's `kind`/`symbol`. */
|
|
37
|
+
icons?: Record<string, ComponentType<{
|
|
38
|
+
size?: number;
|
|
39
|
+
}>>;
|
|
40
|
+
/** Show a transient notification. Unset → the built-in toast. */
|
|
41
|
+
notify?: (message: string, tone?: 'info' | 'error') => void;
|
|
42
|
+
/** Ask the user to confirm a destructive action. Unset → the built-in dialog. */
|
|
43
|
+
confirm?: (options: ConfirmOptions) => Promise<boolean>;
|
|
44
|
+
/** Plan/route/device rendering colours. */
|
|
45
|
+
mapStyle?: MapStyleOptions;
|
|
46
|
+
/** Override any library UI strings (deep-merged over the built-in English); read via useStrings(). */
|
|
47
|
+
strings?: DeepPartial<En>;
|
|
48
|
+
}
|
|
49
|
+
export declare function KerrosThemeProvider({ theme, children }: {
|
|
50
|
+
theme?: KerrosTheme;
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}): import("react").JSX.Element;
|
|
53
|
+
export declare const useKerrosTheme: () => KerrosTheme;
|
|
54
|
+
export declare function useStrings(): En;
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { AssetRepository, ProjectDocument } from '../model/types';
|
|
2
|
+
import type { StatusReading } from '../model/live';
|
|
3
|
+
import type { BasemapConfig, CameraState, ElevatorControls, StatusPanelContext } from '../model/host';
|
|
4
|
+
import type { Route } from '../model/navigation';
|
|
5
|
+
import type { WalkAvatar } from '../map/walk';
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
export type ViewerMode = '2d' | '3d' | 'walk';
|
|
8
|
+
export interface ViewerDisplayOptions {
|
|
9
|
+
showLabels: boolean;
|
|
10
|
+
showPlan: boolean;
|
|
11
|
+
coverage: boolean;
|
|
12
|
+
excavation: boolean;
|
|
13
|
+
cityBuildings: boolean;
|
|
14
|
+
cadastre: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface FloorViewerProps {
|
|
17
|
+
project: ProjectDocument;
|
|
18
|
+
/** Include floor/view controls, structure, graph, directions and read-only properties panels.
|
|
19
|
+
* Omit for a map-only embed with host-owned chrome. Never enables document editing. */
|
|
20
|
+
controls?: boolean;
|
|
21
|
+
/** Repository for reference-drawing images. Omit → drawings are simply not rendered. */
|
|
22
|
+
assets?: AssetRepository;
|
|
23
|
+
/** Complete current status set (replace semantics — the viewer does NOT accumulate deltas; absent devices read as unknown). */
|
|
24
|
+
statuses?: StatusReading[];
|
|
25
|
+
/** Omit → neutralBasemap (offline plan background). */
|
|
26
|
+
basemap?: BasemapConfig;
|
|
27
|
+
/** undefined → viewer manages floors internally, opening on the document's `initialFloorId` when it
|
|
28
|
+
* sets one, else the ground floor (elevation 0, else first). null is a real value: the outdoor site. */
|
|
29
|
+
floorId?: string | null;
|
|
30
|
+
onFloorChange?: (floorId: string | null) => void;
|
|
31
|
+
/** undefined → viewer manages selection internally. */
|
|
32
|
+
selected?: string | null;
|
|
33
|
+
onSelect?: (id: string | null) => void;
|
|
34
|
+
/** Fires as the pointer hovers a plan object (null when leaving). */
|
|
35
|
+
onHoverObject?: (id: string | null) => void;
|
|
36
|
+
threeD?: boolean;
|
|
37
|
+
/** Controlled view mode; takes precedence over the legacy threeD/walk flags. */
|
|
38
|
+
viewMode?: ViewerMode;
|
|
39
|
+
onViewModeChange?: (mode: ViewerMode) => void;
|
|
40
|
+
stack?: boolean;
|
|
41
|
+
onStackChange?: (stack: boolean) => void;
|
|
42
|
+
/** Walk the floor at eye level with keyboard and mouse. Implies threeD; stack is ignored.
|
|
43
|
+
* This is the mode indoor navigation is meant to be read in — a visitor is standing in it. */
|
|
44
|
+
walk?: boolean;
|
|
45
|
+
onWalkExit?: () => void;
|
|
46
|
+
avatar?: WalkAvatar | null;
|
|
47
|
+
onAvatar?: (avatar: WalkAvatar) => void;
|
|
48
|
+
onWalkAt?: (avatar: WalkAvatar) => void;
|
|
49
|
+
/** Focus a listed object, retaining the walking camera when in POV. */
|
|
50
|
+
focusId?: string | null;
|
|
51
|
+
/** Host-owned lift commands and transient readings; never persisted into the plan. */
|
|
52
|
+
elevators?: ElevatorControls;
|
|
53
|
+
route?: Route | null;
|
|
54
|
+
onRouteChange?: (route: Route | null) => void;
|
|
55
|
+
playing?: boolean;
|
|
56
|
+
onPlayingChange?: (playing: boolean) => void;
|
|
57
|
+
activeStep?: number | null;
|
|
58
|
+
onJourneyStep?: (index: number) => void;
|
|
59
|
+
onJourneyEnd?: () => void;
|
|
60
|
+
dark?: boolean;
|
|
61
|
+
showLabels?: boolean;
|
|
62
|
+
showPlan?: boolean;
|
|
63
|
+
coverage?: boolean;
|
|
64
|
+
excavation?: boolean;
|
|
65
|
+
cityBuildings?: boolean;
|
|
66
|
+
cadastre?: boolean;
|
|
67
|
+
/** Updates from built-in display controls. Supplied display props remain controlled. */
|
|
68
|
+
onDisplayChange?: (options: ViewerDisplayOptions) => void;
|
|
69
|
+
renderStatusPanel?: (context: StatusPanelContext) => ReactNode;
|
|
70
|
+
/** Exact camera to restore (deep links); suppresses the automatic fit-to-floor on load. */
|
|
71
|
+
initialCamera?: CameraState;
|
|
72
|
+
/** The underlying MapLibre map, for hosts that deep-link or observe the camera. */
|
|
73
|
+
onReady?: (map: import('maplibre-gl').Map) => void;
|
|
74
|
+
onError?: (message: string) => void;
|
|
75
|
+
}
|
|
76
|
+
export declare function FloorViewer(props: FloorViewerProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { BasemapConfig, BasemapVectorSchema, CameraState, ElevatorControls, StatusPanelContext, } from '../model/host';
|
|
2
|
+
export type { FloorViewerProps, ViewerMode, ViewerDisplayOptions } from './FloorViewer';
|
|
3
|
+
export type { WalkAvatar } from '../map/walk';
|
|
4
|
+
export type { StatusReading, StatusMetrics, StatusTone, StatusFeed } from '../model/live';
|
|
5
|
+
export { neutralBasemap } from '../adapters/basemap';
|
|
6
|
+
export { statusTone, statusLabel, unknownStatus } from '../adapters/status';
|
|
7
|
+
export { LocalProjectRepository, IndexedProjectRepository, IndexedAssetRepository } from '../adapters/persistence';
|
|
8
|
+
export { KerrosThemeProvider, useKerrosTheme, useDarkMode, useStrings, type KerrosTheme, type MapStyleOptions, type ConfirmOptions, } from '../theme';
|
|
9
|
+
export * from '../schema';
|
|
10
|
+
export { StructureView, type StructureViewProps, type StructureTarget } from '../components/StructureView';
|
|
11
|
+
export { NavigationPanel, NavigationGraph, ReadOnlyInspector, type NavigationPanelProps, type NavigationGraphProps, type ReadOnlyInspectorProps, } from './panels';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { NavigatePanelProps } from '../components/NavigatePanel';
|
|
2
|
+
import type { NavigationGraphProps } from '../components/NavigationGraph';
|
|
3
|
+
import type { InspectorProps } from '../components/Inspector';
|
|
4
|
+
export type NavigationPanelProps = Omit<NavigatePanelProps, 'editing'>;
|
|
5
|
+
export type { NavigationGraphProps };
|
|
6
|
+
export type ReadOnlyInspectorProps = Pick<InspectorProps, 'project' | 'floorId' | 'selected' | 'statuses' | 'monitoring' | 'renderStatusPanel' | 'onClose' | 'onSelect' | 'onFloor'>;
|
|
7
|
+
/** The editor's directions panel, with no authoring controls. */
|
|
8
|
+
export declare function NavigationPanel(props: NavigationPanelProps): import("react").JSX.Element;
|
|
9
|
+
/** A view of the routing graph; force layout never changes the document's node coordinates. */
|
|
10
|
+
export declare function NavigationGraph(props: NavigationGraphProps): import("react").JSX.Element;
|
|
11
|
+
/** The same geometry, relationships and status details as the editor, without mutation callbacks. */
|
|
12
|
+
export declare function ReadOnlyInspector(props: ReadOnlyInspectorProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { lazy as O, Suspense as P, useState as i, useEffect as s, useMemo as d } from "react";
|
|
3
|
+
import { openingFloorId as S } from "../model/project.js";
|
|
4
|
+
import { MapCanvas as T } from "../map/MapCanvas.js";
|
|
5
|
+
import { sunAt as W } from "../map/lighting.js";
|
|
6
|
+
import { useKerrosTheme as J } from "../theme/index.js";
|
|
7
|
+
const R = { get: async () => {
|
|
8
|
+
}, put: async () => {
|
|
9
|
+
}, delete: async () => {
|
|
10
|
+
} }, f = () => {
|
|
11
|
+
}, H = [], L = O(() => import("./ViewerWorkspace.js"));
|
|
12
|
+
function $(e) {
|
|
13
|
+
return e.controls ? /* @__PURE__ */ o(
|
|
14
|
+
P,
|
|
15
|
+
{
|
|
16
|
+
fallback: /* @__PURE__ */ o("div", { className: "renderer-loading", role: "status", children: "Loading viewer…" }),
|
|
17
|
+
children: /* @__PURE__ */ o(L, { ...e }, e.project.id)
|
|
18
|
+
}
|
|
19
|
+
) : /* @__PURE__ */ o(V, { ...e });
|
|
20
|
+
}
|
|
21
|
+
function V(e) {
|
|
22
|
+
var I;
|
|
23
|
+
const { project: a } = e, v = J().notify, [F, u] = i(() => S(a)), [E, m] = i(null), c = e.floorId !== void 0 ? e.floorId : F, M = e.selected !== void 0 ? e.selected : E, r = e.viewMode ? e.viewMode === "walk" : e.walk ?? !1, b = e.viewMode ? e.viewMode !== "2d" : e.threeD || r || !1, w = (t) => {
|
|
24
|
+
var n;
|
|
25
|
+
e.floorId === void 0 && u(t), (n = e.onFloorChange) == null || n.call(e, t);
|
|
26
|
+
}, k = (t) => {
|
|
27
|
+
var y, h;
|
|
28
|
+
const n = a.objects.find((l) => l.id === t) ?? a.barriers.find((l) => l.id === t) ?? a.drawings.find((l) => l.id === t);
|
|
29
|
+
n && n.floorId !== c && !("servedFloorIds" in n && ((y = n.servedFloorIds) != null && y.includes(c ?? ""))) && w(n.floorId), e.selected === void 0 && m(t), (h = e.onSelect) == null || h.call(e, t);
|
|
30
|
+
};
|
|
31
|
+
s(() => {
|
|
32
|
+
e.floorId === void 0 && u(S(a)), e.selected === void 0 && m(null);
|
|
33
|
+
}, [a.id]);
|
|
34
|
+
const j = d(
|
|
35
|
+
() => e.assets || !a.drawings.length ? a : { ...a, drawings: [] },
|
|
36
|
+
[a, e.assets]
|
|
37
|
+
), [x, A] = i(0);
|
|
38
|
+
s(() => {
|
|
39
|
+
const t = setInterval(() => A((n) => n + 1), 5e3);
|
|
40
|
+
return () => clearInterval(t);
|
|
41
|
+
}, []);
|
|
42
|
+
const C = d(
|
|
43
|
+
() => {
|
|
44
|
+
var t;
|
|
45
|
+
return new Map([...e.statuses ?? [], ...((t = e.elevators) == null ? void 0 : t.statuses) ?? []].map((n) => [n.feedId, n]));
|
|
46
|
+
},
|
|
47
|
+
[e.statuses, (I = e.elevators) == null ? void 0 : I.statuses, x]
|
|
48
|
+
), [g, D] = i(() => Date.now());
|
|
49
|
+
s(() => {
|
|
50
|
+
const t = window.setInterval(() => D(Date.now()), 6e5);
|
|
51
|
+
return () => window.clearInterval(t);
|
|
52
|
+
}, []);
|
|
53
|
+
const N = d(() => W([a.origin[0], a.origin[1]], g), [a.origin, g]);
|
|
54
|
+
return /* @__PURE__ */ o("div", { className: `kerros-root kerros-surface ${e.dark ? "dark" : ""}`, children: /* @__PURE__ */ o(
|
|
55
|
+
T,
|
|
56
|
+
{
|
|
57
|
+
project: j,
|
|
58
|
+
canEdit: !1,
|
|
59
|
+
floorId: c,
|
|
60
|
+
selected: M,
|
|
61
|
+
tool: "select",
|
|
62
|
+
draft: H,
|
|
63
|
+
hover: null,
|
|
64
|
+
threeD: b,
|
|
65
|
+
stack: r ? !1 : e.stack ?? !1,
|
|
66
|
+
walk: r,
|
|
67
|
+
onWalkExit: e.onWalkExit,
|
|
68
|
+
onRequestFloor: w,
|
|
69
|
+
avatar: e.avatar,
|
|
70
|
+
onAvatar: e.onAvatar,
|
|
71
|
+
onWalkAt: e.onWalkAt,
|
|
72
|
+
focusId: e.focusId,
|
|
73
|
+
route: e.route,
|
|
74
|
+
playing: e.playing,
|
|
75
|
+
activeStep: e.activeStep,
|
|
76
|
+
onJourneyStep: e.onJourneyStep,
|
|
77
|
+
onJourneyEnd: e.onJourneyEnd,
|
|
78
|
+
elevators: e.elevators,
|
|
79
|
+
coverage: e.coverage ?? !1,
|
|
80
|
+
showLabels: e.showLabels ?? !0,
|
|
81
|
+
showPlan: e.showPlan ?? !0,
|
|
82
|
+
sun: N,
|
|
83
|
+
dark: e.dark ?? !1,
|
|
84
|
+
excavation: e.excavation,
|
|
85
|
+
cityBuildings: e.cityBuildings ?? !1,
|
|
86
|
+
cadastre: e.cadastre ?? !1,
|
|
87
|
+
basemap: e.basemap,
|
|
88
|
+
assets: e.assets ?? R,
|
|
89
|
+
statuses: C,
|
|
90
|
+
onClick: (t, n) => k(n),
|
|
91
|
+
onHover: f,
|
|
92
|
+
onSelect: k,
|
|
93
|
+
onHoverObject: e.onHoverObject,
|
|
94
|
+
onVertexMove: f,
|
|
95
|
+
onError: e.onError ?? (v ? (t) => v(t, "error") : f),
|
|
96
|
+
initialCamera: e.initialCamera,
|
|
97
|
+
onReady: e.onReady
|
|
98
|
+
}
|
|
99
|
+
) });
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
$ as FloorViewer
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=FloorViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FloorViewer.js","sources":["../../../../src/viewer/FloorViewer.tsx"],"sourcesContent":["// FloorViewer wraps MapCanvas directly — never SiteViewer (which is the full SitePlanner with history,\n// persistence and dialogs). It reads no import.meta.env and imports no stylesheet: hosts import the\n// viewer package's styles.css (which bundles maplibre-gl's own CSS); app entrypoints import both.\nimport { lazy, Suspense, useEffect, useMemo, useState } from 'react';\nimport { openingFloorId } from '../model/project';\nimport type { AssetRepository, Point, ProjectDocument } from '../model/types';\nimport type { StatusReading } from '../model/live';\nimport type { BasemapConfig, CameraState, ElevatorControls, StatusPanelContext } from '../model/host';\nimport type { Route } from '../model/navigation';\nimport type { WalkAvatar } from '../map/walk';\nimport type { ReactNode } from 'react';\nimport { MapCanvas } from '../map/MapCanvas';\nimport { sunAt } from '../map/lighting';\nimport { useKerrosTheme } from '../theme';\n\nconst NO_ASSETS: AssetRepository = { get: async () => undefined, put: async () => {}, delete: async () => {} };\nconst NOOP = () => {};\nconst EMPTY_DRAFT: Point[] = [];\nconst ViewerWorkspace = lazy(() => import('./ViewerWorkspace'));\n\nexport type ViewerMode = '2d' | '3d' | 'walk';\nexport interface ViewerDisplayOptions {\n showLabels: boolean;\n showPlan: boolean;\n coverage: boolean;\n excavation: boolean;\n cityBuildings: boolean;\n cadastre: boolean;\n}\n\nexport interface FloorViewerProps {\n project: ProjectDocument;\n /** Include floor/view controls, structure, graph, directions and read-only properties panels.\n * Omit for a map-only embed with host-owned chrome. Never enables document editing. */\n controls?: boolean;\n /** Repository for reference-drawing images. Omit → drawings are simply not rendered. */\n assets?: AssetRepository;\n /** Complete current status set (replace semantics — the viewer does NOT accumulate deltas; absent devices read as unknown). */\n statuses?: StatusReading[];\n /** Omit → neutralBasemap (offline plan background). */\n basemap?: BasemapConfig;\n /** undefined → viewer manages floors internally, opening on the document's `initialFloorId` when it\n * sets one, else the ground floor (elevation 0, else first). null is a real value: the outdoor site. */\n floorId?: string | null;\n onFloorChange?: (floorId: string | null) => void;\n /** undefined → viewer manages selection internally. */\n selected?: string | null;\n onSelect?: (id: string | null) => void;\n /** Fires as the pointer hovers a plan object (null when leaving). */\n onHoverObject?: (id: string | null) => void;\n threeD?: boolean;\n /** Controlled view mode; takes precedence over the legacy threeD/walk flags. */\n viewMode?: ViewerMode;\n onViewModeChange?: (mode: ViewerMode) => void;\n stack?: boolean;\n onStackChange?: (stack: boolean) => void;\n /** Walk the floor at eye level with keyboard and mouse. Implies threeD; stack is ignored.\n * This is the mode indoor navigation is meant to be read in — a visitor is standing in it. */\n walk?: boolean;\n onWalkExit?: () => void;\n avatar?: WalkAvatar | null;\n onAvatar?: (avatar: WalkAvatar) => void;\n onWalkAt?: (avatar: WalkAvatar) => void;\n /** Focus a listed object, retaining the walking camera when in POV. */\n focusId?: string | null;\n /** Host-owned lift commands and transient readings; never persisted into the plan. */\n elevators?: ElevatorControls;\n route?: Route | null;\n onRouteChange?: (route: Route | null) => void;\n playing?: boolean;\n onPlayingChange?: (playing: boolean) => void;\n activeStep?: number | null;\n onJourneyStep?: (index: number) => void;\n onJourneyEnd?: () => void;\n dark?: boolean;\n showLabels?: boolean;\n showPlan?: boolean;\n coverage?: boolean;\n excavation?: boolean;\n cityBuildings?: boolean;\n cadastre?: boolean;\n /** Updates from built-in display controls. Supplied display props remain controlled. */\n onDisplayChange?: (options: ViewerDisplayOptions) => void;\n renderStatusPanel?: (context: StatusPanelContext) => ReactNode;\n /** Exact camera to restore (deep links); suppresses the automatic fit-to-floor on load. */\n initialCamera?: CameraState;\n /** The underlying MapLibre map, for hosts that deep-link or observe the camera. */\n onReady?: (map: import('maplibre-gl').Map) => void;\n onError?: (message: string) => void;\n}\n\nexport function FloorViewer(props: FloorViewerProps) {\n return props.controls ? (\n <Suspense\n fallback={\n <div className=\"renderer-loading\" role=\"status\">\n Loading viewer…\n </div>\n }\n >\n <ViewerWorkspace key={props.project.id} {...props} />\n </Suspense>\n ) : (\n <FloorCanvas {...props} />\n );\n}\n\nfunction FloorCanvas(props: FloorViewerProps) {\n const { project } = props;\n const themeNotify = useKerrosTheme().notify;\n const [internalFloor, setInternalFloor] = useState<string | null>(() => openingFloorId(project));\n const [internalSelected, setInternalSelected] = useState<string | null>(null);\n // Controlled-when-provided: `!== undefined` (never ??) — controlled null means the outdoor site / no selection.\n const floorId = props.floorId !== undefined ? props.floorId : internalFloor;\n const selected = props.selected !== undefined ? props.selected : internalSelected;\n const walk = props.viewMode ? props.viewMode === 'walk' : (props.walk ?? false);\n const threeD = props.viewMode ? props.viewMode !== '2d' : props.threeD || walk || false;\n const changeFloor = (id: string | null) => {\n if (props.floorId === undefined) setInternalFloor(id);\n props.onFloorChange?.(id);\n };\n const select = (id: string | null) => {\n const entity =\n project.objects.find(o => o.id === id) ??\n project.barriers.find(b => b.id === id) ??\n project.drawings.find(d => d.id === id);\n if (\n entity &&\n entity.floorId !== floorId &&\n !('servedFloorIds' in entity && entity.servedFloorIds?.includes(floorId ?? ''))\n )\n changeFloor(entity.floorId);\n if (props.selected === undefined) setInternalSelected(id);\n props.onSelect?.(id);\n };\n // Swapping the document (same viewer instance): clamp the internally-managed floor to the new\n // project so a stale floor id doesn't strand the viewer on an empty (invisible) floor.\n useEffect(() => {\n if (props.floorId === undefined) setInternalFloor(openingFloorId(project));\n if (props.selected === undefined) setInternalSelected(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [project.id]);\n // Without an asset repository, drawings can't be resolved — don't hand them to the renderer (its\n // loader would surface a spurious \"missing reference image\" error). Documented: omit assets → no drawings.\n const displayProject = useMemo(\n () => (props.assets || !project.drawings.length ? project : { ...project, drawings: [] }),\n [project, props.assets],\n );\n const [tick, setTick] = useState(0);\n useEffect(() => {\n const timer = setInterval(() => setTick(t => t + 1), 5000);\n return () => clearInterval(timer);\n }, []);\n // tick refreshes the Map identity every 5 s so staleness tones re-evaluate without new status data.\n const statuses = useMemo(\n () => new Map([...(props.statuses ?? []), ...(props.elevators?.statuses ?? [])].map(s => [s.feedId, s])),\n [props.statuses, props.elevators?.statuses, tick],\n );\n // The viewer is what a visitor sees, and a visitor is standing in the building at the time they\n // are looking at it: its light should be that light. No switch — the clock and the site's own\n // coordinates decide, and the building's own lamps keep the interior readable after dark.\n const [minute, setMinute] = useState(() => Date.now());\n useEffect(() => {\n const tock = window.setInterval(() => setMinute(Date.now()), 600000);\n return () => window.clearInterval(tock);\n }, []);\n const sun = useMemo(() => sunAt([project.origin[0], project.origin[1]], minute), [project.origin, minute]);\n return (\n <div className={`kerros-root kerros-surface ${props.dark ? 'dark' : ''}`}>\n <MapCanvas\n project={displayProject}\n canEdit={false}\n floorId={floorId}\n selected={selected}\n tool=\"select\"\n draft={EMPTY_DRAFT}\n hover={null}\n threeD={threeD}\n stack={walk ? false : (props.stack ?? false)}\n walk={walk}\n onWalkExit={props.onWalkExit}\n onRequestFloor={changeFloor}\n avatar={props.avatar}\n onAvatar={props.onAvatar}\n onWalkAt={props.onWalkAt}\n focusId={props.focusId}\n route={props.route}\n playing={props.playing}\n activeStep={props.activeStep}\n onJourneyStep={props.onJourneyStep}\n onJourneyEnd={props.onJourneyEnd}\n elevators={props.elevators}\n coverage={props.coverage ?? false}\n showLabels={props.showLabels ?? true}\n showPlan={props.showPlan ?? true}\n sun={sun}\n dark={props.dark ?? false}\n excavation={props.excavation}\n cityBuildings={props.cityBuildings ?? false}\n cadastre={props.cadastre ?? false}\n basemap={props.basemap}\n assets={props.assets ?? NO_ASSETS}\n statuses={statuses}\n onClick={(_, id) => select(id)}\n onHover={NOOP}\n onSelect={select}\n onHoverObject={props.onHoverObject}\n onVertexMove={NOOP}\n onError={props.onError ?? (themeNotify ? (m: string) => themeNotify(m, 'error') : NOOP)}\n initialCamera={props.initialCamera}\n onReady={props.onReady}\n />\n </div>\n );\n}\n"],"names":["NO_ASSETS","NOOP","EMPTY_DRAFT","ViewerWorkspace","lazy","FloorViewer","props","jsx","Suspense","FloorCanvas","project","themeNotify","useKerrosTheme","internalFloor","setInternalFloor","useState","openingFloorId","internalSelected","setInternalSelected","floorId","selected","walk","threeD","changeFloor","id","_a","select","entity","o","b","d","_b","useEffect","displayProject","useMemo","tick","setTick","timer","t","statuses","s","minute","setMinute","tock","sun","sunAt","MapCanvas","_","m"],"mappings":"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"}
|