@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.
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/dist/capture/CaptureManager.d.ts +55 -0
- package/dist/capture/CaptureManager.d.ts.map +1 -0
- package/dist/capture/index.d.ts +27 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +11 -0
- package/dist/capture/index.js.map +10 -0
- package/dist/capture/types.d.ts +76 -0
- package/dist/capture/types.d.ts.map +1 -0
- package/dist/codegen/index.d.ts +6 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +800 -0
- package/dist/codegen/index.js.map +13 -0
- package/dist/controls/HypertoolControls.d.ts +84 -0
- package/dist/controls/HypertoolControls.d.ts.map +1 -0
- package/dist/controls/index.d.ts +11 -0
- package/dist/controls/index.d.ts.map +1 -0
- package/dist/controls/index.js +28 -0
- package/dist/controls/index.js.map +12 -0
- package/dist/controls/simple-api.d.ts +43 -0
- package/dist/controls/simple-api.d.ts.map +1 -0
- package/dist/controls/theme.d.ts +80 -0
- package/dist/controls/theme.d.ts.map +1 -0
- package/dist/controls/types.d.ts +178 -0
- package/dist/controls/types.d.ts.map +1 -0
- package/dist/core/EventEmitter.d.ts +76 -0
- package/dist/core/EventEmitter.d.ts.map +1 -0
- package/dist/core/Experience.d.ts +128 -0
- package/dist/core/Experience.d.ts.map +1 -0
- package/dist/core/ObjectRegistry.d.ts +76 -0
- package/dist/core/ObjectRegistry.d.ts.map +1 -0
- package/dist/core/ParamStore.d.ts +66 -0
- package/dist/core/ParamStore.d.ts.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +13 -0
- package/dist/export/bundler.d.ts +55 -0
- package/dist/export/bundler.d.ts.map +1 -0
- package/dist/export/generators/index.d.ts +6 -0
- package/dist/export/generators/index.d.ts.map +1 -0
- package/dist/export/generators/webComponent.d.ts +29 -0
- package/dist/export/generators/webComponent.d.ts.map +1 -0
- package/dist/export/index.d.ts +19 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +800 -0
- package/dist/export/index.js.map +13 -0
- package/dist/export/runtime.d.ts +46 -0
- package/dist/export/runtime.d.ts.map +1 -0
- package/dist/frame/cssBridge.d.ts +34 -0
- package/dist/frame/cssBridge.d.ts.map +1 -0
- package/dist/frame/index.d.ts +9 -0
- package/dist/frame/index.d.ts.map +1 -0
- package/dist/frame/index.js +3 -0
- package/dist/frame/index.js.map +24 -0
- package/dist/frame/runtime.d.ts +39 -0
- package/dist/frame/runtime.d.ts.map +1 -0
- package/dist/frame/types.d.ts +119 -0
- package/dist/frame/types.d.ts.map +1 -0
- package/dist/frame/utils/dom.d.ts +11 -0
- package/dist/frame/utils/dom.d.ts.map +1 -0
- package/dist/frame/wrapper-app/WrapperApp.d.ts +16 -0
- package/dist/frame/wrapper-app/WrapperApp.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts +17 -0
- package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/ControlsPanel.d.ts +11 -0
- package/dist/frame/wrapper-app/components/ControlsPanel.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/ExportWidget.d.ts +16 -0
- package/dist/frame/wrapper-app/components/ExportWidget.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/ResizeHandles.d.ts +19 -0
- package/dist/frame/wrapper-app/components/ResizeHandles.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/SandboxContainer.d.ts +16 -0
- package/dist/frame/wrapper-app/components/SandboxContainer.d.ts.map +1 -0
- package/dist/frame/wrapper-app/components/index.d.ts +5 -0
- package/dist/frame/wrapper-app/components/index.d.ts.map +1 -0
- package/dist/frame/wrapper-app/context/CanvasContext.d.ts +37 -0
- package/dist/frame/wrapper-app/context/CanvasContext.d.ts.map +1 -0
- package/dist/frame/wrapper-app/context/index.d.ts +2 -0
- package/dist/frame/wrapper-app/context/index.d.ts.map +1 -0
- package/dist/frame/wrapper-app/index.d.ts +9 -0
- package/dist/frame/wrapper-app/index.d.ts.map +1 -0
- package/dist/frame/wrapper-app/types.d.ts +38 -0
- package/dist/frame/wrapper-app/types.d.ts.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +189 -0
- package/dist/index.js.map +35 -0
- package/dist/react/ExperienceView.d.ts +53 -0
- package/dist/react/ExperienceView.d.ts.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +15 -0
- package/dist/react/useExperience.d.ts +55 -0
- package/dist/react/useExperience.d.ts.map +1 -0
- package/dist/recording/ImageCapture.d.ts +46 -0
- package/dist/recording/ImageCapture.d.ts.map +1 -0
- package/dist/recording/Timeline.d.ts +105 -0
- package/dist/recording/Timeline.d.ts.map +1 -0
- package/dist/recording/VideoRecorder.d.ts +64 -0
- package/dist/recording/VideoRecorder.d.ts.map +1 -0
- package/dist/recording/index.d.ts +10 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +3 -0
- package/dist/recording/index.js.map +12 -0
- 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
|