@viji-dev/core 0.3.12 → 0.3.13

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