@nebula-spatial/viewer 0.1.0 → 0.2.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/dist/types.d.ts CHANGED
@@ -1,5 +1,43 @@
1
1
  import type { Box3, ColorRepresentation, Object3D, Vector3 } from 'three';
2
+ import type { CadViewerCapability, CameraStateStore, ViewerUiOptions } from './cad/types';
3
+ export type { CadBlockModel, CadDocumentHandle, CadFontResolver, CadResolvedTextFont, CadHudModel, CadInspectorModel, CadLayerModel, CadLoadSource, CadOpenOptions, CadTextDetails, CadTextSelection, CadTextSelectionId, CadViewerCapability, ResolveTextFont, CadViewerEventMap, CameraStateStore, ViewerUiOptions, ViewerUiParts, ViewerUiPreset, ViewerUiTheme, } from './cad/types';
2
4
  export type ViewerViewMode = '2d' | '3d';
5
+ export type ViewerEnvironment = 'room' | {
6
+ /** Load an external equirectangular HDR texture for image-based lighting. */
7
+ readonly type: 'hdr';
8
+ readonly url: string;
9
+ };
10
+ export interface ViewerDocumentRect {
11
+ readonly minX: number;
12
+ readonly minY: number;
13
+ readonly maxX: number;
14
+ readonly maxY: number;
15
+ }
16
+ export interface ViewerOrthographicSnapshot {
17
+ readonly left: number;
18
+ readonly right: number;
19
+ readonly top: number;
20
+ readonly bottom: number;
21
+ readonly zoom: number;
22
+ readonly positionX: number;
23
+ readonly positionY: number;
24
+ readonly targetX: number;
25
+ readonly targetY: number;
26
+ }
27
+ export interface ViewerOrbitSnapshot {
28
+ readonly targetX: number;
29
+ readonly targetY: number;
30
+ readonly targetZ: number;
31
+ readonly distance: number;
32
+ readonly yaw: number;
33
+ readonly pitch: number;
34
+ }
35
+ export interface ViewerCameraSnapshot {
36
+ readonly schemaVersion: number;
37
+ readonly viewMode: ViewerViewMode;
38
+ readonly orthographic?: ViewerOrthographicSnapshot;
39
+ readonly orbit?: ViewerOrbitSnapshot;
40
+ }
3
41
  export interface ViewerOptions {
4
42
  viewport: HTMLElement;
5
43
  canvas: HTMLCanvasElement;
@@ -8,8 +46,14 @@ export interface ViewerOptions {
8
46
  alpha?: boolean;
9
47
  powerPreference?: WebGLPowerPreference;
10
48
  initialViewMode?: ViewerViewMode;
49
+ /** Image-based lighting environment. Defaults to the built-in room environment. */
50
+ environment?: ViewerEnvironment;
11
51
  autoSelectOnPick?: boolean;
12
52
  pointerPick?: boolean;
53
+ cameraStateStore?: CameraStateStore | false;
54
+ /** Max delay for merged viewport demands while the interaction is active. Default 160ms. */
55
+ viewportDemandCoalesceMs?: number;
56
+ ui?: ViewerUiOptions;
13
57
  }
14
58
  export interface ViewerFitViewOptions {
15
59
  padding?: number;
@@ -31,20 +75,24 @@ export interface ViewerPickResult {
31
75
  export interface ViewerHighlightOptions {
32
76
  color?: ColorRepresentation;
33
77
  }
78
+ export interface ViewerRenderStats {
79
+ readonly drawCalls: number;
80
+ readonly submittedVertexRefs: number;
81
+ readonly fps: number;
82
+ }
83
+ export interface ViewerPointerEvent {
84
+ clientX: number;
85
+ clientY: number;
86
+ buttons: number;
87
+ shiftKey: boolean;
88
+ ctrlKey: boolean;
89
+ metaKey: boolean;
90
+ }
34
91
  export interface ViewerEventMap {
35
- 'pointer-click': {
36
- clientX: number;
37
- clientY: number;
38
- shiftKey: boolean;
39
- ctrlKey: boolean;
40
- metaKey: boolean;
41
- };
42
- pick: {
43
- clientX: number;
44
- clientY: number;
45
- shiftKey: boolean;
46
- ctrlKey: boolean;
47
- metaKey: boolean;
92
+ 'pointer-move': ViewerPointerEvent;
93
+ 'pointer-leave': ViewerPointerEvent;
94
+ 'pointer-click': ViewerPointerEvent;
95
+ pick: ViewerPointerEvent & {
48
96
  result: ViewerPickResult | null;
49
97
  };
50
98
  'selection-change': {
@@ -59,6 +107,21 @@ export interface ViewerEventMap {
59
107
  resize: {
60
108
  resized: boolean;
61
109
  };
110
+ 'viewport-change': {
111
+ viewportWidthPx: number;
112
+ viewportHeightPx: number;
113
+ worldUnitsPerPixel: number;
114
+ interaction: 'active' | 'idle';
115
+ };
116
+ 'interaction-change': {
117
+ interaction: 'active' | 'idle';
118
+ };
119
+ 'content-change': {
120
+ source: 'object' | 'cad';
121
+ };
122
+ 'camera-change': {
123
+ viewMode: ViewerViewMode;
124
+ };
62
125
  }
63
126
  export interface Viewer {
64
127
  readonly viewport: HTMLElement;
@@ -67,10 +130,13 @@ export interface Viewer {
67
130
  readonly selectedObject: Object3D | null;
68
131
  readonly highlightedObject: Object3D | null;
69
132
  readonly isDisposed: boolean;
133
+ readonly cad: CadViewerCapability;
70
134
  addObject(object: Object3D): void;
71
135
  removeObject(object: Object3D): boolean;
72
136
  setVisible(object: Object3D, visible: boolean): void;
73
- setViewMode(mode: ViewerViewMode): void;
137
+ setViewMode(mode: ViewerViewMode, options?: {
138
+ preserveOrbit?: boolean;
139
+ }): void;
74
140
  fitView(target?: Object3D | Box3, options?: ViewerFitViewOptions): boolean;
75
141
  screenToWorldOnPlane(clientX: number, clientY: number, planeZ?: number): Vector3 | null;
76
142
  pick(clientX: number, clientY: number, options?: ViewerPickOptions): ViewerPickResult | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebula-spatial/viewer",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Read-only Three.js viewer facade",
5
5
  "license": "ISC",
6
6
  "engines": {
@@ -10,6 +10,7 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "README.md",
13
+ "CHANGELOG.md",
13
14
  "package.json"
14
15
  ],
15
16
  "main": "./dist/index.js",
@@ -26,7 +27,7 @@
26
27
  "scripts": {
27
28
  "build": "npm run check:boundary && npm run typecheck && npm run build:bundle && npm run build:types && npm run check:dist",
28
29
  "build:bundle": "vite build --config vite.config.ts",
29
- "build:types": "tsc --project tsconfig.build.json",
30
+ "build:types": "tsc --project tsconfig.build.json && node scripts/prune-dist-types.mjs",
30
31
  "check:boundary": "node scripts/check-boundary.mjs",
31
32
  "check:dist": "node scripts/check-dist.mjs",
32
33
  "typecheck": "tsc --project tsconfig.json --noEmit",
@@ -34,14 +35,19 @@
34
35
  "pack:dry": "npm pack --dry-run",
35
36
  "prepack": "npm run build"
36
37
  },
38
+ "dependencies": {
39
+ "@nebula-spatial/cad-loader": "^0.2.1"
40
+ },
37
41
  "peerDependencies": {
38
42
  "three": "0.182.0"
39
43
  },
40
44
  "devDependencies": {
41
45
  "@types/node": "^25.6.0",
46
+ "@types/jsdom": "^27.0.0",
42
47
  "@types/three": "0.182.0",
43
48
  "three": "0.182.0",
44
49
  "typescript": "^5.6.3",
50
+ "jsdom": "^29.0.2",
45
51
  "vite": "^5.4.10",
46
52
  "vitest": "^2.1.8"
47
53
  }