alphavalid-sdk 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +133 -0
  2. package/bin/alphavalid.js +92 -0
  3. package/dist/__vite-browser-external-C7ivxuo1.mjs +18 -0
  4. package/dist/alphavalid.es.d.ts +126 -0
  5. package/dist/alphavalid.es.js +20092 -0
  6. package/dist/alphavalid.umd.d.ts +126 -0
  7. package/dist/alphavalid.umd.js +3852 -0
  8. package/dist/core/camera.d.ts +8 -0
  9. package/dist/core/camera.d.ts.map +1 -0
  10. package/dist/core/feedback.d.ts +112 -0
  11. package/dist/core/feedback.d.ts.map +1 -0
  12. package/dist/index.d.ts +126 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/setupModels-RA6BN3uf.mjs +19 -0
  15. package/dist/setupModels.d.ts +2 -0
  16. package/dist/setupModels.d.ts.map +1 -0
  17. package/dist/types/sdk.d.ts +451 -0
  18. package/dist/types/sdk.d.ts.map +1 -0
  19. package/dist/ui/baseStyles.d.ts +2 -0
  20. package/dist/ui/baseStyles.d.ts.map +1 -0
  21. package/dist/ui/captureButtonCoxinha.d.ts +13 -0
  22. package/dist/ui/captureButtonCoxinha.d.ts.map +1 -0
  23. package/dist/ui/containerStyles.d.ts +1 -0
  24. package/dist/ui/containerStyles.d.ts.map +1 -0
  25. package/dist/ui/loader.d.ts +15 -0
  26. package/dist/ui/loader.d.ts.map +1 -0
  27. package/dist/ui/overlay.d.ts +221 -0
  28. package/dist/ui/overlay.d.ts.map +1 -0
  29. package/dist/ui/overlayCoxinhaMobile.d.ts +10 -0
  30. package/dist/ui/overlayCoxinhaMobile.d.ts.map +1 -0
  31. package/dist/ui/userPreviewCoxinha.d.ts +20 -0
  32. package/dist/ui/userPreviewCoxinha.d.ts.map +1 -0
  33. package/dist/utils/canvas.d.ts +27 -0
  34. package/dist/utils/canvas.d.ts.map +1 -0
  35. package/dist/utils/dom.d.ts +3 -0
  36. package/dist/utils/dom.d.ts.map +1 -0
  37. package/dist/vision/faceDetector.d.ts +11 -0
  38. package/dist/vision/faceDetector.d.ts.map +1 -0
  39. package/models/README.md +8 -0
  40. package/models/face_landmark_68_tiny_model-shard1.bin +0 -0
  41. package/models/face_landmark_68_tiny_model-weights_manifest.json +1 -0
  42. package/models/tiny_face_detector_model-shard1.bin +0 -0
  43. package/models/tiny_face_detector_model-weights_manifest.json +1 -0
  44. package/package.json +31 -7
  45. package/public/images/alphaloader.gif +0 -0
  46. package/scripts/copy-models.cjs +31 -0
  47. package/tsconfig.json +21 -0
  48. package/vite.config.ts +19 -0
  49. package/.gitattributes +0 -2
@@ -0,0 +1,451 @@
1
+ export type AlphaValidChallengeType = 'lookForward' | 'lookUp' | 'lookDown' | 'lookLeft' | 'lookRight' | 'zoomIn' | 'zoomOut' | 'blink' | 'cheese' | 'openMouth' | 'mouthWidth';
2
+ /** Um passo de desafio (liveness) na sequência configurada. */
3
+ export interface AlphaValidChallengeStep {
4
+ /** Tipo do desafio a ser executado pelo usuário. */
5
+ type: AlphaValidChallengeType;
6
+ /** Timeout (ms) opcional para este step. Ao estourar, o step é reiniciado/reativado. */
7
+ timeoutMs?: number;
8
+ }
9
+ /**
10
+ * Opções de validação/liveness.
11
+ *
12
+ * Notas importantes:
13
+ * - Se `challenges` for informado, a sequência é executada exatamente como definida.
14
+ * - O SDK não “injeta” `lookForward` automaticamente entre steps; se quiser, inclua como step explícito.
15
+ * - Alguns desafios requerem landmarks (ex.: `blink`); o SDK solicita landmarks automaticamente quando há um step ativo.
16
+ */
17
+ export interface AlphaValidLivenessOptions {
18
+ /**
19
+ * Força look-forward como regra global (para todos os frames).
20
+ * Recomendação: prefira usar `challenges: [{ type: 'lookForward' }]` quando quiser um passo explícito.
21
+ */
22
+ requireLookForward?: boolean;
23
+ /** Sequência opcional de desafios. Quando presente, determina o progresso de `state.challenge`. */
24
+ challenges?: AlphaValidChallengeStep[];
25
+ /** 0..1: controla sensibilidade geral (quando omitido, defaults internos são derivados). */
26
+ strictness?: number;
27
+ /** 0..1. Maior = mais tolerante no lookForward (mais fácil passar). */
28
+ lookForwardTolerance?: number;
29
+ /** Tolerância (normalizada) de centralização para lookForward usando bbox/centerX. */
30
+ lookForwardCenterTol?: number;
31
+ /**
32
+ * Tolerância de yaw para lookForward quando `yawProxy` (landmarks) está disponível.
33
+ * Menor = mais estrito. Default é derivado de `strictness`.
34
+ */
35
+ lookForwardYawTol?: number;
36
+ /**
37
+ * Período de graça (ms) após o rosto desaparecer antes de emitir FACE_NOT_FOUND.
38
+ * Durante essa janela, landmarks no overlay podem ser ocultados para evitar pontos “stale”.
39
+ * Default: 900
40
+ */
41
+ faceLostGraceMs?: number;
42
+ /**
43
+ * LookForward via geometria boca/mandíbula.
44
+ * Se informado, pode ter precedência sobre yawProxy/centerX dependendo da implementação.
45
+ * Unidades: pixels do frame de vídeo.
46
+ */
47
+ lookForwardJawMouthDistMinPx?: number;
48
+ lookForwardJawMouthDistMaxPx?: number;
49
+ /** Tolerância (0..1, normalizado) para o eixo Y da boca vs jawMid ser considerado neutro. */
50
+ lookForwardMouthVsJawMidYAbsTol?: number;
51
+ /**
52
+ * Por quanto tempo (ms) o lookForward deve permanecer ok para ser aceito como stepOk.
53
+ * Default: 1000
54
+ */
55
+ lookForwardHoldMs?: number;
56
+ /** Tolerância para lookLeft/lookRight quando usando sinais simples (centerX etc). */
57
+ lookSideTol?: number;
58
+ /** Tolerância para lookUp/lookDown quando usando sinais simples (centerY/box). */
59
+ lookUpDownTol?: number;
60
+ zoomInMinArea?: number;
61
+ zoomOutMaxArea?: number;
62
+ /**
63
+ * Threshold de “olhos fechados” para blink.
64
+ * Observação: como os valores de eye open prob aqui normalmente não chegam a 0, o default é mais alto.
65
+ * Default: 0.65 (mais sensível)
66
+ */
67
+ blinkClosedThreshold?: number;
68
+ /** Threshold de “olhos abertos” para armar o blink (evita completar com olhos semicerrados). */
69
+ blinkOpenThreshold?: number;
70
+ /** Tempo mínimo (ms) que um challenge deve permanecer válido para ser aceito. Default: 150 */
71
+ challengeMinHoldMs?: number;
72
+ /** Delay mínimo (ms) depois de completar um challenge antes que o próximo possa completar. Default: 400 */
73
+ challengeCooldownMs?: number;
74
+ /**
75
+ * Threshold (delta) para sorriso (cheese).
76
+ *
77
+ * Quando `cheeseUseBaseline === true` (default), o SDK calcula um baseline do usuário (boca neutra)
78
+ * e considera “sorrindo” quando:
79
+ * `mouthSmileRatio >= (cheeseBaseline + cheeseThreshold)`
80
+ *
81
+ * Menor = mais sensível.
82
+ * Default: 0.05 (delta acima do baseline, mais sensível)
83
+ */
84
+ cheeseThreshold?: number;
85
+ /**
86
+ * Se `true` (default), calibra um baseline de sorriso por usuário (boca neutra) e valida por delta.
87
+ * Se `false`, valida por threshold absoluto (sem baseline).
88
+ * Default: true
89
+ */
90
+ cheeseUseBaseline?: boolean;
91
+ /**
92
+ * Janela (ms) para coletar baseline neutro do sorriso após iniciar ou ao entrar no step `cheese`.
93
+ * Default: 1200
94
+ */
95
+ cheeseBaselineWindowMs?: number;
96
+ /**
97
+ * Quantidade mínima de amostras para aceitar um baseline.
98
+ * Default: 8
99
+ */
100
+ cheeseBaselineMinSamples?: number;
101
+ /** Threshold (0..1) para boca aberta. Maior = exige abrir mais. Default: 0.5 (mais permissivo) */
102
+ openMouthThreshold?: number;
103
+ /** Progresso (0..1) para aceitar pose challenges. Default: 0.65 */
104
+ poseProgressAccept?: number;
105
+ /** Por quanto tempo (ms) pode reutilizar o último status bom durante head-turns quando a detecção oscila. Default: 900 */
106
+ poseGraceMs?: number;
107
+ /** Define a semântica esquerda/direita quando o preview é espelhado. Default: 'mirrored'. */
108
+ mirrorMode?: 'mirrored' | 'raw';
109
+ /**
110
+ * Threshold (ratio) para assimetria boca<->mandíbula em lookLeft/lookRight quando `poseProgressSource` usa mouthJaw.
111
+ * Default: 0.12 (≈12%).
112
+ */
113
+ lookSideRatioThr?: number;
114
+ /** Delta absoluto mínimo (ratio/unidade interna) entre lados em mouthJaw para evitar passar por jitter. Default: 0.10 */
115
+ lookSideAbsDeltaThr?: number;
116
+ /**
117
+ * Seleciona qual sinal será usado para computar progresso de pose.
118
+ * - 'auto' (default): yawProxy -> mouthJaw -> centerX
119
+ * - 'yawProxy': landmarks yawProxy (fallback p/ centerX)
120
+ * - 'mouthJaw': assimetria mouth<->jaw (fallback p/ centerX)
121
+ * - 'centerX': apenas bbox/centerX
122
+ */
123
+ poseProgressSource?: 'auto' | 'yawProxy' | 'mouthJaw' | 'centerX';
124
+ /** Thresholds absolutos para validação estrita via mouthJaw. */
125
+ lookSideNearThr?: number;
126
+ lookSideFarThr?: number;
127
+ /**
128
+ * Quanto tempo (ms) o usuário deve manter lookForward quando ele aparece como gate neutro no fluxo.
129
+ * Default: 350
130
+ */
131
+ neutralHoldMs?: number;
132
+ }
133
+ export type AlphaValidErrorCode = 'CAMERA_PERMISSION_DENIED' | 'CAMERA_NOT_FOUND' | 'CAMERA_NOT_READABLE' | 'CAMERA_OVERCONSTRAINED' | 'CAMERA_NOT_SUPPORTED' | 'CAMERA_UNKNOWN' | 'MODEL_LOAD_FAILED' | 'MODEL_LOAD_TIMEOUT';
134
+ export interface AlphaValidSdkError {
135
+ code: AlphaValidErrorCode;
136
+ message: string;
137
+ cause?: unknown;
138
+ }
139
+ export type AlphaValidStatus = 'idle' | 'initializing' | 'running' | 'ready' | 'error';
140
+ export type AlphaValidFeedbackCode = 'INITIALIZING' | 'FACE_NOT_FOUND' | 'MULTIPLE_FACES' | 'FACE_TOO_FAR' | 'FACE_TOO_CLOSE' | 'FACE_OFF_CENTER' | 'LOOK_FORWARD' | 'LOOK_UP' | 'LOOK_DOWN' | 'LOOK_LEFT' | 'LOOK_RIGHT' | 'ZOOM_IN' | 'ZOOM_OUT' | 'BLINK' | 'CHEESE' | 'OPEN_MOUTH' | 'READY';
141
+ export type AlphaValidFeedbackMessage = 'Inicializando câmera...' | 'Centralize seu rosto' | 'Aproxime o rosto' | 'Afaste o rosto' | 'Ajuste a iluminação' | 'Apenas 1 rosto por vez' | 'Rosto detectado' | 'Pronto para capturar' | 'Olhe para a câmera' | 'Olhe para cima' | 'Olhe para baixo' | 'Olhe para a esquerda' | 'Olhe para a direita' | 'Aproxime-se da câmera' | 'Afaste-se da câmera' | 'Pisque' | 'Sorria' | 'Abra a boca';
142
+ export type AlphaValidFeedback = {
143
+ code: AlphaValidFeedbackCode;
144
+ message: AlphaValidFeedbackMessage | string;
145
+ };
146
+ /** Dica visual para desafios de liveness (mesmo formato usado pelo overlay). */
147
+ export type AlphaValidHint = {
148
+ type: 'arrow';
149
+ direction: 'left' | 'right' | 'up' | 'down';
150
+ intensity?: number;
151
+ label?: string;
152
+ } | {
153
+ type: 'pulse';
154
+ label?: string;
155
+ intensity?: number;
156
+ };
157
+ export interface AlphaValidState {
158
+ /** Estado de alto nível do SDK (idle/initializing/running/ready/error). */
159
+ status: AlphaValidStatus;
160
+ /** Feedback atual (código + mensagem) para UX. */
161
+ feedback: AlphaValidFeedback;
162
+ /** Alias textual para UX (atualmente igual a feedback.message). */
163
+ message: string;
164
+ /** Indica se o SDK considera o frame pronto para captura (após liveness, se configurado). */
165
+ isReadyToCapture: boolean;
166
+ /**
167
+ * Dica visual do desafio atual (seta/pulso), quando há liveness ativo.
168
+ * Ausente quando todos os desafios foram concluídos.
169
+ */
170
+ hint?: AlphaValidHint;
171
+ /** Progresso de desafios (quando `liveness.challenges` está ativo). */
172
+ challenge?: {
173
+ enabled: boolean;
174
+ /** Índice atual na lista de desafios (0..total). */
175
+ index: number;
176
+ /** Total de passos configurados. */
177
+ total: number;
178
+ /** Step atual (quando ainda não completou todos). */
179
+ current?: AlphaValidChallengeType;
180
+ /** True quando não há step ativo (sequência concluída). */
181
+ completed: boolean;
182
+ };
183
+ /** Informações de debug (opcionais) para diagnóstico e overlay. */
184
+ debug?: {
185
+ faces?: number;
186
+ centerX?: number;
187
+ box?: {
188
+ x: number;
189
+ y: number;
190
+ width: number;
191
+ height: number;
192
+ };
193
+ eyeDist?: number;
194
+ yawProxy?: number;
195
+ leftEyeOpenProb?: number;
196
+ rightEyeOpenProb?: number;
197
+ /** Qual sinal foi usado para o progresso de pose (yawProxy | mouthJaw | centerX). */
198
+ poseProgressSource?: 'yawProxy' | 'mouthJaw' | 'centerX';
199
+ /** Debug interno do motor de validação/feedback (thresholds, razões, valores intermediários). */
200
+ fb?: any;
201
+ /** 0..1 progressos para desafios de pose. */
202
+ progress?: {
203
+ lookLeft?: number;
204
+ lookRight?: number;
205
+ lookUp?: number;
206
+ lookDown?: number;
207
+ };
208
+ /** Sorriso (cheese): width/height da boca (heurística). */
209
+ mouthSmileRatio?: number;
210
+ /** Sorriso (cheese): baseline neutro (por usuário/sessão), quando `cheeseUseBaseline` está habilitado. */
211
+ cheeseBaseline?: number;
212
+ /** Sorriso (cheese): alvo calculado (baseline + delta) quando aplicável. */
213
+ cheeseTarget?: number;
214
+ /** Tempo (ms) que o lookForward deve ser mantido para ser aceito. */
215
+ lookForwardHoldMs?: number;
216
+ /** Tempo (ms) já mantido dentro dos critérios principais do lookForward. */
217
+ lookForwardHeldMs?: number;
218
+ /** Timestamp (ms) do início do hold do lookForward (ou null se não está segurando). */
219
+ lookForwardOkSince?: number | null;
220
+ /** 0..1: progresso do hold do challenge atual (para UX/overlay). */
221
+ challengeHoldProgress?: number;
222
+ };
223
+ }
224
+ export interface AlphaValidStartOptions {
225
+ /**
226
+ * Container onde o SDK vai montar o vídeo e (opcionalmente) o overlay.
227
+ * Se omitido, usa o elemento com id 'cameraContainer'.
228
+ */
229
+ container?: HTMLElement;
230
+ /** Preset de liveness de alto nivel (sem precisar mexer em todos os thresholds). */
231
+ livenessPreset?: 'easy' | 'normal' | 'strict';
232
+ /** Callback chamado quando câmera/overlay (se houver) estão prontos e modelos foram carregados. */
233
+ onReady?: () => void;
234
+ /** Callback leve: emite o feedback atual (ideal para textos/UI do app). */
235
+ onFeedback?: (feedback: AlphaValidFeedback) => void;
236
+ /** Callback de erro normalizado. */
237
+ onError?: (error: AlphaValidSdkError) => void;
238
+ /** Controla se o overlay deve ser renderizado. Default: true (quando `uiMode` não é headless). */
239
+ overlay?: boolean;
240
+ /** Proporção do círculo guia (0..1). Default: 0.72 */
241
+ guideCircleRatio?: number;
242
+ /** Intervalo (ms) entre detecções. Default: 50 */
243
+ detectionIntervalMs?: number;
244
+ /** Caminho público (URL) de onde os models do face-api serão carregados. Default: '/alphavalid-models' */
245
+ modelsPath?: string;
246
+ /** Opções de liveness/heurísticas e sequência de desafios. */
247
+ liveness?: AlphaValidLivenessOptions;
248
+ /**
249
+ * Exige um "lookForward" válido (checar se está olhando para a câmera) no momento de habilitar captura.
250
+ * - Quando true, o botão de captura (manual) só habilita se o usuário estiver alinhado/olhando para frente.
251
+ * - Quando true, o autoCapture só dispara se o usuário estiver alinhado/olhando para frente.
252
+ *
253
+ * Observação: esta validação é intencionalmente simples e independente da pipeline de challenges.
254
+ * Default: false
255
+ */
256
+ requireLookForwardForCapture?: boolean;
257
+ /**
258
+ * Callback completo do estado (status + debug + challenge progress). */
259
+ onStateChange?: (state: AlphaValidState) => void;
260
+ /** Modo UI: 'headless' desabilita overlay. */
261
+ uiMode?: 'default' | 'headless' | 'Mobile';
262
+ /** Debug do SDK. */
263
+ debug?: {
264
+ /** Se true, solicita landmarks ao detector e desenha no overlay (custo maior). */
265
+ drawLandmarks?: boolean;
266
+ /**
267
+ * Toggles finos para o desenho de landmarks no overlay.
268
+ * Se omitido, `drawLandmarks` controla tudo (comportamento antigo).
269
+ */
270
+ draw?: {
271
+ /** Mostra pontos/centros dos olhos. */
272
+ eyes?: boolean;
273
+ /** Mostra polilinha/pontos da boca. */
274
+ mouth?: boolean;
275
+ /** Mostra nariz (ponta + linha) quando disponível. */
276
+ nose?: boolean;
277
+ /** Mostra a jaw line (polilinha). */
278
+ jaw?: boolean;
279
+ /** Mostra linhas/labels mouth<->jaw (diagnóstico). */
280
+ mouthJaw?: boolean;
281
+ /** Mostra/oculta as linhas de debug do sorriso (cheese) no painel do overlay. */
282
+ cheese?: boolean;
283
+ };
284
+ /**
285
+ * Campo extra para flags customizadas de debug (ex: showOverlayTable).
286
+ */
287
+ extra?: any;
288
+ };
289
+ /**
290
+ * Auto-capture embutido: espera `READY` + estabilidade, captura 1x e chama `onCapture`.
291
+ * Útil para evitar duplicar lógica de estabilidade no app consumidor.
292
+ */
293
+ autoCapture?: {
294
+ enabled?: boolean;
295
+ /** Tempo mínimo (ms) que o rosto deve ficar estável antes de capturar. Default: 650 */
296
+ stableMs?: number;
297
+ /** Mensagem exibida enquanto segura estabilidade (quando aplicável). */
298
+ holdStillMessage?: string;
299
+ /** Callback disparado com o Blob (JPEG) assim que capturar. */
300
+ onCapture?: (blob: Blob) => void;
301
+ };
302
+ /**
303
+ * Botão de captura manual gerenciado pelo SDK.
304
+ * - Default: enabled (true)
305
+ * - Quando `autoCapture.enabled === false`, o SDK pode exibir um botão para o usuário capturar.
306
+ */
307
+ captureButton?: {
308
+ enabled?: boolean;
309
+ /** Texto do botão. Default: 'Capturar imagem' */
310
+ text?: string;
311
+ /** Cor de fundo (CSS color). Default: '#00bcd4' */
312
+ color?: string;
313
+ };
314
+ /**
315
+ * Callback chamado após uma captura (manual ou auto), antes de finalizar o fluxo.
316
+ * Recebe o blob da foto e ações para retomar ou confirmar.
317
+ * Quando definido, o SDK **não** renderiza a UI nativa de preview (`userPreview`).
318
+ */
319
+ onPreview?: (blob: Blob, actions: {
320
+ retake: () => void;
321
+ confirm: () => void;
322
+ }) => void;
323
+ /**
324
+ * Ativa o preview gerenciado pelo SDK (UI + botões OK/Recapturar).
325
+ * - Só será aplicado quando `uiMode === 'Mobile'`.
326
+ * - Ignorado automaticamente quando `onPreview` estiver definido.
327
+ */
328
+ userPreview?: boolean;
329
+ /**
330
+ * Callback disparado quando o usuário confirma (OK) no `userPreview`.
331
+ * Observação: só é chamado quando `userPreview === true`.
332
+ */
333
+ onUserPreviewConfirm?: (blob: Blob) => void;
334
+ /** Texto do botão OK no preview (default: 'OK'). */
335
+ previewOkText?: string;
336
+ /** Texto do botão "Tirar outra" no preview (default: 'Tirar outra'). */
337
+ previewRetakeText?: string;
338
+ /**
339
+ * Loader do SDK (overlay com GIF enquanto inicializa a câmera/models).
340
+ * - Default: enabled (true)
341
+ * - O GIF default é `/images/alphaloader.gif` (mesmo do demo)
342
+ */
343
+ loader?: {
344
+ enabled?: boolean;
345
+ /** URL do gif/imagem do loader. */
346
+ src?: string;
347
+ /** Tamanho (px). Default: 120 */
348
+ sizePx?: number;
349
+ /** Tempo mínimo visível (ms). Default: 900 */
350
+ minVisibleMs?: number;
351
+ };
352
+ }
353
+ export interface FaceDetectionStatus {
354
+ faces: number;
355
+ box?: {
356
+ x: number;
357
+ y: number;
358
+ width: number;
359
+ height: number;
360
+ };
361
+ centerX?: number;
362
+ area?: number;
363
+ leftEyeOpenProb?: number;
364
+ rightEyeOpenProb?: number;
365
+ leftEyeCenter?: {
366
+ x: number;
367
+ y: number;
368
+ };
369
+ rightEyeCenter?: {
370
+ x: number;
371
+ y: number;
372
+ };
373
+ eyeDist?: number;
374
+ /** Best-effort yaw proxy from landmarks: (noseX - eyeMidX) / interOcularDistance. */
375
+ yawProxy?: number;
376
+ /** Mouth corners (normalized video space). */
377
+ mouthLeft?: {
378
+ x: number;
379
+ y: number;
380
+ };
381
+ mouthRight?: {
382
+ x: number;
383
+ y: number;
384
+ };
385
+ /** Jaw side points (normalized video space). */
386
+ jawLeft?: {
387
+ x: number;
388
+ y: number;
389
+ };
390
+ jawRight?: {
391
+ x: number;
392
+ y: number;
393
+ };
394
+ /** Distances between mouth corners and jaw sides, normalized by inter-ocular distance (scale invariant). */
395
+ mouthJawLeftDist?: number;
396
+ mouthJawRightDist?: number;
397
+ /** Absolute distances (in pixels of the underlying video frame). */
398
+ mouthJawLeftDistPx?: number;
399
+ mouthJawRightDistPx?: number;
400
+ leftEyePoints?: Array<{
401
+ x: number;
402
+ y: number;
403
+ }>;
404
+ rightEyePoints?: Array<{
405
+ x: number;
406
+ y: number;
407
+ }>;
408
+ noseTip?: {
409
+ x: number;
410
+ y: number;
411
+ };
412
+ nosePoints?: Array<{
413
+ x: number;
414
+ y: number;
415
+ }>;
416
+ mouthPoints?: Array<{
417
+ x: number;
418
+ y: number;
419
+ }>;
420
+ jawPoints?: Array<{
421
+ x: number;
422
+ y: number;
423
+ }>;
424
+ jawCenter?: {
425
+ x: number;
426
+ y: number;
427
+ };
428
+ /** Pontos centrais do lábio superior (51) e inferior (57) (normalized video space). */
429
+ mouthUpper?: {
430
+ x: number;
431
+ y: number;
432
+ };
433
+ mouthLower?: {
434
+ x: number;
435
+ y: number;
436
+ };
437
+ /** Distância vertical absoluta (px) e normalizada por eyeDist entre lábio superior e inferior. */
438
+ mouthOpenPx?: number;
439
+ mouthOpenNorm?: number;
440
+ /** Jaw top points (normalized video space). */
441
+ jawTopL?: {
442
+ x: number;
443
+ y: number;
444
+ };
445
+ jawTopR?: {
446
+ x: number;
447
+ y: number;
448
+ };
449
+ poseSource?: 'landmarks' | 'bbox';
450
+ }
451
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/types/sdk.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,QAAQ,GACR,UAAU,GACV,UAAU,GACV,WAAW,GACX,QAAQ,GACR,SAAS,GACT,OAAO,GACP,QAAQ,GACR,WAAW,GACX,YAAY,CAAC;AAEjB,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,IAAI,EAAE,uBAAuB,CAAC;IAC9B,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,mGAAmG;IACnG,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAEvC,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IAEtC,6FAA6F;IAC7F,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,2GAA2G;IAC3G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,0HAA0H;IAC1H,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAEhC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,yHAAyH;IACzH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAElE,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAC3B,0BAA0B,GAC1B,kBAAkB,GAClB,qBAAqB,GACrB,wBAAwB,GACxB,sBAAsB,GACtB,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvF,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,OAAO,CAAC;AAEZ,MAAM,MAAM,yBAAyB,GACjC,yBAAyB,GACzB,sBAAsB,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,wBAAwB,GACxB,iBAAiB,GACjB,sBAAsB,GACtB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,GACjB,sBAAsB,GACtB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,QAAQ,GACR,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,yBAAyB,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,MAAM,EAAE,gBAAgB,CAAC;IAEzB,kDAAkD;IAClD,QAAQ,EAAE,kBAAkB,CAAC;IAE7B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAEhB,6FAA6F;IAC7F,gBAAgB,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB,uEAAuE;IACvE,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,oDAAoD;QACpD,KAAK,EAAE,MAAM,CAAC;QACd,oCAAoC;QACpC,KAAK,EAAE,MAAM,CAAC;QACd,qDAAqD;QACrD,OAAO,CAAC,EAAE,uBAAuB,CAAC;QAClC,2DAA2D;QAC3D,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF,mEAAmE;IACnE,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAE1B,qFAAqF;QACrF,kBAAkB,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;QAEzD,iGAAiG;QACjG,EAAE,CAAC,EAAE,GAAG,CAAC;QAET,6CAA6C;QAC7C,QAAQ,CAAC,EAAE;YACT,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QAEF,2DAA2D;QAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,0GAA0G;QAC1G,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,4EAA4E;QAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB,qEAAqE;QACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,4EAA4E;QAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,uFAAuF;QACvF,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAEnC,oEAAoE;QACpE,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE9C,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEpD,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAE9C,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IAErC;;;;;;;OAOG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC;4EACwE;IACxE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAEjD,8CAA8C;IAC9C,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAE3C,oBAAoB;IACpB,KAAK,CAAC,EAAE;QACN,kFAAkF;QAClF,aAAa,CAAC,EAAE,OAAO,CAAC;QAExB;;;WAGG;QACH,IAAI,CAAC,EAAE;YACL,uCAAuC;YACvC,IAAI,CAAC,EAAE,OAAO,CAAC;YACf,uCAAuC;YACvC,KAAK,CAAC,EAAE,OAAO,CAAC;YAChB,sDAAsD;YACtD,IAAI,CAAC,EAAE,OAAO,CAAC;YACf,qCAAqC;YACrC,GAAG,CAAC,EAAE,OAAO,CAAC;YACd,sDAAsD;YACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;YAEnB,iFAAiF;YACjF,MAAM,CAAC,EAAE,OAAO,CAAC;SAClB,CAAC;QACF;;WAEG;QACH,KAAK,CAAC,EAAE,GAAG,CAAC;KACb,CAAC;IAEF;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,uFAAuF;QACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,wEAAwE;QACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;KAClC,CAAC;IAEF;;;;OAIG;IACH,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iDAAiD;QACjD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mDAAmD;QACnD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAEvF;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAE5C,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,mCAAmC;QACnC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,iCAAiC;QACjC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,8CAA8C;QAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAE9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,cAAc,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtC,gDAAgD;IAChD,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEpC,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErC,uFAAuF;IACvF,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,+CAA+C;IAC/C,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEnC,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export declare function ensureBaseStyles(container?: HTMLElement): void;
2
+ //# sourceMappingURL=baseStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseStyles.d.ts","sourceRoot":"","sources":["../../src/ui/baseStyles.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,WAAW,QAsDvD"}
@@ -0,0 +1,13 @@
1
+ export type CaptureButtonUiHandle = {
2
+ show: () => void;
3
+ hide: () => void;
4
+ dispose: () => void;
5
+ setEnabled: (enabled: boolean) => void;
6
+ };
7
+ export declare function createCaptureButtonCoxinhaUi(params: {
8
+ container: HTMLElement;
9
+ text?: string;
10
+ color?: string;
11
+ onClick: () => void;
12
+ }): CaptureButtonUiHandle;
13
+ //# sourceMappingURL=captureButtonCoxinha.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captureButtonCoxinha.d.ts","sourceRoot":"","sources":["../../src/ui/captureButtonCoxinha.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,CAAC;AAOF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,SAAS,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,GAAG,qBAAqB,CAsDxB"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=containerStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerStyles.d.ts","sourceRoot":"","sources":["../../src/ui/containerStyles.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export interface LoaderHandle {
2
+ show(): void;
3
+ hide(): void;
4
+ dispose(): void;
5
+ }
6
+ export interface LoaderOptions {
7
+ /** Image URL for the loader (gif). */
8
+ src?: string;
9
+ /** Size in pixels. */
10
+ sizePx?: number;
11
+ /** Minimum visible time in ms (prevents flicker). */
12
+ minVisibleMs?: number;
13
+ }
14
+ export declare function createCameraLoader(container: HTMLElement, opts?: LoaderOptions): LoaderHandle;
15
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/ui/loader.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8BD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CA4FjG"}