@viji-dev/core 0.3.13 → 0.3.14

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.
@@ -1,563 +1,559 @@
1
- declare interface AudioAPI {
2
- isConnected: boolean;
3
- volume: {
4
- current: number;
5
- peak: number;
6
- smoothed: number;
7
- };
8
- bands: {
9
- low: number;
10
- lowMid: number;
11
- mid: number;
12
- highMid: number;
13
- high: number;
14
- lowSmoothed: number;
15
- lowMidSmoothed: number;
16
- midSmoothed: number;
17
- highMidSmoothed: number;
18
- highSmoothed: number;
19
- };
20
- beat: {
21
- kick: number;
22
- snare: number;
23
- hat: number;
24
- any: number;
25
- kickSmoothed: number;
26
- snareSmoothed: number;
27
- anySmoothed: number;
28
- triggers: {
29
- any: boolean;
30
- kick: boolean;
31
- snare: boolean;
32
- hat: boolean;
33
- };
34
- events: Array<{
35
- type: 'kick' | 'snare' | 'hat';
36
- time: number;
37
- strength: number;
38
- }>;
39
- bpm: number;
40
- phase: number;
41
- bar: number;
42
- confidence: number;
43
- isLocked: boolean;
44
- };
45
- spectral: {
46
- brightness: number;
47
- flatness: number;
48
- flux: number;
49
- };
50
- getFrequencyData: () => Uint8Array;
51
- getWaveform?: (samples?: number) => Float32Array;
52
- getFFT?: (bins?: number, scale?: 'linear' | 'log') => Float32Array;
53
- }
54
-
55
- declare interface CaptureFrameOptions {
56
- /** Output format: 'blob' for encoded image, 'bitmap' for GPU-friendly ImageBitmap */
57
- format?: 'blob' | 'bitmap';
58
- /** MIME type for blob output (ignored for bitmap), e.g., 'image/png', 'image/jpeg', 'image/webp' */
59
- type?: string;
60
- /**
61
- * Target resolution.
62
- * - number: scale factor relative to current canvas size (e.g., 0.5 = 50%)
63
- * - { width, height }: exact output size; if aspect ratio differs from canvas,
64
- * the source is center-cropped to match the target aspect ratio before scaling
65
- */
66
- resolution?: number | {
67
- width: number;
68
- height: number;
69
- };
70
- }
71
-
72
- declare interface ColorConfig {
73
- label: string;
74
- description?: string;
75
- group?: string;
76
- category?: ParameterCategory;
77
- }
78
-
79
- declare interface ColorParameter {
80
- value: string;
81
- label: string;
82
- description?: string;
83
- group: string;
84
- category: ParameterCategory;
85
- }
86
-
87
- declare type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation';
88
-
89
- declare type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';
90
-
91
- declare interface DeviceMotionData {
92
- /** Acceleration without gravity (m/s²) */
93
- acceleration: {
94
- x: number | null;
95
- y: number | null;
96
- z: number | null;
97
- } | null;
98
- /** Acceleration including gravity (m/s²) */
99
- accelerationIncludingGravity: {
100
- x: number | null;
101
- y: number | null;
102
- z: number | null;
103
- } | null;
104
- /** Rotation rate (degrees/second) */
105
- rotationRate: {
106
- alpha: number | null;
107
- beta: number | null;
108
- gamma: number | null;
109
- } | null;
110
- /** Interval between updates (milliseconds) */
111
- interval: number;
112
- }
113
-
114
- declare interface DeviceOrientationData {
115
- /** Rotation around Z-axis (0-360 degrees, compass heading) */
116
- alpha: number | null;
117
- /** Rotation around X-axis (-180 to 180 degrees, front-to-back tilt) */
118
- beta: number | null;
119
- /** Rotation around Y-axis (-90 to 90 degrees, left-to-right tilt) */
120
- gamma: number | null;
121
- /** True if using magnetometer (compass) for absolute orientation */
122
- absolute: boolean;
123
- }
124
-
125
- declare interface DeviceSensorState {
126
- motion: DeviceMotionData | null;
127
- orientation: DeviceOrientationData | null;
128
- }
129
-
130
- declare interface DeviceState extends DeviceSensorState {
131
- /** Unique device identifier */
132
- id: string;
133
- /** User-friendly device name */
134
- name: string;
135
- /** Device camera video (null if not available) */
136
- video: VideoAPI | null;
137
- }
138
-
139
- declare interface FaceData {
140
- id: number;
141
- bounds: {
142
- x: number;
143
- y: number;
144
- width: number;
145
- height: number;
146
- };
147
- confidence: number;
148
- landmarks?: {
149
- x: number;
150
- y: number;
151
- z?: number;
152
- }[];
153
- expressions: {
154
- neutral: number;
155
- happy: number;
156
- sad: number;
157
- angry: number;
158
- surprised: number;
159
- disgusted: number;
160
- fearful: number;
161
- };
162
- headPose: {
163
- pitch: number;
164
- yaw: number;
165
- roll: number;
166
- };
167
- }
168
-
169
- declare type FrameRateMode = 'full' | 'half';
170
-
171
- declare interface FrequencyBand {
172
- name: string;
173
- min: number;
174
- max: number;
175
- }
176
-
177
- declare interface HandData {
178
- id: number;
179
- handedness: 'left' | 'right';
180
- confidence: number;
181
- bounds: {
182
- x: number;
183
- y: number;
184
- width: number;
185
- height: number;
186
- };
187
- landmarks: {
188
- x: number;
189
- y: number;
190
- z: number;
191
- }[];
192
- palm: {
193
- x: number;
194
- y: number;
195
- z: number;
196
- };
197
- fingers: {
198
- thumb: {
199
- tip: {
200
- x: number;
201
- y: number;
202
- z: number;
203
- };
204
- extended: boolean;
205
- };
206
- index: {
207
- tip: {
208
- x: number;
209
- y: number;
210
- z: number;
211
- };
212
- extended: boolean;
213
- };
214
- middle: {
215
- tip: {
216
- x: number;
217
- y: number;
218
- z: number;
219
- };
220
- extended: boolean;
221
- };
222
- ring: {
223
- tip: {
224
- x: number;
225
- y: number;
226
- z: number;
227
- };
228
- extended: boolean;
229
- };
230
- pinky: {
231
- tip: {
232
- x: number;
233
- y: number;
234
- z: number;
235
- };
236
- extended: boolean;
237
- };
238
- };
239
- gestures: {
240
- fist: number;
241
- openPalm: number;
242
- peace: number;
243
- thumbsUp: number;
244
- pointing: number;
245
- };
246
- }
247
-
248
- declare interface ImageConfig {
249
- label: string;
250
- description?: string;
251
- group?: string;
252
- category?: ParameterCategory;
253
- }
254
-
255
- declare interface ImageParameter {
256
- value: ImageBitmap | OffscreenCanvas | null;
257
- label: string;
258
- description?: string;
259
- group: string;
260
- category: ParameterCategory;
261
- }
262
-
263
- declare interface KeyboardAPI {
264
- isPressed(key: string): boolean;
265
- wasPressed(key: string): boolean;
266
- wasReleased(key: string): boolean;
267
- activeKeys: Set<string>;
268
- pressedThisFrame: Set<string>;
269
- releasedThisFrame: Set<string>;
270
- lastKeyPressed: string;
271
- lastKeyReleased: string;
272
- shift: boolean;
273
- ctrl: boolean;
274
- alt: boolean;
275
- meta: boolean;
276
- }
277
-
278
- declare interface MouseAPI {
279
- x: number;
280
- y: number;
281
- isInCanvas: boolean;
282
- isPressed: boolean;
283
- leftButton: boolean;
284
- rightButton: boolean;
285
- middleButton: boolean;
286
- velocity: {
287
- x: number;
288
- y: number;
289
- };
290
- deltaX: number;
291
- deltaY: number;
292
- wheelDelta: number;
293
- wheelX: number;
294
- wheelY: number;
295
- wasPressed: boolean;
296
- wasReleased: boolean;
297
- wasMoved: boolean;
298
- }
299
-
300
- declare interface NumberConfig {
301
- min?: number;
302
- max?: number;
303
- step?: number;
304
- label: string;
305
- description?: string;
306
- group?: string;
307
- category?: ParameterCategory;
308
- }
309
-
310
- declare interface NumberParameter {
311
- value: number;
312
- min: number;
313
- max: number;
314
- step: number;
315
- label: string;
316
- description?: string;
317
- group: string;
318
- category: ParameterCategory;
319
- }
320
-
321
- declare type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';
322
-
323
- declare interface PoseData {
324
- confidence: number;
325
- landmarks: {
326
- x: number;
327
- y: number;
328
- z: number;
329
- visibility: number;
330
- }[];
331
- face: {
332
- x: number;
333
- y: number;
334
- }[];
335
- torso: {
336
- x: number;
337
- y: number;
338
- }[];
339
- leftArm: {
340
- x: number;
341
- y: number;
342
- }[];
343
- rightArm: {
344
- x: number;
345
- y: number;
346
- }[];
347
- leftLeg: {
348
- x: number;
349
- y: number;
350
- }[];
351
- rightLeg: {
352
- x: number;
353
- y: number;
354
- }[];
355
- }
356
-
357
- declare type Resolution = {
358
- width: number;
359
- height: number;
360
- };
361
-
362
- declare interface SegmentationData {
363
- mask: Uint8Array;
364
- width: number;
365
- height: number;
366
- }
367
-
368
- declare interface SelectConfig {
369
- options: string[] | number[];
370
- label: string;
371
- description?: string;
372
- group?: string;
373
- category?: ParameterCategory;
374
- }
375
-
376
- declare interface SelectParameter {
377
- value: string | number;
378
- options: string[] | number[];
379
- label: string;
380
- description?: string;
381
- group: string;
382
- category: ParameterCategory;
383
- }
384
-
385
- declare interface SliderConfig {
386
- min?: number;
387
- max?: number;
388
- step?: number;
389
- label: string;
390
- description?: string;
391
- group?: string;
392
- category?: ParameterCategory;
393
- }
394
-
395
- declare interface SliderParameter {
396
- value: number;
397
- min: number;
398
- max: number;
399
- step: number;
400
- label: string;
401
- description?: string;
402
- group: string;
403
- category: ParameterCategory;
404
- }
405
-
406
- declare interface TextConfig {
407
- label: string;
408
- description?: string;
409
- group?: string;
410
- category?: ParameterCategory;
411
- maxLength?: number;
412
- }
413
-
414
- declare interface TextParameter {
415
- value: string;
416
- maxLength?: number;
417
- label: string;
418
- description?: string;
419
- group: string;
420
- category: ParameterCategory;
421
- }
422
-
423
- declare interface ToggleConfig {
424
- label: string;
425
- description?: string;
426
- group?: string;
427
- category?: ParameterCategory;
428
- }
429
-
430
- declare interface ToggleParameter {
431
- value: boolean;
432
- label: string;
433
- description?: string;
434
- group: string;
435
- category: ParameterCategory;
436
- }
437
-
438
- declare interface TouchAPI {
439
- points: TouchPoint[];
440
- count: number;
441
- started: TouchPoint[];
442
- moved: TouchPoint[];
443
- ended: TouchPoint[];
444
- primary: TouchPoint | null;
445
- gestures: TouchGestureAPI;
446
- }
447
-
448
- declare interface TouchGestureAPI {
449
- isPinching: boolean;
450
- isRotating: boolean;
451
- isPanning: boolean;
452
- isTapping: boolean;
453
- pinchScale: number;
454
- pinchDelta: number;
455
- rotationAngle: number;
456
- rotationDelta: number;
457
- panDelta: {
458
- x: number;
459
- y: number;
460
- };
461
- tapCount: number;
462
- lastTapTime: number;
463
- tapPosition: {
464
- x: number;
465
- y: number;
466
- } | null;
467
- }
468
-
469
- declare interface TouchPoint {
470
- id: number;
471
- x: number;
472
- y: number;
473
- pressure: number;
474
- radius: number;
475
- radiusX: number;
476
- radiusY: number;
477
- rotationAngle: number;
478
- force: number;
479
- deltaX: number;
480
- deltaY: number;
481
- velocity: {
482
- x: number;
483
- y: number;
484
- };
485
- isNew: boolean;
486
- isActive: boolean;
487
- isEnding: boolean;
488
- }
489
-
490
- declare const VERSION = "0.2.20";
491
-
492
- declare interface VideoAPI {
493
- isConnected: boolean;
494
- currentFrame: OffscreenCanvas | ImageBitmap | null;
495
- frameWidth: number;
496
- frameHeight: number;
497
- frameRate: number;
498
- getFrameData: () => ImageData | null;
499
- faces: FaceData[];
500
- hands: HandData[];
501
- pose: PoseData | null;
502
- segmentation: SegmentationData | null;
503
- cv: {
504
- enableFaceDetection(enabled: boolean): Promise<void>;
505
- enableFaceMesh(enabled: boolean): Promise<void>;
506
- enableHandTracking(enabled: boolean): Promise<void>;
507
- enablePoseDetection(enabled: boolean): Promise<void>;
508
- enableBodySegmentation(enabled: boolean): Promise<void>;
509
- getActiveFeatures(): CVFeature[];
510
- isProcessing(): boolean;
511
- };
512
- }
513
-
514
- declare interface VijiAPI {
515
- canvas: OffscreenCanvas;
516
- ctx?: OffscreenCanvasRenderingContext2D;
517
- gl?: WebGL2RenderingContext;
518
- width: number;
519
- height: number;
520
- pixelRatio: number;
521
- time: number;
522
- deltaTime: number;
523
- frameCount: number;
524
- fps: number;
525
- audio: AudioAPI;
526
- video: VideoAPI;
527
- streams: VideoAPI[];
528
- mouse: MouseAPI;
529
- keyboard: KeyboardAPI;
530
- touches: TouchAPI;
531
- device: DeviceSensorState;
532
- devices: DeviceState[];
533
- slider: (defaultValue: number, config: SliderConfig) => SliderParameter;
534
- color: (defaultValue: string, config: ColorConfig) => ColorParameter;
535
- toggle: (defaultValue: boolean, config: ToggleConfig) => ToggleParameter;
536
- select: (defaultValue: string | number, config: SelectConfig) => SelectParameter;
537
- text: (defaultValue: string, config: TextConfig) => TextParameter;
538
- number: (defaultValue: number, config: NumberConfig) => NumberParameter;
539
- image: (defaultValue: null, config: ImageConfig) => ImageParameter;
540
- useContext(type: '2d'): OffscreenCanvasRenderingContext2D;
541
- useContext(type: 'webgl'): WebGLRenderingContext | WebGL2RenderingContext;
542
- }
543
-
544
- // Global viji instance
545
- declare const viji: VijiAPI;
546
-
547
- // Type aliases for typed function declarations
548
- declare type Render = (viji: VijiAPI) => void;
549
- declare type Setup = (viji: VijiAPI) => void;
550
-
551
- // Function declarations
552
- declare function render(viji: VijiAPI): void;
553
- declare function setup(viji: VijiAPI): void;
554
-
555
- // Module marker (enables top-level await)
556
- export {};
557
-
558
- // Support CDN module imports (esm.sh, unpkg, skypack, jsdelivr, etc.)
559
- declare module 'https://*' {
560
- const mod: any;
561
- export default mod;
562
- export = mod;
1
+ // Viji Artist API - Global Type Definitions
2
+ // All types are placed inside declare global {} because this file uses export {}
3
+ // for top-level await support, which makes it a module (where top-level declarations
4
+ // would otherwise be module-scoped, not global).
5
+
6
+ declare global {
7
+ interface AudioAPI {
8
+ isConnected: boolean;
9
+ volume: {
10
+ current: number;
11
+ peak: number;
12
+ smoothed: number;
13
+ };
14
+ bands: {
15
+ low: number;
16
+ lowMid: number;
17
+ mid: number;
18
+ highMid: number;
19
+ high: number;
20
+ lowSmoothed: number;
21
+ lowMidSmoothed: number;
22
+ midSmoothed: number;
23
+ highMidSmoothed: number;
24
+ highSmoothed: number;
25
+ };
26
+ beat: {
27
+ kick: number;
28
+ snare: number;
29
+ hat: number;
30
+ any: number;
31
+ kickSmoothed: number;
32
+ snareSmoothed: number;
33
+ anySmoothed: number;
34
+ triggers: {
35
+ any: boolean;
36
+ kick: boolean;
37
+ snare: boolean;
38
+ hat: boolean;
39
+ };
40
+ events: Array<{
41
+ type: 'kick' | 'snare' | 'hat';
42
+ time: number;
43
+ strength: number;
44
+ }>;
45
+ bpm: number;
46
+ phase: number;
47
+ bar: number;
48
+ confidence: number;
49
+ isLocked: boolean;
50
+ };
51
+ spectral: {
52
+ brightness: number;
53
+ flatness: number;
54
+ flux: number;
55
+ };
56
+ getFrequencyData: () => Uint8Array;
57
+ getWaveform?: (samples?: number) => Float32Array;
58
+ getFFT?: (bins?: number, scale?: 'linear' | 'log') => Float32Array;
59
+ }
60
+
61
+ interface CaptureFrameOptions {
62
+ /** Output format: 'blob' for encoded image, 'bitmap' for GPU-friendly ImageBitmap */
63
+ format?: 'blob' | 'bitmap';
64
+ /** MIME type for blob output (ignored for bitmap), e.g., 'image/png', 'image/jpeg', 'image/webp' */
65
+ type?: string;
66
+ /**
67
+ * Target resolution.
68
+ * - number: scale factor relative to current canvas size (e.g., 0.5 = 50%)
69
+ * - { width, height }: exact output size; if aspect ratio differs from canvas,
70
+ * the source is center-cropped to match the target aspect ratio before scaling
71
+ */
72
+ resolution?: number | {
73
+ width: number;
74
+ height: number;
75
+ };
76
+ }
77
+
78
+ interface ColorConfig {
79
+ label: string;
80
+ description?: string;
81
+ group?: string;
82
+ category?: ParameterCategory;
83
+ }
84
+
85
+ interface ColorParameter {
86
+ value: string;
87
+ label: string;
88
+ description?: string;
89
+ group: string;
90
+ category: ParameterCategory;
91
+ }
92
+
93
+ type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation';
94
+
95
+ type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';
96
+
97
+ interface DeviceMotionData {
98
+ /** Acceleration without gravity (m/s²) */
99
+ acceleration: {
100
+ x: number | null;
101
+ y: number | null;
102
+ z: number | null;
103
+ } | null;
104
+ /** Acceleration including gravity (m/) */
105
+ accelerationIncludingGravity: {
106
+ x: number | null;
107
+ y: number | null;
108
+ z: number | null;
109
+ } | null;
110
+ /** Rotation rate (degrees/second) */
111
+ rotationRate: {
112
+ alpha: number | null;
113
+ beta: number | null;
114
+ gamma: number | null;
115
+ } | null;
116
+ /** Interval between updates (milliseconds) */
117
+ interval: number;
118
+ }
119
+
120
+ interface DeviceOrientationData {
121
+ /** Rotation around Z-axis (0-360 degrees, compass heading) */
122
+ alpha: number | null;
123
+ /** Rotation around X-axis (-180 to 180 degrees, front-to-back tilt) */
124
+ beta: number | null;
125
+ /** Rotation around Y-axis (-90 to 90 degrees, left-to-right tilt) */
126
+ gamma: number | null;
127
+ /** True if using magnetometer (compass) for absolute orientation */
128
+ absolute: boolean;
129
+ }
130
+
131
+ interface DeviceSensorState {
132
+ motion: DeviceMotionData | null;
133
+ orientation: DeviceOrientationData | null;
134
+ }
135
+
136
+ interface DeviceState extends DeviceSensorState {
137
+ /** Unique device identifier */
138
+ id: string;
139
+ /** User-friendly device name */
140
+ name: string;
141
+ /** Device camera video (null if not available) */
142
+ video: VideoAPI | null;
143
+ }
144
+
145
+ interface FaceData {
146
+ id: number;
147
+ bounds: {
148
+ x: number;
149
+ y: number;
150
+ width: number;
151
+ height: number;
152
+ };
153
+ confidence: number;
154
+ landmarks?: {
155
+ x: number;
156
+ y: number;
157
+ z?: number;
158
+ }[];
159
+ expressions: {
160
+ neutral: number;
161
+ happy: number;
162
+ sad: number;
163
+ angry: number;
164
+ surprised: number;
165
+ disgusted: number;
166
+ fearful: number;
167
+ };
168
+ headPose: {
169
+ pitch: number;
170
+ yaw: number;
171
+ roll: number;
172
+ };
173
+ }
174
+
175
+ type FrameRateMode = 'full' | 'half';
176
+
177
+ interface FrequencyBand {
178
+ name: string;
179
+ min: number;
180
+ max: number;
181
+ }
182
+
183
+ interface HandData {
184
+ id: number;
185
+ handedness: 'left' | 'right';
186
+ confidence: number;
187
+ bounds: {
188
+ x: number;
189
+ y: number;
190
+ width: number;
191
+ height: number;
192
+ };
193
+ landmarks: {
194
+ x: number;
195
+ y: number;
196
+ z: number;
197
+ }[];
198
+ palm: {
199
+ x: number;
200
+ y: number;
201
+ z: number;
202
+ };
203
+ fingers: {
204
+ thumb: {
205
+ tip: {
206
+ x: number;
207
+ y: number;
208
+ z: number;
209
+ };
210
+ extended: boolean;
211
+ };
212
+ index: {
213
+ tip: {
214
+ x: number;
215
+ y: number;
216
+ z: number;
217
+ };
218
+ extended: boolean;
219
+ };
220
+ middle: {
221
+ tip: {
222
+ x: number;
223
+ y: number;
224
+ z: number;
225
+ };
226
+ extended: boolean;
227
+ };
228
+ ring: {
229
+ tip: {
230
+ x: number;
231
+ y: number;
232
+ z: number;
233
+ };
234
+ extended: boolean;
235
+ };
236
+ pinky: {
237
+ tip: {
238
+ x: number;
239
+ y: number;
240
+ z: number;
241
+ };
242
+ extended: boolean;
243
+ };
244
+ };
245
+ gestures: {
246
+ fist: number;
247
+ openPalm: number;
248
+ peace: number;
249
+ thumbsUp: number;
250
+ pointing: number;
251
+ };
252
+ }
253
+
254
+ interface ImageConfig {
255
+ label: string;
256
+ description?: string;
257
+ group?: string;
258
+ category?: ParameterCategory;
259
+ }
260
+
261
+ interface ImageParameter {
262
+ value: ImageBitmap | OffscreenCanvas | null;
263
+ label: string;
264
+ description?: string;
265
+ group: string;
266
+ category: ParameterCategory;
267
+ }
268
+
269
+ interface KeyboardAPI {
270
+ isPressed(key: string): boolean;
271
+ wasPressed(key: string): boolean;
272
+ wasReleased(key: string): boolean;
273
+ activeKeys: Set<string>;
274
+ pressedThisFrame: Set<string>;
275
+ releasedThisFrame: Set<string>;
276
+ lastKeyPressed: string;
277
+ lastKeyReleased: string;
278
+ shift: boolean;
279
+ ctrl: boolean;
280
+ alt: boolean;
281
+ meta: boolean;
282
+ }
283
+
284
+ interface MouseAPI {
285
+ x: number;
286
+ y: number;
287
+ isInCanvas: boolean;
288
+ isPressed: boolean;
289
+ leftButton: boolean;
290
+ rightButton: boolean;
291
+ middleButton: boolean;
292
+ velocity: {
293
+ x: number;
294
+ y: number;
295
+ };
296
+ deltaX: number;
297
+ deltaY: number;
298
+ wheelDelta: number;
299
+ wheelX: number;
300
+ wheelY: number;
301
+ wasPressed: boolean;
302
+ wasReleased: boolean;
303
+ wasMoved: boolean;
304
+ }
305
+
306
+ interface NumberConfig {
307
+ min?: number;
308
+ max?: number;
309
+ step?: number;
310
+ label: string;
311
+ description?: string;
312
+ group?: string;
313
+ category?: ParameterCategory;
314
+ }
315
+
316
+ interface NumberParameter {
317
+ value: number;
318
+ min: number;
319
+ max: number;
320
+ step: number;
321
+ label: string;
322
+ description?: string;
323
+ group: string;
324
+ category: ParameterCategory;
325
+ }
326
+
327
+ type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';
328
+
329
+ interface PoseData {
330
+ confidence: number;
331
+ landmarks: {
332
+ x: number;
333
+ y: number;
334
+ z: number;
335
+ visibility: number;
336
+ }[];
337
+ face: {
338
+ x: number;
339
+ y: number;
340
+ }[];
341
+ torso: {
342
+ x: number;
343
+ y: number;
344
+ }[];
345
+ leftArm: {
346
+ x: number;
347
+ y: number;
348
+ }[];
349
+ rightArm: {
350
+ x: number;
351
+ y: number;
352
+ }[];
353
+ leftLeg: {
354
+ x: number;
355
+ y: number;
356
+ }[];
357
+ rightLeg: {
358
+ x: number;
359
+ y: number;
360
+ }[];
361
+ }
362
+
363
+ type Resolution = {
364
+ width: number;
365
+ height: number;
366
+ };
367
+
368
+ interface SegmentationData {
369
+ mask: Uint8Array;
370
+ width: number;
371
+ height: number;
372
+ }
373
+
374
+ interface SelectConfig {
375
+ options: string[] | number[];
376
+ label: string;
377
+ description?: string;
378
+ group?: string;
379
+ category?: ParameterCategory;
380
+ }
381
+
382
+ interface SelectParameter {
383
+ value: string | number;
384
+ options: string[] | number[];
385
+ label: string;
386
+ description?: string;
387
+ group: string;
388
+ category: ParameterCategory;
389
+ }
390
+
391
+ interface SliderConfig {
392
+ min?: number;
393
+ max?: number;
394
+ step?: number;
395
+ label: string;
396
+ description?: string;
397
+ group?: string;
398
+ category?: ParameterCategory;
399
+ }
400
+
401
+ interface SliderParameter {
402
+ value: number;
403
+ min: number;
404
+ max: number;
405
+ step: number;
406
+ label: string;
407
+ description?: string;
408
+ group: string;
409
+ category: ParameterCategory;
410
+ }
411
+
412
+ interface TextConfig {
413
+ label: string;
414
+ description?: string;
415
+ group?: string;
416
+ category?: ParameterCategory;
417
+ maxLength?: number;
418
+ }
419
+
420
+ interface TextParameter {
421
+ value: string;
422
+ maxLength?: number;
423
+ label: string;
424
+ description?: string;
425
+ group: string;
426
+ category: ParameterCategory;
427
+ }
428
+
429
+ interface ToggleConfig {
430
+ label: string;
431
+ description?: string;
432
+ group?: string;
433
+ category?: ParameterCategory;
434
+ }
435
+
436
+ interface ToggleParameter {
437
+ value: boolean;
438
+ label: string;
439
+ description?: string;
440
+ group: string;
441
+ category: ParameterCategory;
442
+ }
443
+
444
+ interface TouchAPI {
445
+ points: TouchPoint[];
446
+ count: number;
447
+ started: TouchPoint[];
448
+ moved: TouchPoint[];
449
+ ended: TouchPoint[];
450
+ primary: TouchPoint | null;
451
+ gestures: TouchGestureAPI;
452
+ }
453
+
454
+ interface TouchGestureAPI {
455
+ isPinching: boolean;
456
+ isRotating: boolean;
457
+ isPanning: boolean;
458
+ isTapping: boolean;
459
+ pinchScale: number;
460
+ pinchDelta: number;
461
+ rotationAngle: number;
462
+ rotationDelta: number;
463
+ panDelta: {
464
+ x: number;
465
+ y: number;
466
+ };
467
+ tapCount: number;
468
+ lastTapTime: number;
469
+ tapPosition: {
470
+ x: number;
471
+ y: number;
472
+ } | null;
473
+ }
474
+
475
+ interface TouchPoint {
476
+ id: number;
477
+ x: number;
478
+ y: number;
479
+ pressure: number;
480
+ radius: number;
481
+ radiusX: number;
482
+ radiusY: number;
483
+ rotationAngle: number;
484
+ force: number;
485
+ deltaX: number;
486
+ deltaY: number;
487
+ velocity: {
488
+ x: number;
489
+ y: number;
490
+ };
491
+ isNew: boolean;
492
+ isActive: boolean;
493
+ isEnding: boolean;
494
+ }
495
+
496
+ const VERSION = "0.2.20";
497
+
498
+ interface VideoAPI {
499
+ isConnected: boolean;
500
+ currentFrame: OffscreenCanvas | ImageBitmap | null;
501
+ frameWidth: number;
502
+ frameHeight: number;
503
+ frameRate: number;
504
+ getFrameData: () => ImageData | null;
505
+ faces: FaceData[];
506
+ hands: HandData[];
507
+ pose: PoseData | null;
508
+ segmentation: SegmentationData | null;
509
+ cv: {
510
+ enableFaceDetection(enabled: boolean): Promise<void>;
511
+ enableFaceMesh(enabled: boolean): Promise<void>;
512
+ enableHandTracking(enabled: boolean): Promise<void>;
513
+ enablePoseDetection(enabled: boolean): Promise<void>;
514
+ enableBodySegmentation(enabled: boolean): Promise<void>;
515
+ getActiveFeatures(): CVFeature[];
516
+ isProcessing(): boolean;
517
+ };
518
+ }
519
+
520
+ interface VijiAPI {
521
+ canvas: OffscreenCanvas;
522
+ ctx?: OffscreenCanvasRenderingContext2D;
523
+ gl?: WebGL2RenderingContext;
524
+ width: number;
525
+ height: number;
526
+ pixelRatio: number;
527
+ time: number;
528
+ deltaTime: number;
529
+ frameCount: number;
530
+ fps: number;
531
+ audio: AudioAPI;
532
+ video: VideoAPI;
533
+ streams: VideoAPI[];
534
+ mouse: MouseAPI;
535
+ keyboard: KeyboardAPI;
536
+ touches: TouchAPI;
537
+ device: DeviceSensorState;
538
+ devices: DeviceState[];
539
+ slider: (defaultValue: number, config: SliderConfig) => SliderParameter;
540
+ color: (defaultValue: string, config: ColorConfig) => ColorParameter;
541
+ toggle: (defaultValue: boolean, config: ToggleConfig) => ToggleParameter;
542
+ select: (defaultValue: string | number, config: SelectConfig) => SelectParameter;
543
+ text: (defaultValue: string, config: TextConfig) => TextParameter;
544
+ number: (defaultValue: number, config: NumberConfig) => NumberParameter;
545
+ image: (defaultValue: null, config: ImageConfig) => ImageParameter;
546
+ useContext(type: '2d'): OffscreenCanvasRenderingContext2D;
547
+ useContext(type: 'webgl'): WebGLRenderingContext | WebGL2RenderingContext;
548
+ }
549
+
550
+ // Runtime global - the main viji object
551
+ const viji: VijiAPI;
552
+
553
+ // Function type aliases (artists define their own render/setup functions)
554
+ type Render = (viji: VijiAPI) => void;
555
+ type Setup = (viji: VijiAPI) => void;
563
556
  }
557
+
558
+ // Module marker (enables top-level await in artist code)
559
+ export {};