@kerros/viewer 0.0.0-stage → 0.1.0-rc.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/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 +52 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kyösti Herrala
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @kerros/viewer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An embeddable React viewer for Kerros projects with 2D, 3D, first-person movement, structure views,
|
|
4
|
+
live statuses, indoor routes, and journey playback.
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
npm install @kerros/viewer maplibre-gl three react react-dom
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
```tsx
|
|
11
|
+
import { FloorViewer, emptyProject } from '@kerros/viewer';
|
|
12
|
+
import { setWorkerUrl } from 'maplibre-gl';
|
|
13
|
+
import maplibreWorkerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
|
|
14
|
+
import '@kerros/viewer/styles.css';
|
|
15
|
+
|
|
16
|
+
setWorkerUrl(maplibreWorkerUrl);
|
|
17
|
+
const project = emptyProject([24.938, 60.169], 'Example building');
|
|
18
|
+
|
|
19
|
+
export function App() {
|
|
20
|
+
return <FloorViewer project={project} controls />;
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The worker import above is for Vite. Configure the MapLibre worker with the equivalent mechanism for
|
|
25
|
+
your bundler before rendering a Kerros map.
|
|
26
|
+
|
|
27
|
+
The `@kerros/viewer/host` entry point exposes persistence, theming, status, and schema utilities
|
|
28
|
+
without loading the map renderer. See the [viewer reference](https://github.com/kherrala/kerros/blob/main/docs/reference/viewer.md),
|
|
29
|
+
[getting-started guide](https://github.com/kherrala/kerros/blob/main/docs/guide/getting-started.md), and
|
|
30
|
+
[changelog](https://github.com/kherrala/kerros/blob/main/CHANGELOG.md).
|
|
31
|
+
|
|
32
|
+
MIT licensed.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basemap.js","sources":["../../../../src/adapters/basemap.ts"],"sourcesContent":["import type { BasemapConfig } from '../model/host';\nexport const neutralBasemap: BasemapConfig = {\n style: {\n version: 8,\n sources: {},\n layers: [{ id: 'background', type: 'background', paint: { 'background-color': '#e6e8e4' } }],\n },\n};\n"],"names":["neutralBasemap"],"mappings":"AACO,MAAMA,IAAgC;AAAA,EAC3C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAA;AAAA,IACT,QAAQ,CAAC,EAAE,IAAI,cAAc,MAAM,cAAc,OAAO,EAAE,oBAAoB,YAAU,CAAG;AAAA,EAAA;AAE/F;"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
var u = Object.defineProperty;
|
|
2
|
+
var m = (c, e, t) => e in c ? u(c, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[e] = t;
|
|
3
|
+
var l = (c, e, t) => m(c, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { validateProject as p } from "../model/validate.js";
|
|
5
|
+
const d = "kerros:project:";
|
|
6
|
+
class b {
|
|
7
|
+
async list() {
|
|
8
|
+
const e = [];
|
|
9
|
+
for (let t = 0; t < localStorage.length; t++) {
|
|
10
|
+
const r = localStorage.key(t);
|
|
11
|
+
if (r != null && r.startsWith(d))
|
|
12
|
+
try {
|
|
13
|
+
const a = p(JSON.parse(localStorage.getItem(r)));
|
|
14
|
+
e.push({ id: a.id, name: a.name, updatedAt: a.updatedAt });
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return e.sort((t, r) => r.updatedAt.localeCompare(t.updatedAt));
|
|
19
|
+
}
|
|
20
|
+
async load(e) {
|
|
21
|
+
const t = localStorage.getItem(d + e);
|
|
22
|
+
return t ? p(JSON.parse(t)) : null;
|
|
23
|
+
}
|
|
24
|
+
async save(e) {
|
|
25
|
+
localStorage.setItem(d + e.id, JSON.stringify(e));
|
|
26
|
+
}
|
|
27
|
+
async delete(e) {
|
|
28
|
+
localStorage.removeItem(d + e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
class y {
|
|
32
|
+
constructor(e) {
|
|
33
|
+
l(this, "db");
|
|
34
|
+
this.previous = e;
|
|
35
|
+
}
|
|
36
|
+
open() {
|
|
37
|
+
return this.db ?? (this.db = new Promise((e, t) => {
|
|
38
|
+
const r = indexedDB.open("kerros-projects", 1);
|
|
39
|
+
r.onupgradeneeded = () => r.result.createObjectStore("projects"), r.onsuccess = () => e(r.result), r.onerror = () => t(r.error);
|
|
40
|
+
}).catch((e) => {
|
|
41
|
+
throw this.db = void 0, e;
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
async list() {
|
|
45
|
+
var s;
|
|
46
|
+
const e = await this.open(), [t, r] = await Promise.all([
|
|
47
|
+
new Promise((o, n) => {
|
|
48
|
+
const i = e.transaction("projects").objectStore("projects").getAll();
|
|
49
|
+
i.onsuccess = () => o(i.result), i.onerror = () => n(i.error);
|
|
50
|
+
}),
|
|
51
|
+
((s = this.previous) == null ? void 0 : s.list()) ?? Promise.resolve([])
|
|
52
|
+
]), a = new Map(r.map((o) => [o.id, o]));
|
|
53
|
+
for (const o of t) a.set(o.id, { id: o.id, name: o.name, updatedAt: o.updatedAt });
|
|
54
|
+
return [...a.values()].sort((o, n) => n.updatedAt.localeCompare(o.updatedAt));
|
|
55
|
+
}
|
|
56
|
+
async load(e) {
|
|
57
|
+
var a;
|
|
58
|
+
const t = await this.open(), r = await new Promise((s, o) => {
|
|
59
|
+
const n = t.transaction("projects").objectStore("projects").get(e);
|
|
60
|
+
n.onsuccess = () => s(n.result), n.onerror = () => o(n.error);
|
|
61
|
+
});
|
|
62
|
+
return r === void 0 ? ((a = this.previous) == null ? void 0 : a.load(e)) ?? null : p(r);
|
|
63
|
+
}
|
|
64
|
+
async write(e, t) {
|
|
65
|
+
const r = await this.open();
|
|
66
|
+
await new Promise((a, s) => {
|
|
67
|
+
const o = r.transaction("projects", "readwrite"), n = o.objectStore("projects");
|
|
68
|
+
t ? n.put(t, e) : n.delete(e), o.oncomplete = () => a(), o.onerror = () => s(o.error), o.onabort = () => s(o.error);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async save(e) {
|
|
72
|
+
await this.write(e.id, e);
|
|
73
|
+
}
|
|
74
|
+
async delete(e) {
|
|
75
|
+
var t;
|
|
76
|
+
await ((t = this.previous) == null ? void 0 : t.delete(e)), await this.write(e);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
class S {
|
|
80
|
+
constructor() {
|
|
81
|
+
l(this, "db");
|
|
82
|
+
}
|
|
83
|
+
// Don't cache a rejected open promise — a transient failure (private mode, storage pressure)
|
|
84
|
+
// would otherwise disable all asset access for the session; clear it so the next call retries.
|
|
85
|
+
open() {
|
|
86
|
+
return this.db ?? (this.db = new Promise((e, t) => {
|
|
87
|
+
const r = indexedDB.open("kerros-assets", 1);
|
|
88
|
+
r.onupgradeneeded = () => r.result.createObjectStore("assets"), r.onsuccess = () => e(r.result), r.onerror = () => t(r.error);
|
|
89
|
+
}).catch((e) => {
|
|
90
|
+
throw this.db = void 0, e;
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
async get(e) {
|
|
94
|
+
const t = await this.open();
|
|
95
|
+
return new Promise((r, a) => {
|
|
96
|
+
const s = t.transaction("assets").objectStore("assets").get(e);
|
|
97
|
+
s.onsuccess = () => r(s.result), s.onerror = () => a(s.error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async put(e, t) {
|
|
101
|
+
const r = await this.open();
|
|
102
|
+
return new Promise((a, s) => {
|
|
103
|
+
const o = r.transaction("assets", "readwrite");
|
|
104
|
+
o.objectStore("assets").put(t, e), o.oncomplete = () => a(), o.onerror = () => s(o.error), o.onabort = () => s(o.error);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async delete(e) {
|
|
108
|
+
const t = await this.open();
|
|
109
|
+
return new Promise((r, a) => {
|
|
110
|
+
const s = t.transaction("assets", "readwrite");
|
|
111
|
+
s.objectStore("assets").delete(e), s.oncomplete = () => r(), s.onerror = () => a(s.error);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
S as IndexedAssetRepository,
|
|
117
|
+
y as IndexedProjectRepository,
|
|
118
|
+
b as LocalProjectRepository,
|
|
119
|
+
p as validateProject
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sources":["../../../../src/adapters/persistence.ts"],"sourcesContent":["import type { AssetRepository, ProjectDocument, ProjectRepository, ProjectSummary } from '../model/types';\nimport { validateProject } from '../model/validate';\nexport { validateProject } from '../model/validate';\nexport { exportProject, importProject, blobDataUrl } from '../model/document';\n\nconst PREFIX = 'kerros:project:';\nexport class LocalProjectRepository implements ProjectRepository {\n async list(): Promise<ProjectSummary[]> {\n const result: ProjectSummary[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (!key?.startsWith(PREFIX)) continue;\n try {\n const p = validateProject(JSON.parse(localStorage.getItem(key)!));\n result.push({ id: p.id, name: p.name, updatedAt: p.updatedAt });\n } catch {\n /* Leave corrupt records untouched and exclude them from the picker. */\n }\n }\n return result.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n }\n async load(id: string) {\n const json = localStorage.getItem(PREFIX + id);\n return json ? validateProject(JSON.parse(json)) : null;\n }\n async save(project: ProjectDocument) {\n localStorage.setItem(PREFIX + project.id, JSON.stringify(project));\n }\n async delete(id: string) {\n localStorage.removeItem(PREFIX + id);\n }\n}\n/** Large documents belong in IndexedDB rather than localStorage's small synchronous quota.\n * An optional previous repository keeps existing browser saves readable; new saves take precedence. */\nexport class IndexedProjectRepository implements ProjectRepository {\n private db?: Promise<IDBDatabase>;\n constructor(private previous?: ProjectRepository) {}\n private open() {\n return (this.db ??= new Promise<IDBDatabase>((resolve, reject) => {\n const req = indexedDB.open('kerros-projects', 1);\n req.onupgradeneeded = () => req.result.createObjectStore('projects');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n }).catch(e => {\n this.db = undefined;\n throw e;\n }));\n }\n async list(): Promise<ProjectSummary[]> {\n const db = await this.open();\n const [saved, previous] = await Promise.all([\n new Promise<ProjectDocument[]>((resolve, reject) => {\n const req = db.transaction('projects').objectStore('projects').getAll();\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n }),\n this.previous?.list() ?? Promise.resolve([]),\n ]);\n const summaries = new Map(previous.map(p => [p.id, p]));\n for (const p of saved) summaries.set(p.id, { id: p.id, name: p.name, updatedAt: p.updatedAt });\n return [...summaries.values()].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n }\n async load(id: string): Promise<ProjectDocument | null> {\n const db = await this.open();\n const value = await new Promise<unknown>((resolve, reject) => {\n const req = db.transaction('projects').objectStore('projects').get(id);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n return value === undefined ? (this.previous?.load(id) ?? null) : validateProject(value);\n }\n private async write(id: string, project?: ProjectDocument): Promise<void> {\n const db = await this.open();\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction('projects', 'readwrite'),\n store = tx.objectStore('projects');\n if (project) store.put(project, id);\n else store.delete(id);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n }\n async save(project: ProjectDocument) {\n await this.write(project.id, project);\n }\n async delete(id: string) {\n // Remove an older copy first so a failed legacy deletion cannot resurrect it on the next load.\n await this.previous?.delete(id);\n await this.write(id);\n }\n}\nexport class IndexedAssetRepository implements AssetRepository {\n private db?: Promise<IDBDatabase>;\n // Don't cache a rejected open promise — a transient failure (private mode, storage pressure)\n // would otherwise disable all asset access for the session; clear it so the next call retries.\n private open() {\n return (this.db ??= new Promise<IDBDatabase>((resolve, reject) => {\n const req = indexedDB.open('kerros-assets', 1);\n req.onupgradeneeded = () => req.result.createObjectStore('assets');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n }).catch(e => {\n this.db = undefined;\n throw e;\n }));\n }\n async get(id: string): Promise<Blob | undefined> {\n const db = await this.open();\n return new Promise((resolve, reject) => {\n const req = db.transaction('assets').objectStore('assets').get(id);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n async put(id: string, asset: Blob): Promise<void> {\n const db = await this.open();\n return new Promise((resolve, reject) => {\n const tx = db.transaction('assets', 'readwrite');\n tx.objectStore('assets').put(asset, id);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n }\n async delete(id: string): Promise<void> {\n const db = await this.open();\n return new Promise((resolve, reject) => {\n const tx = db.transaction('assets', 'readwrite');\n tx.objectStore('assets').delete(id);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n }\n}\n"],"names":["PREFIX","LocalProjectRepository","result","i","key","p","validateProject","a","b","id","json","project","IndexedProjectRepository","previous","__publicField","resolve","reject","req","db","saved","_a","summaries","value","tx","store","IndexedAssetRepository","asset"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const t = (n) => ({
|
|
2
|
+
feedId: n,
|
|
3
|
+
tone: "unknown",
|
|
4
|
+
label: "Unknown",
|
|
5
|
+
timestamp: 0
|
|
6
|
+
});
|
|
7
|
+
function r(n, e = Date.now()) {
|
|
8
|
+
return n ? n.tone === "critical" ? "critical" : n.timestamp && e - n.timestamp > 3e4 ? "warning" : n.tone : "unknown";
|
|
9
|
+
}
|
|
10
|
+
function i(n, e = Date.now()) {
|
|
11
|
+
return n ? n.tone === "critical" ? n.label : n.timestamp && e - n.timestamp > 3e4 ? "Stale data" : n.label : "Not connected";
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
i as statusLabel,
|
|
15
|
+
r as statusTone,
|
|
16
|
+
t as unknownStatus
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sources":["../../../../src/adapters/status.ts"],"sourcesContent":["import type { StatusReading, StatusTone } from '../model/live';\n// Pure interpretation helpers for a StatusReading — part of the viewer contract. The only judgement\n// the library makes is timestamp-based staleness (a silent feed can't report its own staleness);\n// everything else is the host-authored tone/label passed straight through.\nconst STALE_MS = 30_000;\nexport const unknownStatus = (feedId: string): StatusReading => ({\n feedId,\n tone: 'unknown',\n label: 'Unknown',\n timestamp: 0,\n});\nexport function statusTone(status?: StatusReading, now = Date.now()): StatusTone {\n if (!status) return 'unknown';\n if (status.tone === 'critical') return 'critical';\n if (status.timestamp && now - status.timestamp > STALE_MS) return 'warning';\n return status.tone;\n}\nexport function statusLabel(status?: StatusReading, now = Date.now()): string {\n if (!status) return 'Not connected';\n if (status.tone === 'critical') return status.label;\n if (status.timestamp && now - status.timestamp > STALE_MS) return 'Stale data';\n return status.label;\n}\n"],"names":["unknownStatus","feedId","statusTone","status","now","statusLabel"],"mappings":"AAKO,MAAMA,IAAgB,CAACC,OAAmC;AAAA,EAC/D,QAAAA;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AACb;AACO,SAASC,EAAWC,GAAwBC,IAAM,KAAK,OAAmB;AAC/E,SAAKD,IACDA,EAAO,SAAS,aAAmB,aACnCA,EAAO,aAAaC,IAAMD,EAAO,YAAY,MAAiB,YAC3DA,EAAO,OAHM;AAItB;AACO,SAASE,EAAYF,GAAwBC,IAAM,KAAK,OAAe;AAC5E,SAAKD,IACDA,EAAO,SAAS,aAAmBA,EAAO,QAC1CA,EAAO,aAAaC,IAAMD,EAAO,YAAY,MAAiB,eAC3DA,EAAO,QAHM;AAItB;"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { jsxs as t, jsx as n, Fragment as y } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo as B, useState as F, useEffect as g } from "react";
|
|
3
|
+
import { distance as G } from "../model/geometry.js";
|
|
4
|
+
import { primaryShafts as H, servedFloors as W } from "../model/vertical.js";
|
|
5
|
+
import { elevatorMirrorFace as J, elevatorMirrorPoint as K, elevatorLanding as $, insideElevator as L, elevatorFacing as O } from "../map/elevators.js";
|
|
6
|
+
function _({
|
|
7
|
+
project: d,
|
|
8
|
+
floorId: a,
|
|
9
|
+
controls: h,
|
|
10
|
+
walker: s,
|
|
11
|
+
riding: o,
|
|
12
|
+
onRide: m,
|
|
13
|
+
onFloor: b,
|
|
14
|
+
requested: E,
|
|
15
|
+
onWave: P,
|
|
16
|
+
soundOn: x,
|
|
17
|
+
onSound: S
|
|
18
|
+
}) {
|
|
19
|
+
const f = B(() => {
|
|
20
|
+
const r = H(d);
|
|
21
|
+
return d.objects.filter(
|
|
22
|
+
(i) => i.kind === "elevator" && i.feedId && r.has(i.id) && W(d, i).some((c) => c.id === a)
|
|
23
|
+
);
|
|
24
|
+
}, [d, a]), [p, u] = F(!1), [A, D] = F(), [C, T] = F(!1), l = f.find((r) => r.id === (o ?? A)) ?? f[0], e = h.statuses.find((r) => r.feedId === (l == null ? void 0 : l.feedId)), v = !!(e != null && e.open) && !e.moving && !e.targetFloorId && e.carFloorId === a, k = o === (l == null ? void 0 : l.id) && v;
|
|
25
|
+
if (g(() => {
|
|
26
|
+
E && u(!0);
|
|
27
|
+
}, [E]), g(() => {
|
|
28
|
+
if (!l) return;
|
|
29
|
+
const r = () => {
|
|
30
|
+
var M;
|
|
31
|
+
const c = (M = s.current) == null ? void 0 : M.position;
|
|
32
|
+
c && (T(G(c, $(l)) < 2.5), L(l, c) && v && !o ? (m(l.id), u(!0)) : !L(l, c) && k && m(null));
|
|
33
|
+
};
|
|
34
|
+
r();
|
|
35
|
+
const i = setInterval(r, 120);
|
|
36
|
+
return () => clearInterval(i);
|
|
37
|
+
}, [l, v, o, k, s, m]), g(() => {
|
|
38
|
+
o && (e != null && e.carFloorId) && !e.targetFloorId && e.carFloorId !== a && (b == null || b(e.carFloorId));
|
|
39
|
+
}, [o, e == null ? void 0 : e.carFloorId, e == null ? void 0 : e.targetFloorId, a, b]), !l) return null;
|
|
40
|
+
const Y = W(d, l).slice().reverse(), I = d.floors.find((r) => r.id === (e == null ? void 0 : e.carFloorId)), N = d.floors.find((r) => r.id === (e == null ? void 0 : e.targetFloorId)), z = (r) => {
|
|
41
|
+
var i;
|
|
42
|
+
!v || !C || (m(r.id), (i = s.current) == null || i.place(r.position, -O(r)));
|
|
43
|
+
};
|
|
44
|
+
return /* @__PURE__ */ t("aside", { className: "walk-elevator", "aria-label": "Elevator controls", children: [
|
|
45
|
+
/* @__PURE__ */ t("button", { className: "elevator-toggle", "aria-expanded": p, onClick: () => u((r) => !r), children: [
|
|
46
|
+
"Elevator controls ",
|
|
47
|
+
/* @__PURE__ */ n("span", { children: p ? "−" : "+" })
|
|
48
|
+
] }),
|
|
49
|
+
p && /* @__PURE__ */ t("div", { className: "elevator-body", children: [
|
|
50
|
+
f.length > 1 ? /* @__PURE__ */ n(
|
|
51
|
+
"select",
|
|
52
|
+
{
|
|
53
|
+
"aria-label": "Choose elevator",
|
|
54
|
+
value: l.id,
|
|
55
|
+
disabled: !!o,
|
|
56
|
+
onChange: (r) => D(r.target.value),
|
|
57
|
+
children: f.map((r) => /* @__PURE__ */ n("option", { value: r.id, children: r.name }, r.id))
|
|
58
|
+
}
|
|
59
|
+
) : /* @__PURE__ */ n("strong", { children: l.name }),
|
|
60
|
+
/* @__PURE__ */ n("p", { role: "status", children: N ? `Travelling to ${N.name}` : `${(e == null ? void 0 : e.label) ?? "Waiting"} · ${(I == null ? void 0 : I.name) ?? "—"}` }),
|
|
61
|
+
o ? /* @__PURE__ */ n("p", { children: "You are inside the elevator." }) : /* @__PURE__ */ t(y, { children: [
|
|
62
|
+
/* @__PURE__ */ n("button", { disabled: !e || e.moving, onClick: () => h.call(l.feedId, a), children: "Call to this floor" }),
|
|
63
|
+
/* @__PURE__ */ n("button", { disabled: !v || !C, onClick: () => z(l), children: "Enter elevator" }),
|
|
64
|
+
!C && /* @__PURE__ */ n("small", { children: "Walk to the elevator doors to enter." })
|
|
65
|
+
] }),
|
|
66
|
+
o && /* @__PURE__ */ n("div", { className: "elevator-floors", "aria-label": "Destination floor", children: Y.map((r) => /* @__PURE__ */ t(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
"aria-pressed": r.id === a,
|
|
70
|
+
disabled: !e || e.moving || r.id === a,
|
|
71
|
+
onClick: () => h.call(l.feedId, r.id),
|
|
72
|
+
children: [
|
|
73
|
+
r.code,
|
|
74
|
+
" · ",
|
|
75
|
+
r.name
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
r.id
|
|
79
|
+
)) }),
|
|
80
|
+
o && /* @__PURE__ */ t(y, { children: [
|
|
81
|
+
/* @__PURE__ */ t("button", { "aria-pressed": x, onClick: S, children: [
|
|
82
|
+
x ? "Cabin music on" : "Cabin music muted",
|
|
83
|
+
" · M"
|
|
84
|
+
] }),
|
|
85
|
+
J(l) && /* @__PURE__ */ t("div", { className: "elevator-door-buttons", children: [
|
|
86
|
+
/* @__PURE__ */ n("button", { onClick: () => {
|
|
87
|
+
var r;
|
|
88
|
+
return (r = s.current) == null ? void 0 : r.lookAt(K(l));
|
|
89
|
+
}, children: "Look in mirror" }),
|
|
90
|
+
/* @__PURE__ */ n("button", { onClick: P, children: "Wave" })
|
|
91
|
+
] })
|
|
92
|
+
] }),
|
|
93
|
+
/* @__PURE__ */ t("div", { className: "elevator-door-buttons", children: [
|
|
94
|
+
/* @__PURE__ */ n(
|
|
95
|
+
"button",
|
|
96
|
+
{
|
|
97
|
+
disabled: !e || e.moving || e.carFloorId !== a,
|
|
98
|
+
onClick: () => h.hold(l.feedId, !(e != null && e.open)),
|
|
99
|
+
children: e != null && e.open ? "Close doors" : "Open doors"
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
o && /* @__PURE__ */ n(
|
|
103
|
+
"button",
|
|
104
|
+
{
|
|
105
|
+
disabled: !k,
|
|
106
|
+
onClick: () => {
|
|
107
|
+
var r;
|
|
108
|
+
m(null), (r = s.current) == null || r.place($(l));
|
|
109
|
+
},
|
|
110
|
+
children: "Exit elevator"
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
] })
|
|
114
|
+
] })
|
|
115
|
+
] });
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
_ as ElevatorPanel
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=ElevatorPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElevatorPanel.js","sources":["../../../../src/components/ElevatorPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport type { ElevatorControls } from '../model/host';\nimport type { ProjectDocument, SiteObject } from '../model/types';\nimport type { WalkController } from '../map/walk';\nimport { distance } from '../model/geometry';\nimport { servedFloors, primaryShafts } from '../model/vertical';\nimport {\n elevatorFacing,\n elevatorLanding,\n elevatorMirrorFace,\n elevatorMirrorPoint,\n insideElevator,\n} from '../map/elevators';\n\nexport function ElevatorPanel({\n project,\n floorId,\n controls,\n walker,\n riding,\n onRide,\n onFloor,\n requested,\n onWave,\n soundOn,\n onSound,\n}: {\n project: ProjectDocument;\n floorId: string | null;\n controls: ElevatorControls;\n walker: { current: WalkController | null };\n riding: string | null;\n onRide(id: string | null): void;\n onFloor?(id: string): void;\n requested: number;\n onWave(): void;\n soundOn: boolean;\n onSound(): void;\n}) {\n const banks = useMemo(() => {\n const primary = primaryShafts(project);\n return project.objects.filter(\n o =>\n o.kind === 'elevator' && o.feedId && primary.has(o.id) && servedFloors(project, o).some(f => f.id === floorId),\n );\n }, [project, floorId]);\n const [expanded, setExpanded] = useState(false),\n [chosen, setChosen] = useState<string>();\n const [near, setNear] = useState(false);\n const object = banks.find(o => o.id === (riding ?? chosen)) ?? banks[0];\n const status = controls.statuses.find(s => s.feedId === object?.feedId);\n const accessible = !!status?.open && !status.moving && !status.targetFloorId && status.carFloorId === floorId;\n const safeExit = riding === object?.id && accessible;\n useEffect(() => {\n if (requested) setExpanded(true);\n }, [requested]);\n useEffect(() => {\n if (!object) return;\n const check = () => {\n const at = walker.current?.position;\n if (!at) return;\n setNear(distance(at, elevatorLanding(object)) < 2.5);\n if (insideElevator(object, at) && accessible && !riding) {\n onRide(object.id);\n setExpanded(true);\n } else if (!insideElevator(object, at) && safeExit) onRide(null);\n };\n check();\n const timer = setInterval(check, 120);\n return () => clearInterval(timer);\n }, [object, accessible, riding, safeExit, walker, onRide]);\n useEffect(() => {\n if (riding && status?.carFloorId && !status.targetFloorId && status.carFloorId !== floorId)\n onFloor?.(status.carFloorId);\n }, [riding, status?.carFloorId, status?.targetFloorId, floorId, onFloor]);\n if (!object) return null;\n const floors = servedFloors(project, object).slice().reverse();\n const at = project.floors.find(f => f.id === status?.carFloorId);\n const destination = project.floors.find(f => f.id === status?.targetFloorId);\n const board = (o: SiteObject) => {\n if (!accessible || !near) return;\n onRide(o.id);\n walker.current?.place(o.position, -elevatorFacing(o));\n };\n return (\n <aside className=\"walk-elevator\" aria-label=\"Elevator controls\">\n <button className=\"elevator-toggle\" aria-expanded={expanded} onClick={() => setExpanded(v => !v)}>\n Elevator controls <span>{expanded ? '−' : '+'}</span>\n </button>\n {expanded && (\n <div className=\"elevator-body\">\n {banks.length > 1 ? (\n <select\n aria-label=\"Choose elevator\"\n value={object.id}\n disabled={!!riding}\n onChange={e => setChosen(e.target.value)}\n >\n {banks.map(o => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n ) : (\n <strong>{object.name}</strong>\n )}\n <p role=\"status\">\n {destination ? `Travelling to ${destination.name}` : `${status?.label ?? 'Waiting'} · ${at?.name ?? '—'}`}\n </p>\n {riding ? (\n <p>You are inside the elevator.</p>\n ) : (\n <>\n <button disabled={!status || status.moving} onClick={() => controls.call(object.feedId!, floorId!)}>\n Call to this floor\n </button>\n <button disabled={!accessible || !near} onClick={() => board(object)}>\n Enter elevator\n </button>\n {!near && <small>Walk to the elevator doors to enter.</small>}\n </>\n )}\n {riding && (\n <div className=\"elevator-floors\" aria-label=\"Destination floor\">\n {floors.map(f => (\n <button\n key={f.id}\n aria-pressed={f.id === floorId}\n disabled={!status || status.moving || f.id === floorId}\n onClick={() => controls.call(object.feedId!, f.id)}\n >\n {f.code} · {f.name}\n </button>\n ))}\n </div>\n )}\n {riding && (\n <>\n <button aria-pressed={soundOn} onClick={onSound}>\n {soundOn ? 'Cabin music on' : 'Cabin music muted'} · M\n </button>\n {elevatorMirrorFace(object) && (\n <div className=\"elevator-door-buttons\">\n <button onClick={() => walker.current?.lookAt(elevatorMirrorPoint(object))}>Look in mirror</button>\n <button onClick={onWave}>Wave</button>\n </div>\n )}\n </>\n )}\n <div className=\"elevator-door-buttons\">\n <button\n disabled={!status || status.moving || status.carFloorId !== floorId}\n onClick={() => controls.hold(object.feedId!, !status?.open)}\n >\n {status?.open ? 'Close doors' : 'Open doors'}\n </button>\n {riding && (\n <button\n disabled={!safeExit}\n onClick={() => {\n onRide(null);\n walker.current?.place(elevatorLanding(object));\n }}\n >\n Exit elevator\n </button>\n )}\n </div>\n </div>\n )}\n </aside>\n );\n}\n"],"names":["ElevatorPanel","project","floorId","controls","walker","riding","onRide","onFloor","requested","onWave","soundOn","onSound","banks","useMemo","primary","primaryShafts","o","servedFloors","f","expanded","setExpanded","useState","chosen","setChosen","near","setNear","object","status","s","accessible","safeExit","useEffect","check","at","_a","distance","elevatorLanding","insideElevator","timer","floors","destination","board","elevatorFacing","jsxs","v","jsx","e","Fragment","elevatorMirrorFace","elevatorMirrorPoint"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { SquareDashed as a, BellRing as m, LogOut as d, BriefcaseMedical as f, FireExtinguisher as h, HeartPulse as w, Info as v, Footprints as S, CarFront as s, ArrowDownToLine as C, PersonStanding as P, ShieldAlert as x, Cpu as D, Siren as L, Lightbulb as R, Activity as q, Square as y, LandPlot as c, Building2 as u, SquareDashedBottom as A, Grid2X2 as B, Package as F, Container as M, MoveDownRight as b, MoveUpRight as I, ArrowUpRight as T, Camera as E, KeyRound as K, ScanLine as O, Fence as l, PanelTop as U, DoorOpen as j, MapPin as G } from "lucide-react";
|
|
3
|
+
import { useKerrosTheme as H } from "../theme/index.js";
|
|
4
|
+
function N({
|
|
5
|
+
kind: e,
|
|
6
|
+
size: o = 17,
|
|
7
|
+
symbol: r,
|
|
8
|
+
travel: p
|
|
9
|
+
}) {
|
|
10
|
+
var t;
|
|
11
|
+
const n = (t = H().icons) == null ? void 0 : t[e === "poi" && r ? r : e];
|
|
12
|
+
if (n)
|
|
13
|
+
return /* @__PURE__ */ i(n, { size: o });
|
|
14
|
+
const g = e === "boundary" ? a : e === "poi" ? {
|
|
15
|
+
personnel: P,
|
|
16
|
+
service: C,
|
|
17
|
+
driveway: s,
|
|
18
|
+
parking: s,
|
|
19
|
+
assembly: S,
|
|
20
|
+
info: v,
|
|
21
|
+
aed: w,
|
|
22
|
+
extinguisher: h,
|
|
23
|
+
firstaid: f,
|
|
24
|
+
exit: d,
|
|
25
|
+
firealarm: m
|
|
26
|
+
}[r ?? "personnel"] : {
|
|
27
|
+
door: j,
|
|
28
|
+
window: U,
|
|
29
|
+
gate: l,
|
|
30
|
+
fence: l,
|
|
31
|
+
wall: a,
|
|
32
|
+
turnstile: O,
|
|
33
|
+
reader: K,
|
|
34
|
+
camera: E,
|
|
35
|
+
elevator: T,
|
|
36
|
+
stairs: p === "down" ? b : I,
|
|
37
|
+
office: u,
|
|
38
|
+
container: M,
|
|
39
|
+
storage: F,
|
|
40
|
+
zone: c,
|
|
41
|
+
room: B,
|
|
42
|
+
enclose: A,
|
|
43
|
+
building: u,
|
|
44
|
+
parcel: c,
|
|
45
|
+
rectangle: y,
|
|
46
|
+
sensor: q,
|
|
47
|
+
light: R,
|
|
48
|
+
alarm: L,
|
|
49
|
+
equipment: D,
|
|
50
|
+
evacuation: x
|
|
51
|
+
}[e] ?? G;
|
|
52
|
+
return /* @__PURE__ */ i(g, { size: o, strokeWidth: 1.75 });
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
N as EntityIcon
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=Icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icons.js","sources":["../../../../src/components/Icons.tsx"],"sourcesContent":["import {\n Activity,\n Lightbulb,\n ArrowDownToLine,\n ArrowUpRight,\n BellRing,\n BriefcaseMedical,\n Building2,\n Camera,\n CarFront,\n Container,\n Cpu,\n DoorOpen,\n Fence,\n FireExtinguisher,\n Footprints,\n Grid2X2,\n HeartPulse,\n Info,\n KeyRound,\n LandPlot,\n LogOut,\n MapPin,\n MoveDownRight,\n MoveUpRight,\n Package,\n PanelTop,\n PersonStanding,\n ScanLine,\n ShieldAlert,\n Siren,\n Square,\n SquareDashed,\n SquareDashedBottom,\n} from 'lucide-react';\nimport type { ObjectKind, SiteObject, Tool } from '../model/types';\nimport { useKerrosTheme } from '../theme';\nexport function EntityIcon({\n kind,\n size = 17,\n symbol,\n travel,\n}: {\n kind: ObjectKind | Tool | 'wall' | 'fence';\n size?: number;\n symbol?: SiteObject['symbol'];\n /** An escalator's direction, so a descending one is not drawn with an arrow pointing up. */\n travel?: SiteObject['travel'];\n}) {\n const custom = useKerrosTheme().icons?.[kind === 'poi' && symbol ? symbol : kind];\n if (custom) {\n const Custom = custom;\n return <Custom size={size} />;\n }\n const Icon =\n kind === 'boundary'\n ? SquareDashed\n : kind === 'poi'\n ? {\n personnel: PersonStanding,\n service: ArrowDownToLine,\n driveway: CarFront,\n parking: CarFront,\n assembly: Footprints,\n info: Info,\n aed: HeartPulse,\n extinguisher: FireExtinguisher,\n firstaid: BriefcaseMedical,\n exit: LogOut,\n firealarm: BellRing,\n }[symbol ?? 'personnel']\n : ((\n {\n door: DoorOpen,\n window: PanelTop,\n gate: Fence,\n fence: Fence,\n wall: SquareDashed,\n turnstile: ScanLine,\n reader: KeyRound,\n camera: Camera,\n elevator: ArrowUpRight,\n stairs: travel === 'down' ? MoveDownRight : MoveUpRight,\n office: Building2,\n container: Container,\n storage: Package,\n zone: LandPlot,\n room: Grid2X2,\n enclose: SquareDashedBottom,\n building: Building2,\n parcel: LandPlot,\n rectangle: Square,\n sensor: Activity,\n light: Lightbulb,\n alarm: Siren,\n equipment: Cpu,\n evacuation: ShieldAlert,\n } as Record<string, typeof MapPin>\n )[kind] ?? MapPin);\n return <Icon size={size} strokeWidth={1.75} />;\n}\n"],"names":["EntityIcon","kind","size","symbol","travel","custom","_a","useKerrosTheme","jsx","Icon","SquareDashed","PersonStanding","ArrowDownToLine","CarFront","Footprints","Info","HeartPulse","FireExtinguisher","BriefcaseMedical","LogOut","BellRing","DoorOpen","PanelTop","Fence","ScanLine","KeyRound","Camera","ArrowUpRight","MoveDownRight","MoveUpRight","Building2","Container","Package","LandPlot","Grid2X2","SquareDashedBottom","Square","Activity","Lightbulb","Siren","Cpu","ShieldAlert","MapPin"],"mappings":";;;AAqCO,SAASA,EAAW;AAAA,EACzB,MAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,QAAAC;AAAA,EACA,QAAAC;AACF,GAMG;;AACD,QAAMC,KAASC,IAAAC,IAAiB,UAAjB,gBAAAD,EAAyBL,MAAS,SAASE,IAASA,IAASF;AAC5E,MAAII;AAEF,WAAO,gBAAAG,EADQH,KACA,MAAAH,GAAY;AAE7B,QAAMO,IACJR,MAAS,aACLS,IACAT,MAAS,QACP;AAAA,IACE,WAAWU;AAAA,IACX,SAASC;AAAA,IACT,UAAUC;AAAA,IACV,SAASA;AAAA,IACT,UAAUC;AAAA,IACV,MAAMC;AAAA,IACN,KAAKC;AAAA,IACL,cAAcC;AAAA,IACd,UAAUC;AAAA,IACV,MAAMC;AAAA,IACN,WAAWC;AAAA,EAAA,EACXjB,KAAU,WAAW,IAErB;AAAA,IACE,MAAMkB;AAAA,IACN,QAAQC;AAAA,IACR,MAAMC;AAAA,IACN,OAAOA;AAAA,IACP,MAAMb;AAAA,IACN,WAAWc;AAAA,IACX,QAAQC;AAAA,IACR,QAAQC;AAAA,IACR,UAAUC;AAAA,IACV,QAAQvB,MAAW,SAASwB,IAAgBC;AAAA,IAC5C,QAAQC;AAAA,IACR,WAAWC;AAAA,IACX,SAASC;AAAA,IACT,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,UAAUL;AAAA,IACV,QAAQG;AAAA,IACR,WAAWG;AAAA,IACX,QAAQC;AAAA,IACR,OAAOC;AAAA,IACP,OAAOC;AAAA,IACP,WAAWC;AAAA,IACX,YAAYC;AAAA,EAAA,EAEdxC,CAAI,KAAKyC;AACnB,SAAO,gBAAAlC,EAACC,GAAA,EAAK,MAAAP,GAAY,aAAa,KAAA,CAAM;AAC9C;"}
|