@skenora/lightbox 0.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 ADDED
@@ -0,0 +1,29 @@
1
+ # @skenora/lightbox
2
+
3
+ Strict read-only single-model presentation for Skenora.
4
+
5
+ ```bash
6
+ pnpm add @skenora/lightbox
7
+ ```
8
+
9
+ ```ts
10
+ import { createLightbox } from "@skenora/lightbox";
11
+
12
+ const viewer = await createLightbox({ canvas, model: modelFile });
13
+ viewer.frame();
14
+ viewer.dispose();
15
+ ```
16
+
17
+ Lightbox accepts GLB/glTF `File` bundles or resource-backed asset references,
18
+ requires exactly one model, loads atomically, and provides presets, camera
19
+ views, viewer controls, fullscreen, and capture. It intentionally has no
20
+ editing, Flow, camera-path, or third-person behavior.
21
+
22
+ After a document is ready, `getBackendSnapshot()`,
23
+ `getGpuProgramCacheSnapshot()`, and `await probe()` expose detached backend
24
+ facts, bounded GPU-program cache statistics, and real render/readback evidence
25
+ without exposing Babylon objects.
26
+
27
+ Use `@skenora/sdk/renderer` for read-only multi-model scene playback.
28
+
29
+ See the [Lightbox guide](https://github.com/zhangjiadi225/skenora/blob/main/docs/LIGHTBOX.md).
@@ -0,0 +1,31 @@
1
+ import type { AssetReference } from "@skenora/contracts";
2
+ import { type WorkspaceSource } from "@skenora/workspace";
3
+ import type { LightboxDocumentInput, LightboxModelInput } from "../document/lightbox-document.js";
4
+ import { LightboxSession, type LightboxLoadOptions, type LightboxSessionOptions } from "./lightbox-session.js";
5
+ export interface LightboxFileDependency {
6
+ file: File;
7
+ /** Path relative to the model bundle root. Defaults to webkitRelativePath or name. */
8
+ relativePath?: string;
9
+ }
10
+ export interface LightboxFileModelInput extends Omit<LightboxModelInput, "asset"> {
11
+ file: File;
12
+ assetId?: string;
13
+ /** Path of the primary model inside its in-memory bundle. */
14
+ relativePath?: string;
15
+ dependencies?: readonly (File | LightboxFileDependency)[];
16
+ }
17
+ export type LightboxModelSource = File | AssetReference | LightboxModelInput | LightboxFileModelInput;
18
+ export interface CreateLightboxOptions extends Omit<LightboxDocumentInput, "model"> {
19
+ canvas: HTMLCanvasElement;
20
+ model: LightboxModelSource;
21
+ /** Required only for workspace-backed AssetReference inputs. */
22
+ source?: WorkspaceSource;
23
+ sessionOptions?: LightboxSessionOptions;
24
+ loadOptions?: LightboxLoadOptions;
25
+ }
26
+ /**
27
+ * Creates and loads a read-only viewer from Files or normal AssetReferences.
28
+ * File-backed glTF dependencies are registered in an isolated memory provider.
29
+ */
30
+ export declare function createLightbox(options: CreateLightboxOptions): Promise<LightboxSession>;
31
+ //# sourceMappingURL=create-lightbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-lightbox.d.ts","sourceRoot":"","sources":["../../src/core/create-lightbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAClD,kBAAkB,EAClB,OAAO,CACR;IACC,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,sBAAsB,CAAC,EAAE,CAAC;CAC3D;AAED,MAAM,MAAM,mBAAmB,GAC7B,IAAI,GAAG,cAAc,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAEtE,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CACjD,qBAAqB,EACrB,OAAO,CACR;IACC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,gEAAgE;IAChE,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAoD1B"}
@@ -0,0 +1,123 @@
1
+ import { MemoryResourceProvider, } from "@skenora/resources/memory";
2
+ import { MemoryWorkspaceSource, } from "@skenora/workspace";
3
+ import { LightboxSession, } from "./lightbox-session.js";
4
+ /**
5
+ * Creates and loads a read-only viewer from Files or normal AssetReferences.
6
+ * File-backed glTF dependencies are registered in an isolated memory provider.
7
+ */
8
+ export async function createLightbox(options) {
9
+ const { canvas, model: modelSource, source = new MemoryWorkspaceSource(), sessionOptions = {}, loadOptions = {}, ...documentOptions } = options;
10
+ const memoryEntries = {};
11
+ const model = normalizeModelSource(modelSource, memoryEntries);
12
+ const hasMemoryModels = Object.keys(memoryEntries).length > 0;
13
+ if (hasMemoryModels && sessionOptions.resources) {
14
+ throw new Error("File-backed Lightbox models cannot be combined with a host-owned resolver");
15
+ }
16
+ if (hasMemoryModels &&
17
+ sessionOptions.resourceProviders?.some((provider) => provider.type === "memory")) {
18
+ throw new Error("File-backed Lightbox models require the factory-owned memory provider");
19
+ }
20
+ const memoryProvider = hasMemoryModels
21
+ ? new MemoryResourceProvider(memoryEntries)
22
+ : null;
23
+ const resourceProviders = [
24
+ ...(sessionOptions.resourceProviders ?? []),
25
+ ...(memoryProvider ? [memoryProvider] : []),
26
+ ];
27
+ const session = new LightboxSession(canvas, source, {
28
+ ...sessionOptions,
29
+ ...(resourceProviders.length > 0 ? { resourceProviders } : {}),
30
+ });
31
+ try {
32
+ await session.load({
33
+ ...documentOptions,
34
+ model,
35
+ }, loadOptions);
36
+ return session;
37
+ }
38
+ catch (error) {
39
+ session.dispose();
40
+ throw error;
41
+ }
42
+ }
43
+ function normalizeModelSource(value, memoryEntries) {
44
+ if (value instanceof File) {
45
+ return registerFileModel({ file: value }, memoryEntries);
46
+ }
47
+ if (isFileModelInput(value)) {
48
+ return registerFileModel(value, memoryEntries);
49
+ }
50
+ if (isAssetReference(value))
51
+ return { asset: structuredClone(value) };
52
+ return structuredClone(value);
53
+ }
54
+ function registerFileModel(input, memoryEntries) {
55
+ const bundleRoot = "lightbox/model";
56
+ const primaryPath = normalizeBundlePath(input.relativePath ?? browserRelativePath(input.file));
57
+ const primaryKey = `${bundleRoot}/${primaryPath}`;
58
+ memoryEntries[primaryKey] = {
59
+ blob: input.file,
60
+ descriptor: {
61
+ id: primaryKey,
62
+ label: input.name ?? input.file.name,
63
+ kind: "model",
64
+ ...(input.file.type ? { mediaType: input.file.type } : {}),
65
+ },
66
+ };
67
+ for (const dependency of input.dependencies ?? []) {
68
+ const item = dependency instanceof File ? { file: dependency } : dependency;
69
+ const relativePath = normalizeBundlePath(item.relativePath ?? browserRelativePath(item.file));
70
+ const key = `${bundleRoot}/${relativePath}`;
71
+ if (memoryEntries[key]) {
72
+ throw new Error(`Lightbox model bundle contains a duplicate path: ${relativePath}`);
73
+ }
74
+ memoryEntries[key] = {
75
+ blob: item.file,
76
+ descriptor: {
77
+ id: key,
78
+ label: item.file.name,
79
+ kind: "data",
80
+ ...(item.file.type ? { mediaType: item.file.type } : {}),
81
+ },
82
+ };
83
+ }
84
+ const asset = {
85
+ id: input.assetId ?? "lightbox-asset",
86
+ kind: "model",
87
+ label: input.name ?? input.file.name,
88
+ source: { type: "memory", key: primaryKey },
89
+ ...(input.file.type ? { mediaType: input.file.type } : {}),
90
+ };
91
+ return {
92
+ asset,
93
+ ...(input.id ? { id: input.id } : {}),
94
+ ...(input.name ? { name: input.name } : {}),
95
+ ...(input.transform ? { transform: structuredClone(input.transform) } : {}),
96
+ ...(input.orientation ? { orientation: input.orientation } : {}),
97
+ ...(input.alignment ? { alignment: structuredClone(input.alignment) } : {}),
98
+ };
99
+ }
100
+ function browserRelativePath(file) {
101
+ const relative = file
102
+ .webkitRelativePath;
103
+ return relative || file.name;
104
+ }
105
+ function normalizeBundlePath(path) {
106
+ const normalized = path.replaceAll("\\", "/").replace(/^\.\//u, "");
107
+ if (!normalized ||
108
+ normalized.startsWith("/") ||
109
+ normalized.includes("\0") ||
110
+ normalized
111
+ .split("/")
112
+ .some((segment) => !segment || segment === "." || segment === "..")) {
113
+ throw new Error(`Lightbox model bundle path is invalid: ${path}`);
114
+ }
115
+ return normalized;
116
+ }
117
+ function isAssetReference(value) {
118
+ return !(value instanceof File) && "kind" in value;
119
+ }
120
+ function isFileModelInput(value) {
121
+ return !(value instanceof File) && "file" in value;
122
+ }
123
+ //# sourceMappingURL=create-lightbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-lightbox.js","sourceRoot":"","sources":["../../src/core/create-lightbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type GpuProgramCacheSnapshot, type RuntimeBackendSnapshot, type RuntimeProbeReport, type SceneDocumentData } from "@skenora/contracts";
2
+ import { type SceneCameraView, type SceneCaptureOptions, type SceneCaptureRegion, type SceneRendererOptions } from "@skenora/runtime";
3
+ import { type ResourceProvider, type ResourceResolver } from "@skenora/resources";
4
+ import type { WorkspaceSource } from "@skenora/workspace";
5
+ import { type LightboxDocumentInput } from "../document/lightbox-document.js";
6
+ export interface LightboxSessionOptions extends Omit<SceneRendererOptions, "executionMode"> {
7
+ /** Optional host-owned resolver. Defaults to a local workspace provider. */
8
+ resources?: ResourceResolver;
9
+ /** Additional providers installed beside the default workspace provider. */
10
+ resourceProviders?: readonly ResourceProvider[];
11
+ }
12
+ export type CaptureRegion = SceneCaptureRegion;
13
+ export type LightboxCaptureOptions = SceneCaptureOptions;
14
+ export type LightboxCameraView = SceneCameraView;
15
+ export interface LightboxLoadOptions {
16
+ signal?: AbortSignal;
17
+ }
18
+ export type LightboxStatus = "idle" | "loading" | "ready" | "error" | "disposed";
19
+ export type LightboxStatusListener = (status: LightboxStatus, error: unknown | null) => void;
20
+ export declare class LightboxSession {
21
+ #private;
22
+ constructor(canvas: HTMLCanvasElement, source: WorkspaceSource, options?: LightboxSessionOptions);
23
+ get documentId(): string | null;
24
+ get status(): LightboxStatus;
25
+ get error(): unknown | null;
26
+ getBackendSnapshot(): RuntimeBackendSnapshot;
27
+ getGpuProgramCacheSnapshot(): GpuProgramCacheSnapshot;
28
+ probe(): Promise<RuntimeProbeReport>;
29
+ subscribeStatus(listener: LightboxStatusListener, options?: {
30
+ signal?: AbortSignal;
31
+ immediate?: boolean;
32
+ }): () => void;
33
+ load(input: SceneDocumentData | LightboxDocumentInput, options?: LightboxLoadOptions): Promise<void>;
34
+ frame(): void;
35
+ setView(view: LightboxCameraView): void;
36
+ resetView(view?: LightboxCameraView): void;
37
+ setAutoRotate(enabled: boolean, speed?: number): void;
38
+ resize(): void;
39
+ pause(): void;
40
+ resume(): void;
41
+ capture(options?: LightboxCaptureOptions): Promise<Blob>;
42
+ toggleFullscreen(element?: HTMLElement): Promise<boolean>;
43
+ dispose(): void;
44
+ }
45
+ export declare function computeCenteredCrop(width: number, height: number, aspectRatio: number, padding?: number): CaptureRegion;
46
+ //# sourceMappingURL=lightbox-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox-session.d.ts","sourceRoot":"","sources":["../../src/core/lightbox-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAClD,oBAAoB,EACpB,eAAe,CAChB;IACC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAED,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAC/C,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AACzD,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AACjD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GACxB,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,sBAAsB,GAAG,CACnC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,OAAO,GAAG,IAAI,KAClB,IAAI,CAAC;AAEV,qBAAa,eAAe;;gBAcxB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,sBAA2B;IA8BtC,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,CAE1B;IAED,kBAAkB,IAAI,sBAAsB;IAK5C,0BAA0B,IAAI,uBAAuB;IAKrD,KAAK,IAAI,OAAO,CAAC,kBAAkB,CAAC;IASpC,eAAe,CACb,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAC1D,MAAM,IAAI;IAqBP,IAAI,CACR,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,EAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC;IAsChB,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAKvC,SAAS,CAAC,IAAI,GAAE,kBAA4B,GAAG,IAAI;IAKnD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,SAAO,GAAG,IAAI;IAKnD,MAAM,IAAI,IAAI;IAKd,KAAK,IAAI,IAAI;IAKb,MAAM,IAAI,IAAI;IAKd,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD,gBAAgB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAa/D,OAAO,IAAI,IAAI;CA4ChB;AAmBD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,SAAI,GACV,aAAa,CAqCf"}
@@ -0,0 +1,323 @@
1
+ import { assertSceneDocument, normalizeSceneDocument, } from "@skenora/contracts";
2
+ import { SceneRenderer, } from "@skenora/runtime";
3
+ import {} from "@skenora/resources";
4
+ import { createWorkspaceResourceContext, } from "@skenora/resources/workspace";
5
+ import { createLightboxDocument, } from "../document/lightbox-document.js";
6
+ export class LightboxSession {
7
+ #resources;
8
+ #resourceContext;
9
+ #renderer;
10
+ #documentId = null;
11
+ #status = "idle";
12
+ #error = null;
13
+ #loadGeneration = 0;
14
+ #statusListeners = new Set();
15
+ #statusUnsubscribers = new Set();
16
+ #onStatusListenerError;
17
+ #disposed = false;
18
+ constructor(canvas, source, options = {}) {
19
+ this.#resourceContext = createWorkspaceResourceContext(source, {
20
+ ...(options.resources ? { resources: options.resources } : {}),
21
+ ...(options.resourceProviders
22
+ ? { resourceProviders: options.resourceProviders }
23
+ : {}),
24
+ });
25
+ this.#resources = this.#resourceContext.resources;
26
+ this.#renderer = new SceneRenderer(canvas, {
27
+ ...(options.antialias === undefined
28
+ ? {}
29
+ : { antialias: options.antialias }),
30
+ ...(options.engineOptions === undefined
31
+ ? {}
32
+ : { engineOptions: options.engineOptions }),
33
+ ...(options.adaptToDeviceRatio === undefined
34
+ ? {}
35
+ : { adaptToDeviceRatio: options.adaptToDeviceRatio }),
36
+ ...(options.autoResize === undefined
37
+ ? {}
38
+ : { autoResize: options.autoResize }),
39
+ ...(options.onStatusListenerError === undefined
40
+ ? {}
41
+ : { onStatusListenerError: options.onStatusListenerError }),
42
+ });
43
+ this.#onStatusListenerError =
44
+ options.onStatusListenerError ?? (() => undefined);
45
+ }
46
+ get documentId() {
47
+ return this.#documentId;
48
+ }
49
+ get status() {
50
+ return this.#status;
51
+ }
52
+ get error() {
53
+ return this.#error;
54
+ }
55
+ getBackendSnapshot() {
56
+ this.#assertActive();
57
+ return this.#renderer.getBackendSnapshot();
58
+ }
59
+ getGpuProgramCacheSnapshot() {
60
+ this.#assertActive();
61
+ return this.#renderer.getGpuProgramCacheSnapshot();
62
+ }
63
+ probe() {
64
+ this.#assertActive();
65
+ if (this.#status !== "ready")
66
+ return Promise.reject(new Error("A lightbox document must be ready before probing"));
67
+ return this.#renderer.probe();
68
+ }
69
+ subscribeStatus(listener, options = {}) {
70
+ this.#assertActive();
71
+ if (options.signal?.aborted)
72
+ return () => undefined;
73
+ this.#statusListeners.add(listener);
74
+ if (options.immediate ?? true) {
75
+ try {
76
+ listener(this.#status, this.#error);
77
+ }
78
+ catch (listenerError) {
79
+ this.#reportStatusListenerError(listenerError);
80
+ }
81
+ }
82
+ const unsubscribe = () => {
83
+ this.#statusListeners.delete(listener);
84
+ options.signal?.removeEventListener("abort", unsubscribe);
85
+ this.#statusUnsubscribers.delete(unsubscribe);
86
+ };
87
+ this.#statusUnsubscribers.add(unsubscribe);
88
+ options.signal?.addEventListener("abort", unsubscribe, { once: true });
89
+ return unsubscribe;
90
+ }
91
+ async load(input, options = {}) {
92
+ this.#assertActive();
93
+ let candidate;
94
+ try {
95
+ const normalized = isSceneDocument(input)
96
+ ? normalizeSceneDocument(structuredClone(input))
97
+ : createLightboxDocument(input);
98
+ assertSceneDocument(normalized);
99
+ assertSingleModelLightbox(normalized);
100
+ candidate = normalized;
101
+ }
102
+ catch (error) {
103
+ if (this.#status !== "ready")
104
+ this.#setStatus("error", error);
105
+ throw error;
106
+ }
107
+ const generation = ++this.#loadGeneration;
108
+ this.#documentId = null;
109
+ this.#setStatus("loading");
110
+ try {
111
+ await this.#renderer.load(candidate, this.#resources, {
112
+ ...(options.signal ? { signal: options.signal } : {}),
113
+ modelLoadPolicy: "strict",
114
+ });
115
+ if (generation !== this.#loadGeneration)
116
+ return;
117
+ const initialView = resolveInitialView(candidate);
118
+ const controls = resolveControls(candidate);
119
+ this.#renderer.configureViewerControls(controls);
120
+ if (initialView !== "document")
121
+ this.#renderer.resetView(initialView);
122
+ this.#documentId = candidate.id;
123
+ this.#setStatus("ready");
124
+ }
125
+ catch (error) {
126
+ if (generation === this.#loadGeneration) {
127
+ const aborted = isAbortError(error);
128
+ this.#setStatus(aborted ? "idle" : "error", aborted ? null : error);
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ frame() {
134
+ this.#assertActive();
135
+ this.#renderer.frame();
136
+ }
137
+ setView(view) {
138
+ this.#assertActive();
139
+ this.#renderer.setView(view);
140
+ }
141
+ resetView(view = "front") {
142
+ this.#assertActive();
143
+ this.#renderer.resetView(view);
144
+ }
145
+ setAutoRotate(enabled, speed = 0.15) {
146
+ this.#assertActive();
147
+ this.#renderer.setAutoRotate(enabled, speed);
148
+ }
149
+ resize() {
150
+ this.#assertActive();
151
+ this.#renderer.resize();
152
+ }
153
+ pause() {
154
+ this.#assertActive();
155
+ this.#renderer.pause();
156
+ }
157
+ resume() {
158
+ this.#assertActive();
159
+ this.#renderer.resume();
160
+ }
161
+ capture(options = {}) {
162
+ this.#assertActive();
163
+ if (this.#status !== "ready") {
164
+ return Promise.reject(new Error("A lightbox document must be ready before capture"));
165
+ }
166
+ return this.#renderer.capture(options);
167
+ }
168
+ async toggleFullscreen(element) {
169
+ this.#assertActive();
170
+ const canvas = this.#renderer.canvas;
171
+ const ownerDocument = canvas.ownerDocument;
172
+ if (ownerDocument.fullscreenElement) {
173
+ await ownerDocument.exitFullscreen();
174
+ return false;
175
+ }
176
+ const target = element ?? canvas.parentElement ?? canvas;
177
+ await target.requestFullscreen();
178
+ return true;
179
+ }
180
+ dispose() {
181
+ if (this.#disposed)
182
+ return;
183
+ this.#loadGeneration += 1;
184
+ this.#setStatus("disposed");
185
+ this.#disposed = true;
186
+ try {
187
+ this.#renderer.dispose();
188
+ }
189
+ finally {
190
+ try {
191
+ this.#resourceContext.ownedResources?.dispose();
192
+ }
193
+ finally {
194
+ this.#documentId = null;
195
+ for (const unsubscribe of [...this.#statusUnsubscribers]) {
196
+ unsubscribe();
197
+ }
198
+ this.#statusUnsubscribers.clear();
199
+ this.#statusListeners.clear();
200
+ }
201
+ }
202
+ }
203
+ #setStatus(status, error = null) {
204
+ this.#status = status;
205
+ this.#error = error;
206
+ for (const listener of [...this.#statusListeners]) {
207
+ try {
208
+ listener(status, error);
209
+ }
210
+ catch (listenerError) {
211
+ this.#reportStatusListenerError(listenerError);
212
+ }
213
+ }
214
+ }
215
+ #reportStatusListenerError(error) {
216
+ try {
217
+ this.#onStatusListenerError(error);
218
+ }
219
+ catch {
220
+ // Listener diagnostics must not interrupt lightbox lifecycle changes.
221
+ }
222
+ }
223
+ #assertActive() {
224
+ if (this.#disposed)
225
+ throw new Error("LightboxSession has been disposed");
226
+ }
227
+ }
228
+ function isAbortError(error) {
229
+ return error?.name === "AbortError";
230
+ }
231
+ function assertSingleModelLightbox(document) {
232
+ const modelCount = Object.values(document.entities).filter((entity) => entity.type === "model").length;
233
+ if (modelCount !== 1) {
234
+ throw new Error(`Lightbox requires exactly one model entity; received ${modelCount}`);
235
+ }
236
+ }
237
+ export function computeCenteredCrop(width, height, aspectRatio, padding = 0) {
238
+ if (!Number.isFinite(width) ||
239
+ !Number.isFinite(height) ||
240
+ !Number.isFinite(aspectRatio) ||
241
+ !Number.isFinite(padding) ||
242
+ width <= 0 ||
243
+ height <= 0 ||
244
+ aspectRatio <= 0 ||
245
+ padding < 0) {
246
+ throw new Error("Capture dimensions, ratio, and padding must be valid");
247
+ }
248
+ const availableWidth = Math.max(width - padding * 2, 0);
249
+ const availableHeight = Math.max(height - padding * 2, 0);
250
+ if (availableWidth === 0 || availableHeight === 0) {
251
+ throw new Error("Capture padding leaves no crop area");
252
+ }
253
+ const availableRatio = availableWidth / availableHeight;
254
+ const cropWidth = availableRatio > aspectRatio
255
+ ? availableHeight * aspectRatio
256
+ : availableWidth;
257
+ const cropHeight = availableRatio > aspectRatio
258
+ ? availableHeight
259
+ : availableWidth / aspectRatio;
260
+ const result = {
261
+ x: Math.round(padding + (availableWidth - cropWidth) / 2),
262
+ y: Math.round(padding + (availableHeight - cropHeight) / 2),
263
+ width: Math.round(cropWidth),
264
+ height: Math.round(cropHeight),
265
+ };
266
+ if (result.width < 1 || result.height < 1) {
267
+ throw new Error("Capture aspect ratio produces an empty crop");
268
+ }
269
+ return result;
270
+ }
271
+ function isSceneDocument(input) {
272
+ return "schema" in input && input.schema === "skenora.scene";
273
+ }
274
+ function resolveInitialView(input) {
275
+ const extension = input.extensions["skenora.lightbox"];
276
+ if (extension &&
277
+ typeof extension === "object" &&
278
+ !Array.isArray(extension) &&
279
+ "initialView" in extension &&
280
+ isInitialView(extension.initialView)) {
281
+ return extension.initialView;
282
+ }
283
+ return "document";
284
+ }
285
+ function isInitialView(value) {
286
+ return (typeof value === "string" &&
287
+ [
288
+ "document",
289
+ "front",
290
+ "back",
291
+ "left",
292
+ "right",
293
+ "top",
294
+ "bottom",
295
+ "perspective",
296
+ ].includes(value));
297
+ }
298
+ function resolveControls(input) {
299
+ const extension = input.extensions["skenora.lightbox"];
300
+ if (!extension || typeof extension !== "object" || Array.isArray(extension)) {
301
+ return {};
302
+ }
303
+ const controls = "controls" in extension ? extension.controls : undefined;
304
+ if (!controls || typeof controls !== "object" || Array.isArray(controls)) {
305
+ return {};
306
+ }
307
+ return {
308
+ ...("zoom" in controls && typeof controls.zoom === "boolean"
309
+ ? { zoom: controls.zoom }
310
+ : {}),
311
+ ...("orbit" in controls && typeof controls.orbit === "boolean"
312
+ ? { orbit: controls.orbit }
313
+ : {}),
314
+ ...("verticalOrbit" in controls &&
315
+ typeof controls.verticalOrbit === "boolean"
316
+ ? { verticalOrbit: controls.verticalOrbit }
317
+ : {}),
318
+ ...("pan" in controls && typeof controls.pan === "boolean"
319
+ ? { pan: controls.pan }
320
+ : {}),
321
+ };
322
+ }
323
+ //# sourceMappingURL=lightbox-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox-session.js","sourceRoot":"","sources":["../../src/core/lightbox-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /** Creates a minimal read-only scene document for presentation. */
2
+ import { type AssetReference, type EnvironmentConfig, type FogConfig, type GroundConfig, type LightConfig, type ModelAlignmentConfig, type MaterialOverride, type PostProcessConfig, type SceneDocumentData, type TransformValue, type ViewportCameraConfig, type WeatherConfig } from "@skenora/contracts";
3
+ type EnvironmentInput = Partial<Omit<EnvironmentConfig, "background">> & {
4
+ background?: Partial<EnvironmentConfig["background"]>;
5
+ };
6
+ type PostProcessInput = Partial<Omit<PostProcessConfig, "colorCurves" | "ssao">> & {
7
+ colorCurves?: Partial<PostProcessConfig["colorCurves"]>;
8
+ ssao?: Partial<PostProcessConfig["ssao"]>;
9
+ };
10
+ export type LightboxInitialView = "document" | "front" | "back" | "left" | "right" | "top" | "bottom" | "perspective";
11
+ export type LightboxPreset = "neutral" | "studio" | "transparent";
12
+ export type LightboxModelOrientation = "front" | "back" | "left" | "right";
13
+ export interface LightboxControlsConfig {
14
+ zoom?: boolean;
15
+ orbit?: boolean;
16
+ verticalOrbit?: boolean;
17
+ pan?: boolean;
18
+ }
19
+ export interface LightboxModelInput {
20
+ id?: string;
21
+ asset: AssetReference;
22
+ name?: string;
23
+ transform?: Partial<TransformValue>;
24
+ /** Explicit convenience preset; it never attempts to infer the model front. */
25
+ orientation?: LightboxModelOrientation;
26
+ alignment?: ModelAlignmentConfig;
27
+ }
28
+ export interface LightboxDocumentInput {
29
+ id?: string;
30
+ name?: string;
31
+ /** Lightbox is intentionally limited to one presentation model. */
32
+ model: AssetReference | LightboxModelInput;
33
+ assets?: readonly AssetReference[];
34
+ /** Compact presentation defaults. Individual settings always take precedence. */
35
+ preset?: LightboxPreset;
36
+ /** Backward-compatible transform for a single model. */
37
+ transform?: Partial<TransformValue>;
38
+ initialView?: LightboxInitialView;
39
+ controls?: LightboxControlsConfig;
40
+ camera?: Partial<ViewportCameraConfig>;
41
+ environment?: EnvironmentInput;
42
+ ground?: Partial<GroundConfig>;
43
+ fog?: Partial<FogConfig>;
44
+ weather?: Partial<WeatherConfig>;
45
+ lights?: readonly LightConfig[];
46
+ materials?: readonly MaterialOverride[];
47
+ postProcess?: PostProcessInput;
48
+ }
49
+ export declare function createLightboxDocument(input: LightboxDocumentInput): SceneDocumentData;
50
+ export {};
51
+ //# sourceMappingURL=lightbox-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox-document.d.ts","sourceRoot":"","sources":["../../src/document/lightbox-document.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAE5B,KAAK,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,GAAG;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,KAAK,gBAAgB,GAAG,OAAO,CAC7B,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,MAAM,CAAC,CAChD,GAAG;IACF,WAAW,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,UAAU,GACV,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;AAClE,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,+EAA+E;IAC/E,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,cAAc,GAAG,kBAAkB,CAAC;IAC3C,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,iFAAiF;IACjF,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,iBAAiB,CAiJnB"}
@@ -0,0 +1,246 @@
1
+ /** Creates a minimal read-only scene document for presentation. */
2
+ import { assertSceneDocument, createMaterialBindingId, createEmptySceneDocument, createIdentityTransform, toMaterialDefinition, } from "@skenora/contracts";
3
+ export function createLightboxDocument(input) {
4
+ validateLightboxOptions(input);
5
+ const id = input.id ?? "lightbox";
6
+ const document = createEmptySceneDocument(id, input.name ?? "Lightbox");
7
+ document.postProcess.enabled = false;
8
+ applyLightboxPreset(document, input.preset ?? "studio");
9
+ const identity = createIdentityTransform();
10
+ const model = normalizeModel(input.model);
11
+ const assetMap = new Map();
12
+ for (const asset of [model.asset, ...(input.assets ?? [])]) {
13
+ const existing = assetMap.get(asset.id);
14
+ if (existing && !areStructurallyEqual(existing, asset)) {
15
+ throw new Error(`Lightbox asset id has conflicting definitions: ${asset.id}`);
16
+ }
17
+ assetMap.set(asset.id, structuredClone(asset));
18
+ }
19
+ document.assets = Object.fromEntries(assetMap);
20
+ const entityId = model.id ?? "lightbox-model";
21
+ const transform = model.transform ?? input.transform;
22
+ const defaultAlignment = {
23
+ pivot: "bounds-center",
24
+ placement: "center",
25
+ embeddedLights: "remove",
26
+ materialCompatibility: "presentation",
27
+ };
28
+ const entity = {
29
+ id: entityId,
30
+ name: model.name ?? model.asset.label ?? "Model",
31
+ type: "model",
32
+ parentId: null,
33
+ enabled: true,
34
+ visible: true,
35
+ assetId: model.asset.id,
36
+ transform: {
37
+ position: structuredClone(transform?.position ?? identity.position),
38
+ rotation: structuredClone(transform?.rotation ?? identity.rotation),
39
+ scaling: structuredClone(transform?.scaling ?? identity.scaling),
40
+ ...(transform?.rotationQuaternion
41
+ ? {
42
+ rotationQuaternion: structuredClone(transform.rotationQuaternion),
43
+ }
44
+ : {}),
45
+ },
46
+ properties: {
47
+ alignment: {
48
+ ...defaultAlignment,
49
+ ...orientationAlignment(model.orientation),
50
+ ...model.alignment,
51
+ },
52
+ },
53
+ };
54
+ document.entities = { [entity.id]: entity };
55
+ document.rootEntityIds = [entity.id];
56
+ document.camera = { ...document.camera, ...input.camera };
57
+ document.environment = {
58
+ ...document.environment,
59
+ ...input.environment,
60
+ background: {
61
+ ...document.environment.background,
62
+ ...input.environment?.background,
63
+ },
64
+ };
65
+ document.ground = {
66
+ ...document.ground,
67
+ ...input.ground,
68
+ ...(input.ground?.enabled && input.ground.fitToScene === undefined
69
+ ? { fitToScene: true }
70
+ : {}),
71
+ };
72
+ document.fog = {
73
+ ...document.fog,
74
+ ...input.fog,
75
+ color: { ...document.fog.color, ...input.fog?.color },
76
+ };
77
+ document.weather = {
78
+ ...document.weather,
79
+ ...input.weather,
80
+ wind: { ...document.weather.wind, ...input.weather?.wind },
81
+ };
82
+ if (input.lights)
83
+ document.lights = [...input.lights];
84
+ const materials = input.materials ?? [];
85
+ if (new Set(materials.map((material) => material.id)).size !== materials.length) {
86
+ throw new Error("Lightbox materials must have unique ids");
87
+ }
88
+ document.materials = Object.fromEntries(materials.map((material) => [material.id, toMaterialDefinition(material)]));
89
+ const occupiedBindingIds = new Set();
90
+ document.materialBindings = Object.fromEntries(materials.flatMap((material) => {
91
+ if (!material.targetEntityId ||
92
+ !document.entities[material.targetEntityId]) {
93
+ return [];
94
+ }
95
+ const bindingId = createMaterialBindingId(material.id, material.targetEntityId, material.targetName, occupiedBindingIds);
96
+ occupiedBindingIds.add(bindingId);
97
+ return [
98
+ [
99
+ bindingId,
100
+ {
101
+ id: bindingId,
102
+ materialId: material.id,
103
+ entityId: material.targetEntityId,
104
+ ...(material.targetName ? { targetName: material.targetName } : {}),
105
+ },
106
+ ],
107
+ ];
108
+ }));
109
+ document.postProcess = {
110
+ ...document.postProcess,
111
+ ...input.postProcess,
112
+ colorCurves: {
113
+ ...document.postProcess.colorCurves,
114
+ ...input.postProcess?.colorCurves,
115
+ },
116
+ ssao: {
117
+ ...document.postProcess.ssao,
118
+ ...input.postProcess?.ssao,
119
+ },
120
+ };
121
+ document.extensions["skenora.lightbox"] = {
122
+ initialView: input.initialView ??
123
+ (hasExplicitCameraView(input.camera) ? "document" : "perspective"),
124
+ controls: {
125
+ zoom: input.controls?.zoom ?? true,
126
+ orbit: input.controls?.orbit ?? true,
127
+ verticalOrbit: input.controls?.verticalOrbit ?? true,
128
+ pan: input.controls?.pan ?? true,
129
+ },
130
+ };
131
+ assertSceneDocument(document);
132
+ return document;
133
+ }
134
+ function normalizeModel(value) {
135
+ const model = isAssetReference(value) ? { asset: value } : value;
136
+ if (model.asset.kind !== "model") {
137
+ throw new Error(`Lightbox asset is not a model: ${model.asset.id}`);
138
+ }
139
+ if (model.orientation !== undefined &&
140
+ !["front", "back", "left", "right"].includes(model.orientation)) {
141
+ throw new Error(`Lightbox model orientation is invalid: ${model.orientation}`);
142
+ }
143
+ return {
144
+ ...model,
145
+ asset: structuredClone(model.asset),
146
+ ...(model.transform ? { transform: structuredClone(model.transform) } : {}),
147
+ ...(model.alignment ? { alignment: structuredClone(model.alignment) } : {}),
148
+ };
149
+ }
150
+ function validateLightboxOptions(input) {
151
+ if (input.preset !== undefined &&
152
+ !["neutral", "studio", "transparent"].includes(input.preset)) {
153
+ throw new Error(`Lightbox preset is invalid: ${input.preset}`);
154
+ }
155
+ if (input.initialView !== undefined &&
156
+ ![
157
+ "document",
158
+ "front",
159
+ "back",
160
+ "left",
161
+ "right",
162
+ "top",
163
+ "bottom",
164
+ "perspective",
165
+ ].includes(input.initialView)) {
166
+ throw new Error(`Lightbox initial view is invalid: ${input.initialView}`);
167
+ }
168
+ for (const [name, value] of Object.entries(input.controls ?? {})) {
169
+ if (!["zoom", "orbit", "verticalOrbit", "pan"].includes(name)) {
170
+ throw new Error(`Lightbox control is unknown: ${name}`);
171
+ }
172
+ if (typeof value !== "boolean") {
173
+ throw new Error(`Lightbox control ${name} must be a boolean`);
174
+ }
175
+ }
176
+ }
177
+ function isAssetReference(value) {
178
+ return "kind" in value;
179
+ }
180
+ function applyLightboxPreset(document, preset) {
181
+ if (preset === "neutral")
182
+ return;
183
+ if (preset === "transparent") {
184
+ document.environment.background = {
185
+ ...document.environment.background,
186
+ mode: "transparent",
187
+ color: "#000000",
188
+ };
189
+ return;
190
+ }
191
+ document.environment = {
192
+ ...document.environment,
193
+ intensity: 0.5,
194
+ background: {
195
+ ...document.environment.background,
196
+ mode: "color",
197
+ color: "#DDDDDD",
198
+ },
199
+ };
200
+ document.lights = document.lights.map((light) => ({
201
+ ...light,
202
+ intensity: light.intensity * 1.15,
203
+ }));
204
+ document.postProcess = {
205
+ ...document.postProcess,
206
+ enabled: true,
207
+ contrast: 1.05,
208
+ };
209
+ }
210
+ function orientationAlignment(orientation) {
211
+ if (orientation === undefined)
212
+ return {};
213
+ const y = orientation === "back"
214
+ ? Math.PI
215
+ : orientation === "left"
216
+ ? -Math.PI / 2
217
+ : orientation === "right"
218
+ ? Math.PI / 2
219
+ : 0;
220
+ return { rotation: { x: 0, y, z: 0 } };
221
+ }
222
+ function areStructurallyEqual(left, right) {
223
+ if (Object.is(left, right))
224
+ return true;
225
+ if (Array.isArray(left) || Array.isArray(right)) {
226
+ return (Array.isArray(left) &&
227
+ Array.isArray(right) &&
228
+ left.length === right.length &&
229
+ left.every((value, index) => areStructurallyEqual(value, right[index])));
230
+ }
231
+ if (!isPlainRecord(left) || !isPlainRecord(right))
232
+ return false;
233
+ const leftKeys = Object.keys(left).sort();
234
+ const rightKeys = Object.keys(right).sort();
235
+ return (leftKeys.length === rightKeys.length &&
236
+ leftKeys.every((key, index) => key === rightKeys[index] && areStructurallyEqual(left[key], right[key])));
237
+ }
238
+ function isPlainRecord(value) {
239
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
240
+ }
241
+ function hasExplicitCameraView(camera) {
242
+ return Boolean(camera?.position !== undefined ||
243
+ camera?.target !== undefined ||
244
+ camera?.radius !== undefined);
245
+ }
246
+ //# sourceMappingURL=lightbox-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox-document.js","sourceRoot":"","sources":["../../src/document/lightbox-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./core/create-lightbox.js";
2
+ export * from "./core/lightbox-session.js";
3
+ export * from "./document/lightbox-document.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./core/create-lightbox.js";
2
+ export * from "./core/lightbox-session.js";
3
+ export * from "./document/lightbox-document.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@skenora/lightbox",
3
+ "version": "0.1.2",
4
+ "description": "Strict read-only single-model presentation and capture for Skenora.",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "dependencies": {
22
+ "@skenora/contracts": "0.1.2",
23
+ "@skenora/resources": "0.1.2",
24
+ "@skenora/runtime": "0.1.2",
25
+ "@skenora/workspace": "0.1.2"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json && node ../../scripts/prepare-package-output.mjs dist",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit"
30
+ },
31
+ "main": "./dist/index.js",
32
+ "types": "./dist/index.d.ts"
33
+ }