@hypertools/sdk 0.1.0

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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +443 -0
  3. package/dist/capture/CaptureManager.d.ts +55 -0
  4. package/dist/capture/CaptureManager.d.ts.map +1 -0
  5. package/dist/capture/index.d.ts +27 -0
  6. package/dist/capture/index.d.ts.map +1 -0
  7. package/dist/capture/index.js +11 -0
  8. package/dist/capture/index.js.map +10 -0
  9. package/dist/capture/types.d.ts +76 -0
  10. package/dist/capture/types.d.ts.map +1 -0
  11. package/dist/codegen/index.d.ts +6 -0
  12. package/dist/codegen/index.d.ts.map +1 -0
  13. package/dist/codegen/index.js +800 -0
  14. package/dist/codegen/index.js.map +13 -0
  15. package/dist/controls/HypertoolControls.d.ts +84 -0
  16. package/dist/controls/HypertoolControls.d.ts.map +1 -0
  17. package/dist/controls/index.d.ts +11 -0
  18. package/dist/controls/index.d.ts.map +1 -0
  19. package/dist/controls/index.js +28 -0
  20. package/dist/controls/index.js.map +12 -0
  21. package/dist/controls/simple-api.d.ts +43 -0
  22. package/dist/controls/simple-api.d.ts.map +1 -0
  23. package/dist/controls/theme.d.ts +80 -0
  24. package/dist/controls/theme.d.ts.map +1 -0
  25. package/dist/controls/types.d.ts +178 -0
  26. package/dist/controls/types.d.ts.map +1 -0
  27. package/dist/core/EventEmitter.d.ts +76 -0
  28. package/dist/core/EventEmitter.d.ts.map +1 -0
  29. package/dist/core/Experience.d.ts +128 -0
  30. package/dist/core/Experience.d.ts.map +1 -0
  31. package/dist/core/ObjectRegistry.d.ts +76 -0
  32. package/dist/core/ObjectRegistry.d.ts.map +1 -0
  33. package/dist/core/ParamStore.d.ts +66 -0
  34. package/dist/core/ParamStore.d.ts.map +1 -0
  35. package/dist/core/index.d.ts +12 -0
  36. package/dist/core/index.d.ts.map +1 -0
  37. package/dist/core/index.js +3 -0
  38. package/dist/core/index.js.map +13 -0
  39. package/dist/export/bundler.d.ts +55 -0
  40. package/dist/export/bundler.d.ts.map +1 -0
  41. package/dist/export/generators/index.d.ts +6 -0
  42. package/dist/export/generators/index.d.ts.map +1 -0
  43. package/dist/export/generators/webComponent.d.ts +29 -0
  44. package/dist/export/generators/webComponent.d.ts.map +1 -0
  45. package/dist/export/index.d.ts +19 -0
  46. package/dist/export/index.d.ts.map +1 -0
  47. package/dist/export/index.js +800 -0
  48. package/dist/export/index.js.map +13 -0
  49. package/dist/export/runtime.d.ts +46 -0
  50. package/dist/export/runtime.d.ts.map +1 -0
  51. package/dist/frame/cssBridge.d.ts +34 -0
  52. package/dist/frame/cssBridge.d.ts.map +1 -0
  53. package/dist/frame/index.d.ts +9 -0
  54. package/dist/frame/index.d.ts.map +1 -0
  55. package/dist/frame/index.js +3 -0
  56. package/dist/frame/index.js.map +24 -0
  57. package/dist/frame/runtime.d.ts +39 -0
  58. package/dist/frame/runtime.d.ts.map +1 -0
  59. package/dist/frame/types.d.ts +119 -0
  60. package/dist/frame/types.d.ts.map +1 -0
  61. package/dist/frame/utils/dom.d.ts +11 -0
  62. package/dist/frame/utils/dom.d.ts.map +1 -0
  63. package/dist/frame/wrapper-app/WrapperApp.d.ts +16 -0
  64. package/dist/frame/wrapper-app/WrapperApp.d.ts.map +1 -0
  65. package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts +17 -0
  66. package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts.map +1 -0
  67. package/dist/frame/wrapper-app/components/ControlsPanel.d.ts +11 -0
  68. package/dist/frame/wrapper-app/components/ControlsPanel.d.ts.map +1 -0
  69. package/dist/frame/wrapper-app/components/ExportWidget.d.ts +16 -0
  70. package/dist/frame/wrapper-app/components/ExportWidget.d.ts.map +1 -0
  71. package/dist/frame/wrapper-app/components/ResizeHandles.d.ts +19 -0
  72. package/dist/frame/wrapper-app/components/ResizeHandles.d.ts.map +1 -0
  73. package/dist/frame/wrapper-app/components/SandboxContainer.d.ts +16 -0
  74. package/dist/frame/wrapper-app/components/SandboxContainer.d.ts.map +1 -0
  75. package/dist/frame/wrapper-app/components/index.d.ts +5 -0
  76. package/dist/frame/wrapper-app/components/index.d.ts.map +1 -0
  77. package/dist/frame/wrapper-app/context/CanvasContext.d.ts +37 -0
  78. package/dist/frame/wrapper-app/context/CanvasContext.d.ts.map +1 -0
  79. package/dist/frame/wrapper-app/context/index.d.ts +2 -0
  80. package/dist/frame/wrapper-app/context/index.d.ts.map +1 -0
  81. package/dist/frame/wrapper-app/index.d.ts +9 -0
  82. package/dist/frame/wrapper-app/index.d.ts.map +1 -0
  83. package/dist/frame/wrapper-app/types.d.ts +38 -0
  84. package/dist/frame/wrapper-app/types.d.ts.map +1 -0
  85. package/dist/index.d.ts +30 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +189 -0
  88. package/dist/index.js.map +35 -0
  89. package/dist/react/ExperienceView.d.ts +53 -0
  90. package/dist/react/ExperienceView.d.ts.map +1 -0
  91. package/dist/react/index.d.ts +8 -0
  92. package/dist/react/index.d.ts.map +1 -0
  93. package/dist/react/index.js +3 -0
  94. package/dist/react/index.js.map +15 -0
  95. package/dist/react/useExperience.d.ts +55 -0
  96. package/dist/react/useExperience.d.ts.map +1 -0
  97. package/dist/recording/ImageCapture.d.ts +46 -0
  98. package/dist/recording/ImageCapture.d.ts.map +1 -0
  99. package/dist/recording/Timeline.d.ts +105 -0
  100. package/dist/recording/Timeline.d.ts.map +1 -0
  101. package/dist/recording/VideoRecorder.d.ts +64 -0
  102. package/dist/recording/VideoRecorder.d.ts.map +1 -0
  103. package/dist/recording/index.d.ts +10 -0
  104. package/dist/recording/index.d.ts.map +1 -0
  105. package/dist/recording/index.js +3 -0
  106. package/dist/recording/index.js.map +12 -0
  107. package/package.json +141 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Control definition types
3
+ */
4
+ export type ControlType = 'number' | 'color' | 'boolean' | 'string' | 'text' | 'select' | 'selector' | 'point' | 'point2d' | 'point3d' | 'point4d' | 'folder' | 'group' | 'button' | 'tab' | 'file';
5
+ export interface BaseControlDefinition {
6
+ type?: ControlType;
7
+ label?: string;
8
+ value?: any;
9
+ readonly?: boolean;
10
+ interval?: number;
11
+ bufferSize?: number;
12
+ multiline?: boolean;
13
+ rows?: number;
14
+ view?: 'graph';
15
+ }
16
+ export interface NumberControlDefinition extends BaseControlDefinition {
17
+ type: 'number';
18
+ value: number;
19
+ min?: number;
20
+ max?: number;
21
+ step?: number;
22
+ }
23
+ export interface ColorControlDefinition extends BaseControlDefinition {
24
+ type: 'color';
25
+ value: string;
26
+ }
27
+ export interface BooleanControlDefinition extends BaseControlDefinition {
28
+ type: 'boolean';
29
+ value: boolean;
30
+ }
31
+ export interface StringControlDefinition extends BaseControlDefinition {
32
+ type: 'string' | 'text';
33
+ value: string;
34
+ }
35
+ export interface SelectControlDefinition extends BaseControlDefinition {
36
+ type: 'select' | 'selector';
37
+ value: string | number;
38
+ options: Record<string, string | number> | Array<string | number> | Array<{
39
+ label?: string;
40
+ text?: string;
41
+ value: string | number;
42
+ }>;
43
+ }
44
+ export interface AxisConstraints {
45
+ min?: number;
46
+ max?: number;
47
+ step?: number;
48
+ inverted?: boolean;
49
+ }
50
+ export interface Point2DControlDefinition extends BaseControlDefinition {
51
+ type?: 'point' | 'point2d';
52
+ value: {
53
+ x: number;
54
+ y: number;
55
+ };
56
+ min?: number | {
57
+ x: number;
58
+ y: number;
59
+ };
60
+ max?: number | {
61
+ x: number;
62
+ y: number;
63
+ };
64
+ step?: number | {
65
+ x: number;
66
+ y: number;
67
+ };
68
+ x?: AxisConstraints;
69
+ y?: AxisConstraints;
70
+ }
71
+ export interface Point3DControlDefinition extends BaseControlDefinition {
72
+ type?: 'point' | 'point3d';
73
+ value: {
74
+ x: number;
75
+ y: number;
76
+ z: number;
77
+ };
78
+ min?: number | {
79
+ x: number;
80
+ y: number;
81
+ z: number;
82
+ };
83
+ max?: number | {
84
+ x: number;
85
+ y: number;
86
+ z: number;
87
+ };
88
+ step?: number | {
89
+ x: number;
90
+ y: number;
91
+ z: number;
92
+ };
93
+ x?: AxisConstraints;
94
+ y?: AxisConstraints;
95
+ z?: AxisConstraints;
96
+ }
97
+ export interface Point4DControlDefinition extends BaseControlDefinition {
98
+ type?: 'point' | 'point4d';
99
+ value: {
100
+ x: number;
101
+ y: number;
102
+ z: number;
103
+ w: number;
104
+ };
105
+ min?: number | {
106
+ x: number;
107
+ y: number;
108
+ z: number;
109
+ w: number;
110
+ };
111
+ max?: number | {
112
+ x: number;
113
+ y: number;
114
+ z: number;
115
+ w: number;
116
+ };
117
+ step?: number | {
118
+ x: number;
119
+ y: number;
120
+ z: number;
121
+ w: number;
122
+ };
123
+ x?: AxisConstraints;
124
+ y?: AxisConstraints;
125
+ z?: AxisConstraints;
126
+ w?: AxisConstraints;
127
+ }
128
+ export interface FolderDefinition extends BaseControlDefinition {
129
+ type: 'folder' | 'group';
130
+ value?: never;
131
+ expanded?: boolean;
132
+ controls: ControlDefinitions;
133
+ }
134
+ export interface ButtonDefinition extends BaseControlDefinition {
135
+ type: 'button';
136
+ value?: never;
137
+ title: string;
138
+ onClick?: () => void;
139
+ }
140
+ export interface FileControlDefinition extends BaseControlDefinition {
141
+ type: 'file';
142
+ value: string | null;
143
+ accept?: string;
144
+ maxSize?: number;
145
+ preview?: boolean;
146
+ placeholder?: string;
147
+ }
148
+ export interface TabPage {
149
+ title: string;
150
+ controls: ControlDefinitions;
151
+ }
152
+ export interface TabDefinition extends BaseControlDefinition {
153
+ type: 'tab';
154
+ value?: never;
155
+ pages: TabPage[];
156
+ }
157
+ export type ControlDefinition = NumberControlDefinition | ColorControlDefinition | BooleanControlDefinition | StringControlDefinition | SelectControlDefinition | Point2DControlDefinition | Point3DControlDefinition | Point4DControlDefinition | FolderDefinition | ButtonDefinition | TabDefinition | FileControlDefinition;
158
+ export type ControlDefinitions = Record<string, ControlDefinition>;
159
+ export type ControlPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
160
+ export interface ControlChangeContext<T extends ControlDefinitions = ControlDefinitions> {
161
+ key: keyof T;
162
+ value: any;
163
+ event: any;
164
+ }
165
+ export interface HypertoolControlsOptions<T extends ControlDefinitions = ControlDefinitions> {
166
+ title?: string;
167
+ position?: ControlPosition;
168
+ expanded?: boolean;
169
+ container?: HTMLElement | string | null;
170
+ onChange?: (params: ParameterValues<T>, context: ControlChangeContext<T>) => void;
171
+ onReady?: () => void;
172
+ }
173
+ export type ParameterValues<T extends ControlDefinitions> = {
174
+ [K in keyof T]: T[K] extends FolderDefinition ? ParameterValues<T[K]['controls']> : T[K] extends TabDefinition ? any[] : T[K] extends ButtonDefinition ? never : T[K] extends {
175
+ value: infer V;
176
+ } ? V : never;
177
+ };
178
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/controls/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Typed event system for Experience
3
+ */
4
+ export type ExperienceEventType = 'ready' | 'error' | 'frame' | 'resize' | 'paramChange' | 'play' | 'pause' | 'objectRegistered' | 'objectUnregistered' | string;
5
+ export interface ExperienceEvent {
6
+ type: ExperienceEventType;
7
+ timestamp: number;
8
+ }
9
+ export interface ReadyEvent extends ExperienceEvent {
10
+ type: 'ready';
11
+ }
12
+ export interface ErrorEvent extends ExperienceEvent {
13
+ type: 'error';
14
+ error: Error;
15
+ }
16
+ export interface FrameEvent extends ExperienceEvent {
17
+ type: 'frame';
18
+ frame: number;
19
+ deltaTime: number;
20
+ }
21
+ export interface ResizeEvent extends ExperienceEvent {
22
+ type: 'resize';
23
+ width: number;
24
+ height: number;
25
+ }
26
+ export interface ParamChangeEvent extends ExperienceEvent {
27
+ type: 'paramChange';
28
+ key: string;
29
+ value: unknown;
30
+ previousValue: unknown;
31
+ }
32
+ export interface PlayEvent extends ExperienceEvent {
33
+ type: 'play';
34
+ }
35
+ export interface PauseEvent extends ExperienceEvent {
36
+ type: 'pause';
37
+ }
38
+ export interface ObjectRegisteredEvent extends ExperienceEvent {
39
+ type: 'objectRegistered';
40
+ name: string;
41
+ id: string;
42
+ }
43
+ export interface ObjectUnregisteredEvent extends ExperienceEvent {
44
+ type: 'objectUnregistered';
45
+ name: string;
46
+ }
47
+ export type EventHandler<T extends ExperienceEvent = ExperienceEvent> = (event: T) => void;
48
+ export declare class EventEmitter {
49
+ private _handlers;
50
+ /**
51
+ * Subscribe to event
52
+ * @returns Unsubscribe function
53
+ */
54
+ on<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): () => void;
55
+ /**
56
+ * Subscribe once - auto-unsubscribes after first call
57
+ */
58
+ once<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): () => void;
59
+ /**
60
+ * Unsubscribe from event
61
+ */
62
+ off<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): void;
63
+ /**
64
+ * Emit event to all handlers
65
+ */
66
+ emit<T extends ExperienceEvent>(event: T): void;
67
+ /**
68
+ * Remove all listeners for a type (or all if no type specified)
69
+ */
70
+ removeAllListeners(type?: ExperienceEventType): void;
71
+ /**
72
+ * Get listener count for a type
73
+ */
74
+ listenerCount(type: ExperienceEventType): number;
75
+ }
76
+ //# sourceMappingURL=EventEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../src/core/EventEmitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,aAAa,GACb,MAAM,GACN,OAAO,GACP,kBAAkB,GAClB,oBAAoB,GACpB,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAU,SAAQ,eAAe;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI,CACtE,KAAK,EAAE,CAAC,KACL,IAAI,CAAC;AAEV,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqD;IAEtE;;;OAGG;IACH,EAAE,CAAC,CAAC,SAAS,eAAe,EAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,MAAM,IAAI;IAUb;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,eAAe,EAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,MAAM,IAAI;IAQb;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,eAAe,EAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,IAAI;IAOP;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAa/C;;OAEG;IACH,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAQpD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM;CAGjD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Core Experience class - THE shared logic for all runtimes
3
+ *
4
+ * This is the brain. All adapters (Frame, Export, HostedPreview) use this.
5
+ * Adapters are thin wiring layers - Experience contains ALL the logic.
6
+ */
7
+ import { EventEmitter, type ExperienceEvent, type EventHandler } from './EventEmitter';
8
+ import { type ParamDefinitions, type ParamValues } from './ParamStore';
9
+ import { ObjectRegistry } from './ObjectRegistry';
10
+ export interface ExperienceConfig {
11
+ /** Mount element where content is rendered */
12
+ mount: HTMLElement;
13
+ /** Parameter definitions schema */
14
+ paramDefs?: ParamDefinitions;
15
+ /** Initial parameter values (overrides defaults from paramDefs) */
16
+ initialParams?: Record<string, unknown>;
17
+ /** User's setup function */
18
+ setup: SetupFunction;
19
+ /** Auto-start on init (default: true) */
20
+ autoplay?: boolean;
21
+ /** Target frame rate for frame events (default: 60) */
22
+ frameRate?: number;
23
+ /** Background color/style */
24
+ background?: string;
25
+ }
26
+ /**
27
+ * Context passed to user's setup function
28
+ * This is the API users interact with in their code
29
+ */
30
+ export interface ExperienceContext {
31
+ /** DOM element to render into */
32
+ mount: HTMLElement;
33
+ /** Reactive params object (Proxy) - changes trigger events */
34
+ params: ParamValues;
35
+ /** Export/capture utilities */
36
+ exports: ExportsApi;
37
+ /** Environment utilities (window, document, resize) */
38
+ environment: EnvironmentApi;
39
+ /** Register an object for Spline-like queries */
40
+ registerObject: <T = unknown>(name: string, object: T, metadata?: Record<string, unknown>) => string;
41
+ /** Find registered object by name */
42
+ findObjectByName: <T = unknown>(name: string) => T | undefined;
43
+ /** Experience instance (for advanced use) */
44
+ experience: Experience;
45
+ }
46
+ export interface ExportsApi {
47
+ /** Capture canvas as image */
48
+ captureImage: (format?: 'png' | 'jpeg' | 'webp') => Promise<Blob | null>;
49
+ /** Set filename for exports */
50
+ setFilename: (filename: string) => void;
51
+ /** Register custom capture handler */
52
+ registerCaptureHandler: (handler: CaptureHandler) => void;
53
+ }
54
+ export type CaptureHandler = (format: string) => Promise<Blob | null>;
55
+ export interface EnvironmentApi {
56
+ /** Window reference */
57
+ window: Window;
58
+ /** Document reference */
59
+ document: Document;
60
+ /** Subscribe to resize events, returns cleanup */
61
+ onResize: (callback: (width: number, height: number) => void) => () => void;
62
+ /** Add cleanup function to be called on destroy */
63
+ addCleanup: (cleanup: () => void) => void;
64
+ }
65
+ export type SetupFunction = (context: ExperienceContext) => CleanupFunction | void | Promise<CleanupFunction | void>;
66
+ export type CleanupFunction = () => void;
67
+ export declare class Experience {
68
+ private _isReady;
69
+ private _isPlaying;
70
+ private _isDestroyed;
71
+ private _currentFrame;
72
+ private _paramStore;
73
+ private _events;
74
+ private _objects;
75
+ private _mount;
76
+ private _frameRate;
77
+ private _filename;
78
+ private _cleanups;
79
+ private _userCleanup?;
80
+ private _animationFrameId?;
81
+ private _lastFrameTime;
82
+ private _resizeObserver?;
83
+ private _captureHandler?;
84
+ constructor(config: ExperienceConfig);
85
+ get isReady(): boolean;
86
+ get isPlaying(): boolean;
87
+ get isDestroyed(): boolean;
88
+ get currentFrame(): number;
89
+ get mount(): HTMLElement;
90
+ /** Reactive params proxy */
91
+ get params(): ParamValues;
92
+ /** EventEmitter for external subscriptions */
93
+ get events(): EventEmitter;
94
+ /** ObjectRegistry for external access */
95
+ get objects(): ObjectRegistry;
96
+ setParam(key: string, value: unknown): void;
97
+ setParams(params: Record<string, unknown>): void;
98
+ getParams(): Record<string, unknown>;
99
+ getParamDefs(): ParamDefinitions;
100
+ resetParams(): void;
101
+ registerObject<T = unknown>(name: string, object: T, metadata?: Record<string, unknown>): string;
102
+ findObjectByName<T = unknown>(name: string): T | undefined;
103
+ findObjectById<T = unknown>(id: string): T | undefined;
104
+ getAllObjects(): Map<string, unknown>;
105
+ play(): void;
106
+ pause(): void;
107
+ toggle(): void;
108
+ on<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): () => void;
109
+ once<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): () => void;
110
+ off<T extends ExperienceEvent>(type: T['type'], handler: EventHandler<T>): void;
111
+ captureImage(format?: 'png' | 'jpeg' | 'webp'): Promise<Blob | null>;
112
+ getFilename(): string;
113
+ /**
114
+ * Add a cleanup function to be called on destroy
115
+ */
116
+ addCleanup(cleanup: CleanupFunction): void;
117
+ /**
118
+ * Destroy the experience and run all cleanups
119
+ */
120
+ destroy(): void;
121
+ private _runSetup;
122
+ private _createContext;
123
+ private _createExportsApi;
124
+ private _createEnvironmentApi;
125
+ private _setupResizeObserver;
126
+ private _tick;
127
+ }
128
+ //# sourceMappingURL=Experience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Experience.d.ts","sourceRoot":"","sources":["../../src/core/Experience.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Spline-like object registry for querying objects by name/id
3
+ */
4
+ export interface RegisteredObject<T = unknown> {
5
+ name: string;
6
+ id: string;
7
+ object: T;
8
+ metadata?: Record<string, unknown>;
9
+ }
10
+ export type ObjectRegisteredCallback = (name: string, id: string, object: unknown) => void;
11
+ export type ObjectUnregisteredCallback = (name: string) => void;
12
+ export declare class ObjectRegistry {
13
+ private _byName;
14
+ private _byId;
15
+ private _onRegister;
16
+ private _onUnregister;
17
+ /**
18
+ * Register an object for external access
19
+ * @returns Generated ID for the object
20
+ */
21
+ register<T>(name: string, object: T, metadata?: Record<string, unknown>): string;
22
+ /**
23
+ * Unregister an object by name
24
+ */
25
+ unregister(name: string): boolean;
26
+ /**
27
+ * Find object by name (Spline-like API)
28
+ */
29
+ findByName<T = unknown>(name: string): T | undefined;
30
+ /**
31
+ * Find object by ID
32
+ */
33
+ findById<T = unknown>(id: string): T | undefined;
34
+ /**
35
+ * Get registered object info by name
36
+ */
37
+ getInfo(name: string): RegisteredObject | undefined;
38
+ /**
39
+ * Check if an object exists
40
+ */
41
+ has(name: string): boolean;
42
+ /**
43
+ * Get all registered object names
44
+ */
45
+ getNames(): string[];
46
+ /**
47
+ * Get all registered objects as a Map
48
+ */
49
+ getAll(): Map<string, unknown>;
50
+ /**
51
+ * Query objects by metadata
52
+ */
53
+ query(predicate: (obj: RegisteredObject) => boolean): RegisteredObject[];
54
+ /**
55
+ * Query objects by type (requires metadata.type to be set)
56
+ */
57
+ findByType<T = unknown>(type: string): T[];
58
+ /**
59
+ * Clear all registered objects
60
+ */
61
+ clear(): void;
62
+ /**
63
+ * Subscribe to object registration events
64
+ */
65
+ onRegister(callback: ObjectRegisteredCallback): () => void;
66
+ /**
67
+ * Subscribe to object unregistration events
68
+ */
69
+ onUnregister(callback: ObjectUnregisteredCallback): () => void;
70
+ /**
71
+ * Get the number of registered objects
72
+ */
73
+ get size(): number;
74
+ private _generateId;
75
+ }
76
+ //# sourceMappingURL=ObjectRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ObjectRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAC3F,MAAM,MAAM,0BAA0B,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAEhE,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,aAAa,CAA8C;IAEnE;;;OAGG;IACH,QAAQ,CAAC,CAAC,EACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM;IA8BT;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAmBjC;;OAEG;IACH,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIpD;;OAEG;IACH,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAInD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAIpB;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ9B;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,GAAG,gBAAgB,EAAE;IAUxE;;OAEG;IACH,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE;IAM1C;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI;IAK1D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,0BAA0B,GAAG,MAAM,IAAI;IAK9D;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Reactive parameter store with Proxy-based reactivity
3
+ */
4
+ export type ParamType = 'number' | 'color' | 'boolean' | 'string' | 'select' | 'file' | 'point2d' | 'point3d';
5
+ export interface SelectOption {
6
+ label: string;
7
+ value: string;
8
+ }
9
+ export interface ParamDefinition {
10
+ type: ParamType;
11
+ value: unknown;
12
+ label?: string;
13
+ min?: number;
14
+ max?: number;
15
+ step?: number;
16
+ options?: (string | SelectOption)[];
17
+ accept?: string;
18
+ maxSize?: number;
19
+ }
20
+ export type ParamDefinitions = Record<string, ParamDefinition>;
21
+ export type ParamValues = Record<string, unknown>;
22
+ export type ParamChangeCallback = (key: string, value: unknown, previousValue: unknown) => void;
23
+ export declare class ParamStore {
24
+ private _definitions;
25
+ private _values;
26
+ private _listeners;
27
+ private _proxy;
28
+ constructor(definitions: ParamDefinitions, initialOverrides?: ParamValues);
29
+ private _createProxy;
30
+ private _validate;
31
+ private _notify;
32
+ /**
33
+ * Get reactive params proxy
34
+ */
35
+ getProxy(): ParamValues;
36
+ /**
37
+ * Get snapshot of current values (non-reactive copy)
38
+ */
39
+ getSnapshot(): ParamValues;
40
+ /**
41
+ * Get definitions
42
+ */
43
+ getDefinitions(): ParamDefinitions;
44
+ /**
45
+ * Set single value
46
+ */
47
+ set(key: string, value: unknown): void;
48
+ /**
49
+ * Set multiple values
50
+ */
51
+ setMultiple(params: ParamValues): void;
52
+ /**
53
+ * Reset to defaults
54
+ */
55
+ reset(): void;
56
+ /**
57
+ * Subscribe to changes
58
+ * @returns Unsubscribe function
59
+ */
60
+ subscribe(callback: ParamChangeCallback): () => void;
61
+ /**
62
+ * Add a new param definition dynamically
63
+ */
64
+ addDefinition(key: string, definition: ParamDefinition): void;
65
+ }
66
+ //# sourceMappingURL=ParamStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParamStore.d.ts","sourceRoot":"","sources":["../../src/core/ParamStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,OAAO,GACP,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC;IAGpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC/D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,MAAM,mBAAmB,GAAG,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,OAAO,KACnB,IAAI,CAAC;AAEV,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAAc;gBAEhB,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,WAAW;IAuBzE,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,SAAS;IAiFjB,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,WAAW,IAAI,WAAW;IAI1B;;OAEG;IACH,cAAc,IAAI,gBAAgB;IAIlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMtC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKpD;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI;CAI9D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Core SDK exports
3
+ */
4
+ export { Experience } from './Experience';
5
+ export type { ExperienceConfig, ExperienceContext, ExportsApi, EnvironmentApi, SetupFunction, CleanupFunction, CaptureHandler, } from './Experience';
6
+ export { ParamStore } from './ParamStore';
7
+ export type { ParamType, ParamDefinition, ParamDefinitions, ParamValues, ParamChangeCallback, SelectOption, } from './ParamStore';
8
+ export { EventEmitter } from './EventEmitter';
9
+ export type { ExperienceEventType, ExperienceEvent, ReadyEvent, ErrorEvent, FrameEvent, ResizeEvent, ParamChangeEvent, PlayEvent, PauseEvent, ObjectRegisteredEvent, ObjectUnregisteredEvent, EventHandler, } from './EventEmitter';
10
+ export { ObjectRegistry } from './ObjectRegistry';
11
+ export type { RegisteredObject, ObjectRegisteredCallback, ObjectUnregisteredCallback, } from './ObjectRegistry';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,uBAAuB,EACvB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ class H{_handlers=new Map;on(E,x){if(!this._handlers.has(E))this._handlers.set(E,new Set);return this._handlers.get(E).add(x),()=>this.off(E,x)}once(E,x){let C=(P)=>{this.off(E,C),x(P)};return this.on(E,C)}off(E,x){let C=this._handlers.get(E);if(C)C.delete(x)}emit(E){let x=this._handlers.get(E.type);if(!x)return;for(let C of x)try{C(E)}catch(P){console.error(`[EventEmitter] Handler error for ${E.type}:`,P)}}removeAllListeners(E){if(E)this._handlers.delete(E);else this._handlers.clear()}listenerCount(E){return this._handlers.get(E)?.size??0}}class O{_definitions;_values;_listeners;_proxy;constructor(E,x){this._definitions=E,this._listeners=new Set,this._values={};for(let[C,P]of Object.entries(E))this._values[C]=P.value;if(x){for(let[C,P]of Object.entries(x))if(C in this._definitions)this._values[C]=this._validate(C,P)}this._proxy=this._createProxy()}_createProxy(){let E=this;return new Proxy(this._values,{get(x,C){return x[C]},set(x,C,P){if(!(C in E._definitions))return console.warn(`[ParamStore] Unknown parameter: ${C}`),!1;let R=E._validate(C,P),D=x[C];if(R!==D)x[C]=R,E._notify(C,R,D);return!0},has(x,C){return C in x},ownKeys(x){return Object.keys(x)},getOwnPropertyDescriptor(x,C){if(C in x)return{enumerable:!0,configurable:!0,value:x[C]};return}})}_validate(E,x){let C=this._definitions[E];if(!C)return x;switch(C.type){case"number":{let P=typeof x==="number"?x:parseFloat(String(x));if(isNaN(P))P=C.value;if(C.min!==void 0)P=Math.max(C.min,P);if(C.max!==void 0)P=Math.min(C.max,P);if(C.step!==void 0)P=Math.round(P/C.step)*C.step;return P}case"color":{let P=String(x);if(/^#[0-9A-Fa-f]{6}$/.test(P))return P;if(/^#[0-9A-Fa-f]{3}$/.test(P))return P;if(/^#[0-9A-Fa-f]{8}$/.test(P))return P;if(/^rgb\(/.test(P))return P;if(/^rgba\(/.test(P))return P;if(/^hsl\(/.test(P))return P;if(/^hsla\(/.test(P))return P;return C.value}case"boolean":if(typeof x==="boolean")return x;if(x==="true"||x==="1")return!0;if(x==="false"||x==="0")return!1;return Boolean(x);case"string":return String(x);case"select":{let P=String(x);return(C.options||[]).some((F)=>typeof F==="object"?F.value===P:F===P)?P:C.value}case"point2d":{if(typeof x==="object"&&x!==null&&"x"in x&&"y"in x)return{x:Number(x.x),y:Number(x.y)};return C.value}case"point3d":{if(typeof x==="object"&&x!==null&&"x"in x&&"y"in x&&"z"in x)return{x:Number(x.x),y:Number(x.y),z:Number(x.z)};return C.value}default:return x}}_notify(E,x,C){for(let P of this._listeners)try{P(E,x,C)}catch(R){console.error("[ParamStore] Listener error:",R)}}getProxy(){return this._proxy}getSnapshot(){return{...this._values}}getDefinitions(){return{...this._definitions}}set(E,x){this._proxy[E]=x}setMultiple(E){for(let[x,C]of Object.entries(E))this._proxy[x]=C}reset(){for(let[E,x]of Object.entries(this._definitions))this._proxy[E]=x.value}subscribe(E){return this._listeners.add(E),()=>this._listeners.delete(E)}addDefinition(E,x){this._definitions[E]=x,this._values[E]=x.value}}class S{_byName=new Map;_byId=new Map;_onRegister=new Set;_onUnregister=new Set;register(E,x,C){if(this._byName.has(E))this.unregister(E);let P=this._generateId(),R={name:E,id:P,object:x,metadata:C};this._byName.set(E,R),this._byId.set(P,R);for(let D of this._onRegister)try{D(E,P,x)}catch(F){console.error("[ObjectRegistry] onRegister callback error:",F)}return P}unregister(E){let x=this._byName.get(E);if(!x)return!1;this._byName.delete(E),this._byId.delete(x.id);for(let C of this._onUnregister)try{C(E)}catch(P){console.error("[ObjectRegistry] onUnregister callback error:",P)}return!0}findByName(E){return this._byName.get(E)?.object}findById(E){return this._byId.get(E)?.object}getInfo(E){return this._byName.get(E)}has(E){return this._byName.has(E)}getNames(){return Array.from(this._byName.keys())}getAll(){let E=new Map;for(let[x,C]of this._byName)E.set(x,C.object);return E}query(E){let x=[];for(let C of this._byName.values())if(E(C))x.push(C);return x}findByType(E){return this.query((x)=>x.metadata?.type===E).map((x)=>x.object)}clear(){let E=Array.from(this._byName.keys());for(let x of E)this.unregister(x)}onRegister(E){return this._onRegister.add(E),()=>this._onRegister.delete(E)}onUnregister(E){return this._onUnregister.add(E),()=>this._onUnregister.delete(E)}get size(){return this._byName.size}_generateId(){return`obj_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}}class U{_isReady=!1;_isPlaying=!1;_isDestroyed=!1;_currentFrame=0;_paramStore;_events;_objects;_mount;_frameRate;_filename="capture";_cleanups=[];_userCleanup;_animationFrameId;_lastFrameTime=0;_resizeObserver;_captureHandler;constructor(E){if(this._mount=E.mount,this._frameRate=E.frameRate??60,E.background)this._mount.style.background=E.background;this._paramStore=new O(E.paramDefs??{},E.initialParams),this._events=new H,this._objects=new S,this._paramStore.subscribe((x,C,P)=>{this._events.emit({type:"paramChange",timestamp:Date.now(),key:x,value:C,previousValue:P})}),this._setupResizeObserver(),this._runSetup(E.setup,E.autoplay??!0)}get isReady(){return this._isReady}get isPlaying(){return this._isPlaying}get isDestroyed(){return this._isDestroyed}get currentFrame(){return this._currentFrame}get mount(){return this._mount}get params(){return this._paramStore.getProxy()}get events(){return this._events}get objects(){return this._objects}setParam(E,x){this._paramStore.set(E,x)}setParams(E){this._paramStore.setMultiple(E)}getParams(){return this._paramStore.getSnapshot()}getParamDefs(){return this._paramStore.getDefinitions()}resetParams(){this._paramStore.reset()}registerObject(E,x,C){return this._objects.register(E,x,C)}findObjectByName(E){return this._objects.findByName(E)}findObjectById(E){return this._objects.findById(E)}getAllObjects(){return this._objects.getAll()}play(){if(this._isPlaying||this._isDestroyed)return;this._isPlaying=!0,this._lastFrameTime=performance.now(),this._tick(),this._events.emit({type:"play",timestamp:Date.now()})}pause(){if(!this._isPlaying)return;if(this._isPlaying=!1,this._animationFrameId)cancelAnimationFrame(this._animationFrameId),this._animationFrameId=void 0;this._events.emit({type:"pause",timestamp:Date.now()})}toggle(){if(this._isPlaying)this.pause();else this.play()}on(E,x){return this._events.on(E,x)}once(E,x){return this._events.once(E,x)}off(E,x){this._events.off(E,x)}async captureImage(E="png"){if(this._captureHandler)return this._captureHandler(E);let x=this._mount.querySelector("canvas");if(!x)return console.warn("[Experience] No canvas found for capture"),null;return new Promise((C)=>{let P=`image/${E}`,R=E==="jpeg"?0.92:void 0;x.toBlob((D)=>C(D),P,R)})}getFilename(){return this._filename}addCleanup(E){if(typeof E==="function")this._cleanups.push(E)}destroy(){if(this._isDestroyed)return;if(this._isDestroyed=!0,this.pause(),this._userCleanup)try{this._userCleanup()}catch(E){console.error("[Experience] User cleanup error:",E)}while(this._cleanups.length>0){let E=this._cleanups.pop();if(E)try{E()}catch(x){console.error("[Experience] Cleanup error:",x)}}this._resizeObserver?.disconnect(),this._objects.clear(),this._events.removeAllListeners(),this._events.emit({type:"destroyed",timestamp:Date.now()})}async _runSetup(E,x){try{let C=this._createContext(),P=await E(C);if(typeof P==="function")this._userCleanup=P;if(this._isReady=!0,this._events.emit({type:"ready",timestamp:Date.now()}),x)this.play()}catch(C){console.error("[Experience] Setup error:",C),this._events.emit({type:"error",timestamp:Date.now(),error:C instanceof Error?C:Error(String(C))})}}_createContext(){return{mount:this._mount,params:this._paramStore.getProxy(),exports:this._createExportsApi(),environment:this._createEnvironmentApi(),registerObject:(E,x,C)=>this._objects.register(E,x,C),findObjectByName:(E)=>this._objects.findByName(E),experience:this}}_createExportsApi(){return{captureImage:(E)=>this.captureImage(E),setFilename:(E)=>{this._filename=E},registerCaptureHandler:(E)=>{this._captureHandler=E}}}_createEnvironmentApi(){return{window,document,onResize:(E)=>{let x=()=>{E(this._mount.clientWidth,this._mount.clientHeight)};x();let C=new ResizeObserver(x);C.observe(this._mount);let P=()=>C.disconnect();return this._cleanups.push(P),P},addCleanup:(E)=>this.addCleanup(E)}}_setupResizeObserver(){this._resizeObserver=new ResizeObserver((E)=>{for(let x of E){let{width:C,height:P}=x.contentRect;this._events.emit({type:"resize",timestamp:Date.now(),width:C,height:P})}}),this._resizeObserver.observe(this._mount)}_tick(){if(!this._isPlaying)return;let E=performance.now(),x=E-this._lastFrameTime,C=1000/this._frameRate;if(x>=C)this._currentFrame++,this._lastFrameTime=E-x%C,this._events.emit({type:"frame",timestamp:Date.now(),frame:this._currentFrame,deltaTime:x});this._animationFrameId=requestAnimationFrame(()=>this._tick())}}export{O as ParamStore,S as ObjectRegistry,U as Experience,H as EventEmitter};
2
+
3
+ //# debugId=730310C6746E3D6664756E2164756E21