@vincentt-xr/sdk 2.0.0-alpha.6 → 2.0.0-alpha.8

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 (287) hide show
  1. package/GROUNDING.md +1188 -14
  2. package/dist/{DebuggerUI-C_rbLdkh.js → DebuggerUI-C-ldiozL.js} +1 -1
  3. package/dist/{DebuggerUI-DYT_dk1E.cjs → DebuggerUI-CWX5EtQv.cjs} +1 -1
  4. package/dist/FaceMeshRenderer-BEEXZwS6.cjs +158 -0
  5. package/dist/FaceMeshRenderer-UuH5sTXG.js +1322 -0
  6. package/dist/FaceRetouch-C7h7x9kd.js +683 -0
  7. package/dist/FaceRetouch-DqftT26Y.cjs +134 -0
  8. package/dist/GLTFLoader-C5q63sKO.js +1633 -0
  9. package/dist/GLTFLoader-Cb_CRwmG.cjs +1 -0
  10. package/dist/SegmentationOverlay-DQuW3dsc.js +133 -0
  11. package/dist/SegmentationOverlay-aWVod8Kl.cjs +1 -0
  12. package/dist/assets/cache.d.ts +99 -0
  13. package/dist/assets/estimate.d.ts +11 -0
  14. package/dist/assets/index.d.ts +7 -0
  15. package/dist/assets/loaders.d.ts +28 -0
  16. package/dist/assets/react.d.ts +33 -0
  17. package/dist/calibration/calibration.d.ts +70 -0
  18. package/dist/calibration/index.d.ts +6 -0
  19. package/dist/calibration/storage.d.ts +13 -0
  20. package/dist/calibration/types.d.ts +53 -0
  21. package/dist/calibration/useXRCalibration.d.ts +46 -0
  22. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  23. package/dist/camera/devices.d.ts +26 -0
  24. package/dist/camera/index.d.ts +8 -0
  25. package/dist/camera/permission.d.ts +86 -0
  26. package/dist/camera/useCameraPermission.d.ts +35 -0
  27. package/dist/capabilities/detect.d.ts +45 -0
  28. package/dist/capabilities/index.d.ts +5 -0
  29. package/dist/capabilities/types.d.ts +120 -0
  30. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  31. package/dist/compat/environment.d.ts +5 -0
  32. package/dist/compat/index.d.ts +4 -0
  33. package/dist/compat/run.d.ts +18 -0
  34. package/dist/compat/scenarios.d.ts +10 -0
  35. package/dist/compat/types.d.ts +101 -0
  36. package/dist/components/BodyTracker/index.d.ts +9 -0
  37. package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +11 -3
  38. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +41 -5
  39. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +12 -0
  40. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  41. package/dist/components/FaceMesh/index.d.ts +2 -2
  42. package/dist/components/GestureListener/index.d.ts +11 -0
  43. package/dist/components/HandTracker/index.d.ts +10 -0
  44. package/dist/components/HolisticTracker/index.d.ts +69 -0
  45. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  46. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  47. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  48. package/dist/components/IrisEffect/index.d.ts +51 -0
  49. package/dist/components/IrisEffect/settings.d.ts +117 -0
  50. package/dist/components/LipEffect/LipEffect.d.ts +7 -1
  51. package/dist/components/LipEffect/LipEffectMaterial.d.ts +43 -7
  52. package/dist/components/LipEffect/LipEffects.d.ts +9 -0
  53. package/dist/components/LipEffect/defaults.d.ts +27 -4
  54. package/dist/components/LipEffect/index.d.ts +11 -3
  55. package/dist/components/LipEffect/settings.d.ts +271 -0
  56. package/dist/components/LipEffect/types.d.ts +56 -9
  57. package/dist/components/LipEffect/useLipDesignTextures.d.ts +11 -0
  58. package/dist/components/LipEffect/uvGuide.d.ts +59 -0
  59. package/dist/components/PersonCutout/index.d.ts +50 -0
  60. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  61. package/dist/components/SceneObjectRenderer/index.d.ts +9 -2
  62. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  63. package/dist/components/ScreenImage/index.d.ts +3 -1
  64. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  65. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  66. package/dist/components/ScreenImage/source.d.ts +6 -0
  67. package/dist/components/ScreenImage/types.d.ts +18 -0
  68. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  69. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  70. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  71. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  72. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  73. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  74. package/dist/components/XRMediaSurface/index.d.ts +2 -1
  75. package/dist/components/XRProvider/index.d.ts +16 -2
  76. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  77. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  78. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  79. package/dist/components/index.d.ts +3 -0
  80. package/dist/constants/index.d.ts +4 -1
  81. package/dist/contexts-CO0sd4JQ.cjs +1 -0
  82. package/dist/{contexts-DvQI4PqI.js → contexts-FzlnnMYD.js} +252 -246
  83. package/dist/coordinates/feed.d.ts +52 -0
  84. package/dist/coordinates/index.d.ts +5 -0
  85. package/dist/coordinates/spaces.d.ts +49 -0
  86. package/dist/coordinates/viewport.d.ts +22 -0
  87. package/dist/coordinates/world.d.ts +15 -0
  88. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  89. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  90. package/dist/debug-ui/index.d.ts +14 -0
  91. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  92. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  93. package/dist/debug-ui/media-source.cjs +1 -1
  94. package/dist/debug-ui/media-source.js +1 -1
  95. package/dist/debug-ui/product-hotspots/index.d.ts +24 -0
  96. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  97. package/dist/debug-ui/xr-diagnostics/index.d.ts +25 -0
  98. package/dist/debug-ui.cjs +3 -3
  99. package/dist/debug-ui.js +2057 -1687
  100. package/dist/detector-K8aej4MB.js +59 -0
  101. package/dist/detector-ijypGtse.cjs +1 -0
  102. package/dist/entries/core.d.ts +21 -3
  103. package/dist/entries/face-effects.d.ts +12 -4
  104. package/dist/entries/low-level.d.ts +22 -3
  105. package/dist/entries/product.d.ts +11 -0
  106. package/dist/entries/tracking.d.ts +26 -1
  107. package/dist/face-effects.cjs +155 -1
  108. package/dist/face-effects.js +1134 -2196
  109. package/dist/gestures/definitions.d.ts +85 -0
  110. package/dist/gestures/detector.d.ts +87 -0
  111. package/dist/gestures/index.d.ts +8 -0
  112. package/dist/gestures/measures.d.ts +101 -0
  113. package/dist/gestures/settings.d.ts +49 -0
  114. package/dist/{getFaceInfo-B43Cwq4n.js → getFaceInfo-BkZfaQs-.js} +5 -5
  115. package/dist/{getFaceInfo-DEzcL_Ub.cjs → getFaceInfo-ahPxQFGu.cjs} +1 -1
  116. package/dist/hooks/selectors.d.ts +68 -1
  117. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  118. package/dist/hooks/useFaceInfo.d.ts +13 -1
  119. package/dist/hooks/useFaceInfos.d.ts +1 -1
  120. package/dist/hooks/useGesture.d.ts +32 -0
  121. package/dist/hooks/useIrisTracking.d.ts +45 -0
  122. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  123. package/dist/hooks/useXRModel.d.ts +7 -0
  124. package/dist/hooks/useXRSession/facade.d.ts +44 -2
  125. package/dist/hooks/useXRSession/index.d.ts +2 -2
  126. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  127. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  128. package/dist/hooks/useXRSession/store.d.ts +52 -3
  129. package/dist/index--RgGzZ6X.cjs +47 -0
  130. package/dist/{index-uE3sKczj.js → index-CHVbH0hz.js} +4 -4
  131. package/dist/index-CeVkgsag.cjs +1 -0
  132. package/dist/index-CnGox6Xr.js +3054 -0
  133. package/dist/{index-B-s4YbWu.js → index-CsUdQ-pn.js} +113 -111
  134. package/dist/{index-CY7Z8cHV.cjs → index-DKBAh6hV.cjs} +1 -1
  135. package/dist/index-DsZwTfG0.cjs +1 -0
  136. package/dist/index-Dw6tj2Mi.js +144 -0
  137. package/dist/index-OCPjOaeP.cjs +1 -0
  138. package/dist/{index-G_5h_FJQ.js → index-s9pF4zkG.js} +999 -1014
  139. package/dist/internal-BYza1h8_.cjs +1 -0
  140. package/dist/{internal-ldPYiUF0.js → internal-vsfNQycj.js} +15 -16
  141. package/dist/internal.cjs +1 -1
  142. package/dist/internal.js +2 -2
  143. package/dist/iris/compute.d.ts +25 -0
  144. package/dist/iris/index.d.ts +4 -0
  145. package/dist/iris/lead.d.ts +19 -0
  146. package/dist/iris/types.d.ts +87 -0
  147. package/dist/landmarkMask-CbTFzBYG.js +224 -0
  148. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  149. package/dist/low-level.cjs +1 -1
  150. package/dist/low-level.js +1104 -639
  151. package/dist/main.cjs +1 -1
  152. package/dist/main.js +1519 -462
  153. package/dist/measures-9dQPdw96.js +154 -0
  154. package/dist/measures-KfJzpvod.cjs +1 -0
  155. package/dist/models/Base/index.d.ts +49 -0
  156. package/dist/models/Body/index.d.ts +1 -1
  157. package/dist/models/Face/index.d.ts +1 -1
  158. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  159. package/dist/models/Hand/HandTracking.d.ts +1 -1
  160. package/dist/models/Holistic/index.d.ts +49 -0
  161. package/dist/models/Holistic/result.d.ts +68 -0
  162. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  163. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  164. package/dist/models/index.d.ts +2 -0
  165. package/dist/product/ProductDimensions.d.ts +16 -0
  166. package/dist/product/ProductHotspot.d.ts +16 -0
  167. package/dist/product/ProductViewer.d.ts +9 -0
  168. package/dist/product/details.d.ts +53 -0
  169. package/dist/product/index.d.ts +14 -0
  170. package/dist/product/loadModelViewer.d.ts +4 -0
  171. package/dist/product/types.d.ts +71 -0
  172. package/dist/product/useProductAr.d.ts +37 -0
  173. package/dist/product/useProductDetails.d.ts +60 -0
  174. package/dist/product.cjs +1 -0
  175. package/dist/product.js +414 -0
  176. package/dist/providers-C0Dlhh9Z.js +365 -0
  177. package/dist/providers-YNwkmNeK.cjs +62 -0
  178. package/dist/quality/XRQualityController.d.ts +25 -0
  179. package/dist/quality/controller.d.ts +33 -0
  180. package/dist/quality/index.d.ts +6 -0
  181. package/dist/quality/types.d.ts +100 -0
  182. package/dist/quality/useXRQuality.d.ts +28 -0
  183. package/dist/{renderGroups-CFt1yYLB.js → renderGroups-CN1cGFUo.js} +1 -1
  184. package/dist/{renderGroups-BJsx32q5.cjs → renderGroups-O4KmaMl9.cjs} +1 -1
  185. package/dist/renderPasses-Cg-zqmEz.cjs +21 -0
  186. package/dist/renderPasses-NnKZVfBy.js +1460 -0
  187. package/dist/scene-object.cjs +1 -1
  188. package/dist/scene-object.js +2 -2
  189. package/dist/screen2d/coordinates.d.ts +20 -0
  190. package/dist/screenTransform-BenfCtZt.js +44 -0
  191. package/dist/screenTransform-BiXdpVf0.cjs +1 -0
  192. package/dist/segmentation-9PhSvc-R.cjs +1 -0
  193. package/dist/segmentation-CeOTKemr.js +5 -0
  194. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  195. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  196. package/dist/segmentation2d/index.d.ts +9 -0
  197. package/dist/segmentation2d/maskUv.d.ts +23 -0
  198. package/dist/segmentation2d/rasterize.d.ts +14 -0
  199. package/dist/segmentation2d/types.d.ts +46 -0
  200. package/dist/selectors-C5G1PMYL.js +195 -0
  201. package/dist/selectors-Du_PsVnW.cjs +1 -0
  202. package/dist/{session-CANvoLD6.cjs → session-BBr0yN8h.cjs} +7 -7
  203. package/dist/{session-Dhi0OqZo.js → session-Cy0m7l7-.js} +76 -76
  204. package/dist/settings-DRR7-snV.cjs +1 -0
  205. package/dist/settings-aQk845NJ.js +73 -0
  206. package/dist/subjects/index.d.ts +2 -0
  207. package/dist/subjects/select.d.ts +62 -0
  208. package/dist/subjects/types.d.ts +55 -0
  209. package/dist/tracking/coordinates.d.ts +5 -0
  210. package/dist/tracking-config/apply.d.ts +57 -0
  211. package/dist/tracking-config/index.d.ts +7 -0
  212. package/dist/tracking-config/resolve.d.ts +25 -0
  213. package/dist/tracking-config/storage.d.ts +8 -0
  214. package/dist/tracking-config/types.d.ts +106 -0
  215. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  216. package/dist/tracking.cjs +1 -1
  217. package/dist/tracking.js +1056 -380
  218. package/dist/types/common.d.ts +11 -1
  219. package/dist/types/compositor.d.ts +21 -0
  220. package/dist/types/gesture-tracking.d.ts +2 -2
  221. package/dist/types/hand-tracking.d.ts +3 -3
  222. package/dist/types/holistic.d.ts +121 -0
  223. package/dist/types/index.d.ts +1 -0
  224. package/dist/types/model.d.ts +22 -2
  225. package/dist/types/nodes.d.ts +29 -4
  226. package/dist/types/segmentation.d.ts +19 -0
  227. package/dist/types/session.d.ts +48 -4
  228. package/dist/useFaceInfo-Blf7FCu3.js +303 -0
  229. package/dist/useFaceInfo-C5mO8NQY.cjs +1 -0
  230. package/dist/useXRCapabilities-B1R2ghy-.cjs +1 -0
  231. package/dist/useXRCapabilities-C68v__wB.js +30 -0
  232. package/dist/utils/fns.d.ts +6 -3
  233. package/dist/utils/integrity.d.ts +4 -1
  234. package/dist/utils/updateThrottle.d.ts +2 -0
  235. package/dist/utils/useStableUniforms.d.ts +18 -0
  236. package/docs/SDK_DOCUMENTATION.md +3 -0
  237. package/docs/api/adaptive-quality.mdx +104 -0
  238. package/docs/api/asset-lifecycle.mdx +78 -0
  239. package/docs/api/camera-permission.mdx +142 -0
  240. package/docs/api/capture-recording.mdx +9 -1
  241. package/docs/api/coordinate-spaces.mdx +165 -0
  242. package/docs/api/cross-camera.mdx +88 -0
  243. package/docs/api/diagnostics-calibration.mdx +97 -0
  244. package/docs/api/face-effects.mdx +6 -0
  245. package/docs/api/face-mesh.mdx +35 -0
  246. package/docs/api/gestures.mdx +173 -0
  247. package/docs/api/holistic-tracker.mdx +159 -0
  248. package/docs/api/iris-tracking.mdx +242 -0
  249. package/docs/api/multi-subject.mdx +95 -0
  250. package/docs/api/person-cutout.mdx +136 -0
  251. package/docs/api/product-ar.mdx +111 -0
  252. package/docs/api/product-details.mdx +78 -0
  253. package/docs/api/runtime-3d.mdx +5 -0
  254. package/docs/api/screen-image.mdx +3 -1
  255. package/docs/api/screen-space-coordinates.mdx +35 -1
  256. package/docs/api/segmentation-overlay.mdx +301 -0
  257. package/docs/api/session-lifecycle.mdx +136 -0
  258. package/docs/api/trackers.mdx +18 -0
  259. package/docs/api/tracking-config.mdx +108 -0
  260. package/docs/docs.json +23 -1
  261. package/docs/examples/lip-shaders.mdx +224 -0
  262. package/docs/guides/lip-effect-textures.mdx +292 -0
  263. package/docs/guides/lip-uv-template.png +0 -0
  264. package/docs/guides/lip-uv-template.svg +1 -0
  265. package/package.json +16 -1
  266. package/dist/FaceMeshRenderer-D1WsrTLA.cjs +0 -155
  267. package/dist/FaceMeshRenderer-DSCd1H55.js +0 -1264
  268. package/dist/FaceRetouch-CMJbGThL.js +0 -551
  269. package/dist/FaceRetouch-DsE0Dbw-.cjs +0 -134
  270. package/dist/contexts-h-9TRH0r.cjs +0 -1
  271. package/dist/index-C0-fg1Hk.cjs +0 -1
  272. package/dist/index-CxMEeCRP.cjs +0 -1
  273. package/dist/index-D67hHm44.cjs +0 -1
  274. package/dist/index-DPPpU5By.cjs +0 -17
  275. package/dist/index-DYfY9ljy.js +0 -111
  276. package/dist/index-I4eF5TKT.js +0 -1457
  277. package/dist/internal-MvKrz0Nt.cjs +0 -1
  278. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  279. package/dist/renderLayers-zrK2pv5O.js +0 -13
  280. package/dist/renderPasses-C72MbZ-a.js +0 -1500
  281. package/dist/renderPasses-D-Krl6D0.cjs +0 -21
  282. package/dist/selectors-ByKNTXeA.js +0 -59
  283. package/dist/selectors-CAwmL9VW.cjs +0 -1
  284. package/dist/useFaceInfo-BSZq7AO1.cjs +0 -1
  285. package/dist/useFaceInfo-FVQBBNdY.js +0 -62
  286. package/dist/useFaceResults-C3oZkn2Z.cjs +0 -1
  287. package/dist/useFaceResults-D62STzT1.js +0 -19
package/dist/low-level.js CHANGED
@@ -1,24 +1,28 @@
1
- import { u as se, X as O } from "./index-I4eF5TKT.js";
2
- import { u as le } from "./index-B-s4YbWu.js";
3
- import { H as dt, a as ut } from "./index-B-s4YbWu.js";
4
- import { c as ce } from "./selectors-ByKNTXeA.js";
5
- import { u as mt, b as ft, e as pt, a as gt, d as bt } from "./selectors-ByKNTXeA.js";
6
- import { useEffect as M, useState as S, useRef as X, useCallback as de, useLayoutEffect as ue, useMemo as $, Children as he, isValidElement as me } from "react";
7
- import { c as fe } from "./getFaceInfo-B43Cwq4n.js";
8
- import { d as xt, e as vt } from "./getFaceInfo-B43Cwq4n.js";
9
- import { jsx as g, jsxs as k, Fragment as W } from "react/jsx-runtime";
10
- import { PerspectiveCamera as pe } from "@react-three/drei";
11
- import { S as Ct, g as St, c as Rt, d as It, u as Et } from "./index-uE3sKczj.js";
12
- import { u as ee } from "./useFaceResults-D62STzT1.js";
13
- import { h as Ft } from "./hasFullUnitUVBounds-BGvcFsQM.js";
14
- import { X as ge, a as be, b as we } from "./contexts-DvQI4PqI.js";
15
- import { B as zt, M as Xt, h as kt, i as At, T as Lt, c as Vt, j as Dt, k as Bt, g as Wt, e as _t, f as Ht, r as Pt, t as $t, d as qt, u as Ut } from "./contexts-DvQI4PqI.js";
16
- import * as L from "three";
1
+ import { u as ie, X as D, a as he, z as $, m as ge, d as ye, A as we, s as be, g as ee } from "./index-CnGox6Xr.js";
2
+ import { I as At, G as Lt, C as _t, J as Xt, f as Ot, V as zt, K as Dt, L as Pt, B as Vt, H as $t, M as Bt, N as Nt, O as Wt, P as Ht, Q as qt, W as Gt, R as Ut, T as jt, U as Kt, E as Qt } from "./index-CnGox6Xr.js";
3
+ import { u as Se } from "./index-CsUdQ-pn.js";
4
+ import { H as Jt, a as Zt } from "./index-CsUdQ-pn.js";
5
+ import { a as ve } from "./selectors-C5G1PMYL.js";
6
+ import { k as tr, j as rr, u as ar, c as nr, o as sr, f as ir, l as or, g as lr, m as cr, p as dr, e as ur, d as mr, b as fr, n as pr, i as hr, h as gr } from "./selectors-C5G1PMYL.js";
7
+ import { useEffect as A, useState as M, useRef as _, useCallback as xe, useLayoutEffect as Re, useMemo as G, Children as Ce, isValidElement as Ee } from "react";
8
+ import { e as Me } from "./getFaceInfo-BkZfaQs-.js";
9
+ import { c as wr, b as br } from "./getFaceInfo-BkZfaQs-.js";
10
+ import { jsx as b, jsxs as X, Fragment as N } from "react/jsx-runtime";
11
+ import { PerspectiveCamera as ke } from "@react-three/drei";
12
+ import { S as vr, g as xr, b as Rr, c as Cr, u as Er } from "./index-CHVbH0hz.js";
13
+ import { u as oe } from "./measures-9dQPdw96.js";
14
+ import { H as kr, O as Tr, P as Ir, h as Fr, a as Ar, c as Lr, f as _r, d as Xr, e as Or, g as zr, m as Dr, b as Pr, t as Vr, i as $r } from "./measures-9dQPdw96.js";
15
+ import { h as Nr } from "./hasFullUnitUVBounds-BGvcFsQM.js";
16
+ import { X as Te, a as Ie, b as Fe } from "./contexts-FzlnnMYD.js";
17
+ import { B as Hr, M as qr, h as Gr, i as Ur, T as jr, c as Kr, j as Qr, k as Yr, g as Jr, e as Zr, f as ea, r as ta, t as ra, d as aa, u as na } from "./contexts-FzlnnMYD.js";
18
+ import { c as ia, g as oa, s as la, a as ca } from "./detector-K8aej4MB.js";
19
+ import { v as ua, j as ma, I as fa, M as pa, S as ha, m as ga, k as ya, w as wa, l as ba, c as Sa, n as va, q as xa, x as Ra, r as Ca, t as Ea, o as Ma, u as ka, p as Ta, s as Ia, b as Fa, a as Aa } from "./providers-C0Dlhh9Z.js";
20
+ import * as z from "three";
17
21
  const B = ({
18
22
  children: e,
19
23
  config: t,
20
- style: n
21
- }) => /* @__PURE__ */ g(
24
+ style: a
25
+ }) => /* @__PURE__ */ b(
22
26
  "div",
23
27
  {
24
28
  "data-render-target": t.name,
@@ -30,83 +34,88 @@ const B = ({
30
34
  pointerEvents: t.pointerEvents ?? "none",
31
35
  zIndex: t.zIndex,
32
36
  opacity: t.hidden ? 0 : 1,
33
- ...n
37
+ ...a
34
38
  },
35
39
  children: e
36
40
  }
37
- ), q = ({
41
+ ), U = ({
38
42
  canvas: e,
39
43
  layout: t,
40
- media: n,
44
+ media: a,
41
45
  mirrored: r,
42
- filter: o
46
+ filter: n
43
47
  }) => {
44
- const i = Math.round(t.destination.width), a = Math.round(t.destination.height);
45
- e.width !== i && (e.width = i), e.height !== a && (e.height = a);
46
- const s = e.getContext("2d");
47
- s && (s.setTransform(1, 0, 0, 1, 0, 0), s.clearRect(0, 0, i, a), r && (s.translate(i, 0), s.scale(-1, 1)), o && (s.filter = o), s.drawImage(n, t.offsetX, t.offsetY, t.drawWidth, t.drawHeight), o && (s.filter = "none"), s.setTransform(1, 0, 0, 1, 0, 0));
48
- }, te = ({
48
+ const c = Math.round(t.destination.width), u = Math.round(t.destination.height);
49
+ e.width !== c && (e.width = c), e.height !== u && (e.height = u);
50
+ const d = e.getContext("2d");
51
+ d && (d.setTransform(1, 0, 0, 1, 0, 0), d.clearRect(0, 0, c, u), r && (d.translate(c, 0), d.scale(-1, 1)), n && (d.filter = n), d.drawImage(a, t.offsetX, t.offsetY, t.drawWidth, t.drawHeight), n && (d.filter = "none"), d.setTransform(1, 0, 0, 1, 0, 0));
52
+ }, le = ({
49
53
  canvasRef: e,
50
54
  enabled: t = !0,
51
- fps: n = 30,
55
+ fps: a = 30,
52
56
  imageRef: r,
53
- layout: o,
54
- mirrored: i,
55
- sourceKind: a,
56
- videoRef: s
57
+ layout: n,
58
+ mirrored: c,
59
+ sourceKind: u,
60
+ videoRef: d
57
61
  }) => {
58
- M(() => {
62
+ A(() => {
59
63
  if (!t) {
60
- const b = e.current, f = b == null ? void 0 : b.getContext("2d");
61
- b && f && f.clearRect(0, 0, b.width, b.height);
64
+ const p = e.current, g = p == null ? void 0 : p.getContext("2d");
65
+ p && g && g.clearRect(0, 0, p.width, p.height);
62
66
  return;
63
67
  }
64
- let l = 0, c = 0;
65
- const d = n > 0 ? 1e3 / n : 0, h = (b) => {
66
- if (l = requestAnimationFrame(h), d > 0 && b - c < d) return;
67
- c = b;
68
- const f = e.current;
69
- if (!f || !o) return;
70
- if (a === "image") {
71
- const p = r.current;
72
- if (!p || !p.complete || p.naturalWidth <= 0 || p.naturalHeight <= 0)
68
+ let i = 0, f = 0;
69
+ const h = a > 0 ? 1e3 / a : 0, s = (p) => {
70
+ if (i = requestAnimationFrame(s), h > 0 && p - f < h) return;
71
+ f = p;
72
+ const g = e.current;
73
+ if (!g || !n) return;
74
+ if (u === "image") {
75
+ const l = r.current;
76
+ if (!l || !l.complete || l.naturalWidth <= 0 || l.naturalHeight <= 0)
73
77
  return;
74
- q({
75
- canvas: f,
76
- layout: o,
77
- media: p,
78
- mirrored: i
78
+ U({
79
+ canvas: g,
80
+ layout: n,
81
+ media: l,
82
+ mirrored: c
79
83
  });
80
84
  return;
81
85
  }
82
- const w = s.current;
83
- !w || w.readyState < 2 || w.videoWidth <= 0 || w.videoHeight <= 0 || q({
84
- canvas: f,
85
- layout: o,
86
- media: w,
87
- mirrored: i
86
+ const o = d.current;
87
+ !o || o.readyState < 2 || o.videoWidth <= 0 || o.videoHeight <= 0 || U({
88
+ canvas: g,
89
+ layout: n,
90
+ media: o,
91
+ mirrored: c
88
92
  });
89
93
  };
90
- return l = requestAnimationFrame(h), () => {
91
- cancelAnimationFrame(l);
94
+ return i = requestAnimationFrame(s), () => {
95
+ cancelAnimationFrame(i);
92
96
  };
93
- }, [e, t, n, r, o, i, a, s]);
94
- }, xe = ({
97
+ }, [e, t, a, r, n, c, u, d]);
98
+ }, Ae = ({
95
99
  canvasRef: e,
96
100
  imageRef: t,
97
- layer: n,
101
+ layer: a,
98
102
  layout: r,
99
- mirrored: o,
100
- sourceKind: i,
101
- videoRef: a
102
- }) => (te({
103
+ mirrored: n,
104
+ onCaptureTarget: c,
105
+ sourceKind: u,
106
+ videoRef: d
107
+ }) => (le({
103
108
  canvasRef: e,
104
109
  imageRef: t,
105
110
  layout: r,
106
- mirrored: o,
107
- sourceKind: i,
108
- videoRef: a
109
- }), /* @__PURE__ */ g(B, { config: n, children: /* @__PURE__ */ g(
111
+ mirrored: n,
112
+ sourceKind: u,
113
+ videoRef: d
114
+ }), A(() => {
115
+ const i = e.current;
116
+ if (i)
117
+ return c == null || c(i), () => c == null ? void 0 : c(void 0);
118
+ }, [e, c]), /* @__PURE__ */ b(B, { config: a, children: /* @__PURE__ */ b(
110
119
  "canvas",
111
120
  {
112
121
  ref: e,
@@ -119,84 +128,84 @@ const B = ({
119
128
  background: "#000"
120
129
  }
121
130
  }
122
- ) })), tt = ({
131
+ ) })), St = ({
123
132
  canvasRef: e,
124
133
  controlInsetTop: t,
125
- debugVisible: n,
134
+ debugVisible: a,
126
135
  fps: r = 15,
127
- imageRef: o,
128
- layer: i,
129
- layout: a,
130
- mirrored: s,
131
- sourceKind: l,
132
- videoRef: c,
133
- viewportSize: d
136
+ imageRef: n,
137
+ layer: c,
138
+ layout: u,
139
+ mirrored: d,
140
+ sourceKind: i,
141
+ videoRef: f,
142
+ viewportSize: h
134
143
  }) => {
135
- te({
144
+ le({
136
145
  canvasRef: e,
137
- enabled: n,
146
+ enabled: a,
138
147
  fps: r,
139
- imageRef: o,
140
- layout: a,
141
- mirrored: s,
142
- sourceKind: l,
143
- videoRef: c
148
+ imageRef: n,
149
+ layout: u,
150
+ mirrored: d,
151
+ sourceKind: i,
152
+ videoRef: f
144
153
  });
145
- const h = Math.min(220, Math.max(120, d.width * 0.22)), b = d.width > 0 && d.height > 0 ? d.width / d.height : 1, f = Math.min(d.height - 24, Math.max(t ?? 16, 16));
146
- return /* @__PURE__ */ g(B, { config: i, children: /* @__PURE__ */ g(
154
+ const s = Math.min(220, Math.max(120, h.width * 0.22)), p = h.width > 0 && h.height > 0 ? h.width / h.height : 1, g = Math.min(h.height - 24, Math.max(t ?? 16, 16));
155
+ return /* @__PURE__ */ b(B, { config: c, children: /* @__PURE__ */ b(
147
156
  "canvas",
148
157
  {
149
158
  ref: e,
150
159
  style: {
151
160
  position: "absolute",
152
161
  left: 16,
153
- top: f,
154
- width: n ? h : 1,
155
- height: n ? "auto" : 1,
156
- aspectRatio: `${b}`,
157
- opacity: n ? 0.85 : 0,
162
+ top: g,
163
+ width: a ? s : 1,
164
+ height: a ? "auto" : 1,
165
+ aspectRatio: `${p}`,
166
+ opacity: a ? 0.85 : 0,
158
167
  borderRadius: 10,
159
- border: n ? "1px solid rgba(255,255,255,0.16)" : "none",
168
+ border: a ? "1px solid rgba(255,255,255,0.16)" : "none",
160
169
  pointerEvents: "none",
161
170
  objectFit: "contain",
162
171
  background: "#000"
163
172
  }
164
173
  }
165
174
  ) });
166
- }, ve = {
175
+ }, Le = {
167
176
  audio: !1,
168
177
  video: {
169
178
  facingMode: "user",
170
179
  frameRate: { ideal: 30, max: 60 }
171
180
  }
172
- }, ye = {
181
+ }, _e = {
173
182
  name: "viewport-live",
174
183
  clearColor: "#000000",
175
184
  pointerEvents: "none",
176
185
  zIndex: 0
177
- }, Ce = {
186
+ }, Xe = {
178
187
  name: "viewport-ui",
179
188
  clearColor: "transparent",
180
189
  pointerEvents: "auto",
181
190
  zIndex: 5
182
- }, Se = {
191
+ }, Oe = {
183
192
  name: "viewport-scene",
184
193
  clearColor: "transparent",
185
194
  pointerEvents: "auto",
186
195
  zIndex: 1
187
- }, A = {
196
+ }, O = {
188
197
  webcam: { icon: "◉", label: "Webcam" },
189
198
  image: { icon: "▣", label: "Images" },
190
199
  video: { icon: "▶", label: "Videos" }
191
- }, Re = ({
200
+ }, ze = ({
192
201
  imageRef: e,
193
202
  selectedSource: t,
194
- videoRef: n
195
- }) => /* @__PURE__ */ k(W, { children: [
196
- /* @__PURE__ */ g(
203
+ videoRef: a
204
+ }) => /* @__PURE__ */ X(N, { children: [
205
+ /* @__PURE__ */ b(
197
206
  "video",
198
207
  {
199
- ref: n,
208
+ ref: a,
200
209
  style: {
201
210
  position: "absolute",
202
211
  width: 1,
@@ -206,7 +215,7 @@ const B = ({
206
215
  }
207
216
  }
208
217
  ),
209
- /* @__PURE__ */ g(
218
+ /* @__PURE__ */ b(
210
219
  "img",
211
220
  {
212
221
  ref: e,
@@ -220,13 +229,13 @@ const B = ({
220
229
  }
221
230
  }
222
231
  )
223
- ] }), Y = ({
232
+ ] }), te = ({
224
233
  dock: e,
225
234
  label: t,
226
- onChange: n,
235
+ onChange: a,
227
236
  options: r,
228
- value: o
229
- }) => /* @__PURE__ */ g(
237
+ value: n
238
+ }) => /* @__PURE__ */ b(
230
239
  "div",
231
240
  {
232
241
  style: {
@@ -243,7 +252,7 @@ const B = ({
243
252
  boxShadow: "0 12px 30px rgba(0,0,0,0.18)",
244
253
  backdropFilter: "blur(10px)"
245
254
  },
246
- children: /* @__PURE__ */ k(
255
+ children: /* @__PURE__ */ X(
247
256
  "label",
248
257
  {
249
258
  style: {
@@ -254,12 +263,12 @@ const B = ({
254
263
  fontWeight: 700
255
264
  },
256
265
  children: [
257
- /* @__PURE__ */ g("span", { children: t }),
258
- /* @__PURE__ */ g(
266
+ /* @__PURE__ */ b("span", { children: t }),
267
+ /* @__PURE__ */ b(
259
268
  "select",
260
269
  {
261
- value: o,
262
- onChange: (i) => n(i.target.value),
270
+ value: n,
271
+ onChange: (c) => a(c.target.value),
263
272
  style: {
264
273
  minWidth: 180,
265
274
  maxWidth: "calc(100vw - 52px)",
@@ -270,31 +279,31 @@ const B = ({
270
279
  color: "#e5eefb",
271
280
  padding: "0 10px"
272
281
  },
273
- children: r.map((i) => /* @__PURE__ */ g("option", { value: i.id, style: { color: "#111827" }, children: i.label }, i.id))
282
+ children: r.map((c) => /* @__PURE__ */ b("option", { value: c.id, style: { color: "#111827" }, children: c.label }, c.id))
274
283
  }
275
284
  )
276
285
  ]
277
286
  }
278
287
  )
279
288
  }
280
- ), Ie = ({
289
+ ), De = ({
281
290
  dock: e,
282
291
  imageOptions: t,
283
- selectedImageId: n,
292
+ selectedImageId: a,
284
293
  selectedSource: r,
285
- selectedVideoId: o,
286
- setSelectedImageId: i,
287
- setSelectedSource: a,
288
- setSelectedVideoId: s,
289
- showMediaControls: l,
290
- videoOptions: c
294
+ selectedVideoId: n,
295
+ setSelectedImageId: c,
296
+ setSelectedSource: u,
297
+ setSelectedVideoId: d,
298
+ showMediaControls: i,
299
+ videoOptions: f
291
300
  }) => {
292
- const [d, h] = S(!1), b = ["webcam", "image", "video"].filter((f) => f === "image" ? t.length > 0 : f === "video" ? c.length > 0 : !0);
293
- return l ? d ? /* @__PURE__ */ g(
301
+ const [h, s] = M(!1), p = ["webcam", "image", "video"].filter((g) => g === "image" ? t.length > 0 : g === "video" ? f.length > 0 : !0);
302
+ return i ? h ? /* @__PURE__ */ b(
294
303
  "button",
295
304
  {
296
305
  type: "button",
297
- onClick: () => h(!1),
306
+ onClick: () => s(!1),
298
307
  "aria-label": "Open media controls",
299
308
  title: "Open media controls",
300
309
  style: {
@@ -315,8 +324,8 @@ const B = ({
315
324
  },
316
325
  children: "≡"
317
326
  }
318
- ) : /* @__PURE__ */ k(W, { children: [
319
- /* @__PURE__ */ k(
327
+ ) : /* @__PURE__ */ X(N, { children: [
328
+ /* @__PURE__ */ X(
320
329
  "div",
321
330
  {
322
331
  style: {
@@ -331,7 +340,7 @@ const B = ({
331
340
  maxWidth: "calc(100vw - 32px)"
332
341
  },
333
342
  children: [
334
- /* @__PURE__ */ g(
343
+ /* @__PURE__ */ b(
335
344
  "div",
336
345
  {
337
346
  style: {
@@ -346,15 +355,15 @@ const B = ({
346
355
  backdropFilter: "blur(10px)",
347
356
  overflowX: "auto"
348
357
  },
349
- children: b.map((f) => {
350
- const w = f === r;
351
- return /* @__PURE__ */ k(
358
+ children: p.map((g) => {
359
+ const o = g === r;
360
+ return /* @__PURE__ */ X(
352
361
  "button",
353
362
  {
354
363
  type: "button",
355
- onClick: () => a(f),
356
- "aria-pressed": w,
357
- title: A[f].label,
364
+ onClick: () => u(g),
365
+ "aria-pressed": o,
366
+ title: O[g].label,
358
367
  style: {
359
368
  border: "none",
360
369
  borderRadius: 999,
@@ -365,26 +374,26 @@ const B = ({
365
374
  alignItems: "center",
366
375
  justifyContent: "center",
367
376
  gap: 8,
368
- background: w ? "rgba(56, 189, 248, 0.18)" : "rgba(255,255,255,0.04)",
369
- color: w ? "#e0f2fe" : "rgba(229,238,251,0.82)",
377
+ background: o ? "rgba(56, 189, 248, 0.18)" : "rgba(255,255,255,0.04)",
378
+ color: o ? "#e0f2fe" : "rgba(229,238,251,0.82)",
370
379
  cursor: "pointer",
371
380
  flex: "0 0 auto"
372
381
  },
373
382
  children: [
374
- /* @__PURE__ */ g("span", { style: { fontSize: 14, lineHeight: 1 }, children: A[f].icon }),
375
- /* @__PURE__ */ g("span", { style: { fontSize: 12, fontWeight: 700, letterSpacing: "0.01em" }, children: A[f].label })
383
+ /* @__PURE__ */ b("span", { style: { fontSize: 14, lineHeight: 1 }, children: O[g].icon }),
384
+ /* @__PURE__ */ b("span", { style: { fontSize: 12, fontWeight: 700, letterSpacing: "0.01em" }, children: O[g].label })
376
385
  ]
377
386
  },
378
- f
387
+ g
379
388
  );
380
389
  })
381
390
  }
382
391
  ),
383
- /* @__PURE__ */ g(
392
+ /* @__PURE__ */ b(
384
393
  "button",
385
394
  {
386
395
  type: "button",
387
- onClick: () => h(!0),
396
+ onClick: () => s(!0),
388
397
  "aria-label": "Close media controls",
389
398
  title: "Close media controls",
390
399
  style: {
@@ -405,627 +414,628 @@ const B = ({
405
414
  ]
406
415
  }
407
416
  ),
408
- r === "image" && t.length > 0 && /* @__PURE__ */ g(
409
- Y,
417
+ r === "image" && t.length > 0 && /* @__PURE__ */ b(
418
+ te,
410
419
  {
411
420
  dock: e,
412
421
  label: "Image Asset",
413
422
  options: t,
414
- value: n,
415
- onChange: i
423
+ value: a,
424
+ onChange: c
416
425
  }
417
426
  ),
418
- r === "video" && c.length > 0 && /* @__PURE__ */ g(
419
- Y,
427
+ r === "video" && f.length > 0 && /* @__PURE__ */ b(
428
+ te,
420
429
  {
421
430
  dock: e,
422
431
  label: "Video Asset",
423
- options: c,
424
- value: o,
425
- onChange: s
432
+ options: f,
433
+ value: n,
434
+ onChange: d
426
435
  }
427
436
  )
428
437
  ] }) : null;
429
- }, Ee = ({
438
+ }, Pe = ({
430
439
  containerRef: e,
431
440
  displayCanvasRef: t,
432
- imageOptions: n,
441
+ imageOptions: a,
433
442
  imageRef: r,
434
- layout: o,
435
- managesOwnMedia: i,
436
- mediaDock: a,
437
- mode: s,
438
- overlayContent: l,
439
- renderOutputs: c,
440
- sceneContent: d,
441
- selectedImageId: h,
442
- selectedSource: b,
443
- selectedVideoId: f,
444
- setSceneRenderOutputs: w,
445
- setSelectedImageId: p,
443
+ layout: n,
444
+ managesOwnMedia: c,
445
+ mediaDock: u,
446
+ mode: d,
447
+ overlayContent: i,
448
+ renderOutputs: f,
449
+ sceneContent: h,
450
+ selectedImageId: s,
451
+ selectedSource: p,
452
+ selectedVideoId: g,
453
+ setSceneRenderOutputs: o,
454
+ setSelectedImageId: l,
446
455
  setSelectedSource: m,
447
- setSelectedVideoId: y,
448
- showMediaControls: F,
456
+ setSelectedVideoId: w,
457
+ showMediaControls: S,
449
458
  style: R,
450
- videoOptions: v,
451
- videoRef: I,
452
- viewportSize: x,
453
- mirrored: u
454
- }) => /* @__PURE__ */ k(
455
- "div",
456
- {
457
- ref: e,
458
- style: {
459
- position: "fixed",
460
- inset: 0,
461
- overflow: "hidden",
462
- background: "#000",
463
- ...R
464
- },
465
- children: [
466
- /* @__PURE__ */ g(Re, { imageRef: r, selectedSource: b, videoRef: I }),
467
- s === "dom" && i && /* @__PURE__ */ g(
468
- xe,
469
- {
470
- canvasRef: t,
471
- imageRef: r,
472
- videoRef: I,
473
- layer: ye,
474
- layout: o,
475
- mirrored: u,
476
- sourceKind: b === "image" ? "image" : "video"
477
- }
478
- ),
479
- (s === "r3f" || s === "hybrid") && /* @__PURE__ */ g(B, { config: Se, children: /* @__PURE__ */ g(
480
- ge,
481
- {
482
- onRenderOutputs: w,
483
- renderOutputs: {
484
- sceneColor: c.sceneColor || c.finalColor,
485
- sceneDepth: c.sceneDepth
486
- },
487
- renderTargetSize: x,
488
- style: { width: "100%", height: "100%" },
489
- children: d
490
- }
491
- ) }),
492
- /* @__PURE__ */ k(B, { config: Ce, children: [
493
- i && /* @__PURE__ */ g(
494
- Ie,
459
+ videoOptions: x,
460
+ videoRef: E,
461
+ viewportSize: v,
462
+ mirrored: y
463
+ }) => {
464
+ const { session: k } = ie();
465
+ return /* @__PURE__ */ X(
466
+ "div",
467
+ {
468
+ ref: e,
469
+ style: {
470
+ position: "fixed",
471
+ inset: 0,
472
+ overflow: "hidden",
473
+ background: "#000",
474
+ ...R
475
+ },
476
+ children: [
477
+ /* @__PURE__ */ b(ze, { imageRef: r, selectedSource: p, videoRef: E }),
478
+ d === "dom" && c && /* @__PURE__ */ b(
479
+ Ae,
495
480
  {
496
- dock: a,
497
- imageOptions: n,
498
- selectedImageId: h,
499
- selectedSource: b,
500
- selectedVideoId: f,
501
- setSelectedImageId: p,
502
- setSelectedSource: m,
503
- setSelectedVideoId: y,
504
- showMediaControls: F,
505
- videoOptions: v
481
+ canvasRef: t,
482
+ imageRef: r,
483
+ videoRef: E,
484
+ layer: _e,
485
+ layout: n,
486
+ mirrored: y,
487
+ onCaptureTarget: k._setCaptureTarget,
488
+ sourceKind: p === "image" ? "image" : "video"
506
489
  }
507
490
  ),
508
- l
509
- ] })
510
- ]
511
- }
512
- ), Te = 5, Fe = 1, Me = (e, t) => t, ze = "brightness(2.2) contrast(1.5) saturate(1.25)", Xe = ({
491
+ (d === "r3f" || d === "hybrid") && /* @__PURE__ */ b(B, { config: Oe, children: /* @__PURE__ */ b(
492
+ Te,
493
+ {
494
+ onRenderOutputs: o,
495
+ renderOutputs: {
496
+ sceneColor: f.sceneColor || f.finalColor,
497
+ sceneDepth: f.sceneDepth
498
+ },
499
+ renderTargetSize: v,
500
+ style: { width: "100%", height: "100%" },
501
+ children: h
502
+ }
503
+ ) }),
504
+ /* @__PURE__ */ X(B, { config: Xe, children: [
505
+ c && /* @__PURE__ */ b(
506
+ De,
507
+ {
508
+ dock: u,
509
+ imageOptions: a,
510
+ selectedImageId: s,
511
+ selectedSource: p,
512
+ selectedVideoId: g,
513
+ setSelectedImageId: l,
514
+ setSelectedSource: m,
515
+ setSelectedVideoId: w,
516
+ showMediaControls: S,
517
+ videoOptions: x
518
+ }
519
+ ),
520
+ i
521
+ ] })
522
+ ]
523
+ }
524
+ );
525
+ }, Ve = 5, $e = 1, Be = (e, t) => t, Ne = "brightness(2.2) contrast(1.5) saturate(1.25)", We = ({
513
526
  enabled: e,
514
527
  displayMirrored: t,
515
- imageRef: n,
528
+ imageRef: a,
516
529
  layout: r,
517
- mode: o,
518
- numFaces: i,
519
- selectedSource: a,
520
- sourceStream: s,
521
- videoRef: l
530
+ mode: n,
531
+ numFaces: c,
532
+ selectedSource: u,
533
+ sourceStream: d,
534
+ videoRef: i
522
535
  }) => {
523
- const { session: c } = se(), d = X(null), h = X(!1), b = X(document.createElement("canvas")), {
524
- ready: f,
525
- node: w,
526
- error: p
527
- } = le(O.FACE_TRACKER, {
528
- numFaces: i ?? (o === "head-binding" ? Fe : Te)
529
- }), [m, y] = S("idle"), [F, R] = S(null), v = e && f && !!w, I = ee({
530
- node: v ? w : null,
531
- enabled: v,
532
- selectedSource: a,
533
- onFrame: de(() => {
534
- R(null), y("ready");
536
+ const { session: f } = ie(), h = _(null), s = _(!1), p = _(document.createElement("canvas")), {
537
+ ready: g,
538
+ node: o,
539
+ error: l
540
+ } = Se(D.FACE_TRACKER, {
541
+ numFaces: c ?? (n === "head-binding" ? $e : Ve)
542
+ }), [m, w] = M("idle"), [S, R] = M(null), x = e && g && !!o, E = oe({
543
+ node: x ? o : null,
544
+ enabled: x,
545
+ selectedSource: u,
546
+ onFrame: xe(() => {
547
+ R(null), w("ready");
535
548
  }, [])
536
549
  });
537
- return M(() => {
550
+ return A(() => {
538
551
  if (!e || !r) return;
539
- const x = () => {
540
- const C = a === "image" ? n.current : l.current;
552
+ const v = () => {
553
+ const C = u === "image" ? a.current : i.current;
541
554
  if (C) {
542
555
  if (C instanceof HTMLImageElement) {
543
556
  if (!C.complete || C.naturalWidth <= 0 || C.naturalHeight <= 0) return;
544
557
  } else if (C.readyState < 2 || C.videoWidth <= 0 || C.videoHeight <= 0)
545
558
  return;
546
- q({
547
- canvas: b.current,
559
+ U({
560
+ canvas: p.current,
548
561
  layout: r,
549
562
  media: C,
550
563
  mirrored: t,
551
- filter: a === "webcam" ? ze : void 0
564
+ filter: u === "webcam" ? Ne : void 0
552
565
  });
553
566
  }
554
567
  };
555
- if (a === "image") {
556
- x();
568
+ if (u === "image") {
569
+ v();
557
570
  return;
558
571
  }
559
- let u = 0;
560
- const E = () => {
561
- u = requestAnimationFrame(E), x();
572
+ let y = 0;
573
+ const k = () => {
574
+ y = requestAnimationFrame(k), v();
562
575
  };
563
- return u = requestAnimationFrame(E), () => cancelAnimationFrame(u);
564
- }, [t, e, n, r, a, l]), M(() => {
565
- var V;
576
+ return y = requestAnimationFrame(k), () => cancelAnimationFrame(y);
577
+ }, [t, e, a, r, u, i]), A(() => {
578
+ var P;
566
579
  if (!e) {
567
- y("idle"), R(null), h.current = !1, d.current = null;
580
+ w("idle"), R(null), s.current = !1, h.current = null;
568
581
  return;
569
582
  }
570
583
  if (!r) {
571
- y("initializing");
584
+ w("initializing");
572
585
  return;
573
586
  }
574
- const x = (s == null ? void 0 : s.id) ?? (((V = l.current) == null ? void 0 : V.srcObject) instanceof MediaStream ? l.current.srcObject.id : "none"), E = a === "webcam" ? `webcam:${x}` : a;
575
- d.current !== E && (h.current = !1, d.current = E);
587
+ const v = (d == null ? void 0 : d.id) ?? (((P = i.current) == null ? void 0 : P.srcObject) instanceof MediaStream ? i.current.srcObject.id : "none"), k = u === "webcam" ? `webcam:${v}` : u;
588
+ h.current !== k && (s.current = !1, h.current = k);
576
589
  let C = !1;
577
590
  return (async () => {
578
591
  try {
579
- if (y("initializing"), h.current || (await c.setFrameSource({
580
- canvas: b.current,
581
- sourceKind: a
582
- }), await c.start(), h.current = !0), C) return;
583
- R(null), y("initializing");
584
- } catch (z) {
592
+ w("initializing");
593
+ const F = !s.current;
594
+ if (F && await f.setFrameSource({
595
+ canvas: p.current,
596
+ sourceKind: u
597
+ }), await f._setRenderSize(
598
+ Math.round(r.destination.width),
599
+ Math.round(r.destination.height)
600
+ ), F && (await f.start(), s.current = !0), C) return;
601
+ R(null), w("initializing");
602
+ } catch (F) {
585
603
  if (C) return;
586
- y("error"), R(z instanceof Error ? z.message : "Failed to initialize SDK face tracking");
604
+ w("error"), R(F instanceof Error ? F.message : "Failed to initialize SDK face tracking");
587
605
  }
588
606
  })(), () => {
589
607
  C = !0;
590
608
  };
591
- }, [e, r, a, c, s, l]), M(() => {
592
- !v && e && !p && y("initializing");
593
- }, [v, e, p]), M(() => {
594
- p && (y("error"), R(p.message));
595
- }, [p]), M(() => () => {
596
- h.current = !1, c.stop();
597
- }, [c]), {
609
+ }, [e, r, u, f, d, i]), A(() => {
610
+ !x && e && !l && w("initializing");
611
+ }, [x, e, l]), A(() => {
612
+ l && (w("error"), R(l.message));
613
+ }, [l]), A(() => () => {
614
+ s.current = !1, f.stop();
615
+ }, [f]), {
598
616
  activeDelegate: "GPU",
599
- faces: I,
617
+ faces: E,
600
618
  status: m,
601
- error: F
619
+ error: S
602
620
  };
603
- }, ke = (e, t) => e === "auto" ? t === "webcam" ? "cover" : "contain" : e, Ae = ({
621
+ }, He = (e, t) => e === "auto" ? t === "webcam" ? "cover" : "contain" : e, qe = ({
604
622
  imageOptions: e,
605
623
  initialImageId: t,
606
- initialSource: n,
624
+ initialSource: a,
607
625
  initialVideoId: r,
608
- source: o,
609
- videoOptions: i
626
+ source: n,
627
+ videoOptions: c
610
628
  }) => {
611
- var l, c, d, h;
612
- const a = (o == null ? void 0 : o.kind) ?? n ?? "webcam";
629
+ var i, f, h, s;
630
+ const u = (n == null ? void 0 : n.kind) ?? a ?? "webcam";
613
631
  return {
614
- selectedSource: a === "image" && e.length === 0 || a === "video" && i.length === 0 ? "webcam" : a,
615
- selectedImageId: (o == null ? void 0 : o.kind) === "image" ? o.assetId ?? ((l = e[0]) == null ? void 0 : l.id) ?? "" : t ?? ((c = e[0]) == null ? void 0 : c.id) ?? "",
616
- selectedVideoId: (o == null ? void 0 : o.kind) === "video" ? o.assetId ?? ((d = i[0]) == null ? void 0 : d.id) ?? "" : r ?? ((h = i[0]) == null ? void 0 : h.id) ?? ""
632
+ selectedSource: u === "image" && e.length === 0 || u === "video" && c.length === 0 ? "webcam" : u,
633
+ selectedImageId: (n == null ? void 0 : n.kind) === "image" ? n.assetId ?? ((i = e[0]) == null ? void 0 : i.id) ?? "" : t ?? ((f = e[0]) == null ? void 0 : f.id) ?? "",
634
+ selectedVideoId: (n == null ? void 0 : n.kind) === "video" ? n.assetId ?? ((h = c[0]) == null ? void 0 : h.id) ?? "" : r ?? ((s = c[0]) == null ? void 0 : s.id) ?? ""
617
635
  };
618
- }, Le = (e, t, n) => {
636
+ }, Ge = (e, t, a) => {
619
637
  if (e.width <= 0 || e.height <= 0 || t.width <= 0 || t.height <= 0)
620
638
  return null;
621
- const r = n === "contain" ? Math.min(t.width / e.width, t.height / e.height) : Math.max(t.width / e.width, t.height / e.height), o = e.width * r, i = e.height * r;
622
- return {
623
- source: e,
624
- destination: t,
625
- drawWidth: o,
626
- drawHeight: i,
627
- offsetX: (t.width - o) * 0.5,
628
- offsetY: (t.height - i) * 0.5,
629
- scale: r
630
- };
631
- }, Ve = (e) => {
639
+ const r = he(e, t, a);
640
+ return r ? { source: e, destination: t, ...r } : null;
641
+ }, Ue = (e) => {
632
642
  if (!e) return { width: 0, height: 0 };
633
643
  const t = e.getBoundingClientRect();
634
644
  return {
635
645
  width: t.width || e.clientWidth,
636
646
  height: t.height || e.clientHeight
637
647
  };
638
- }, De = (e) => {
639
- const [t, n] = S({ width: 0, height: 0 });
640
- return ue(() => {
648
+ }, je = (e) => {
649
+ const [t, a] = M({ width: 0, height: 0 });
650
+ return Re(() => {
641
651
  const r = e.current;
642
652
  if (!r) return;
643
- let o = 0;
644
- const i = () => {
645
- const c = Ve(r);
646
- n(
647
- (d) => d.width === c.width && d.height === c.height ? d : c
653
+ let n = 0;
654
+ const c = () => {
655
+ const f = Ue(r);
656
+ a(
657
+ (h) => h.width === f.width && h.height === f.height ? h : f
648
658
  );
649
- }, a = () => {
650
- i(), o && cancelAnimationFrame(o), o = requestAnimationFrame(i);
659
+ }, u = () => {
660
+ c(), n && cancelAnimationFrame(n), n = requestAnimationFrame(c);
651
661
  };
652
- a();
653
- const s = new ResizeObserver(a);
654
- s.observe(r);
655
- const l = window.visualViewport;
656
- return window.addEventListener("resize", a), window.addEventListener("orientationchange", a), l == null || l.addEventListener("resize", a), l == null || l.addEventListener("scroll", a), () => {
657
- o && cancelAnimationFrame(o), s.disconnect(), window.removeEventListener("resize", a), window.removeEventListener("orientationchange", a), l == null || l.removeEventListener("resize", a), l == null || l.removeEventListener("scroll", a);
662
+ u();
663
+ const d = new ResizeObserver(u);
664
+ d.observe(r);
665
+ const i = window.visualViewport;
666
+ return window.addEventListener("resize", u), window.addEventListener("orientationchange", u), i == null || i.addEventListener("resize", u), i == null || i.addEventListener("scroll", u), () => {
667
+ n && cancelAnimationFrame(n), d.disconnect(), window.removeEventListener("resize", u), window.removeEventListener("orientationchange", u), i == null || i.removeEventListener("resize", u), i == null || i.removeEventListener("scroll", u);
658
668
  };
659
669
  }, [e]), t;
660
- }, Be = ({
670
+ }, Ke = ({
661
671
  enabled: e,
662
672
  selectedSource: t
663
673
  }) => {
664
- const n = ce(O.FACE_TRACKER);
674
+ const a = ve(D.FACE_TRACKER);
665
675
  return {
666
- faces: ee({ node: n, enabled: e, selectedSource: t }),
667
- trackerStatus: n ? "ready" : "idle"
676
+ faces: oe({ node: a, enabled: e, selectedSource: t }),
677
+ trackerStatus: a ? "ready" : "idle"
668
678
  };
669
- }, J = (e) => {
679
+ }, re = (e) => {
670
680
  e && (e.pause(), e.removeAttribute("src"), e.srcObject = null, e.load());
671
- }, Q = (e) => {
681
+ }, ae = (e) => {
672
682
  e && e.removeAttribute("src");
673
- }, We = ({
683
+ }, Qe = ({
674
684
  enabled: e,
675
685
  imageAsset: t,
676
- selectedSource: n,
686
+ selectedSource: a,
677
687
  videoAsset: r
678
688
  }) => {
679
- const o = X(null), i = X(null), [a, s] = S(null), [l, c] = S({ width: 0, height: 0 }), [d, h] = S("idle"), [b, f] = S(null);
680
- return M(() => {
689
+ const n = _(null), c = _(null), [u, d] = M(null), [i, f] = M({ width: 0, height: 0 }), [h, s] = M("idle"), [p, g] = M(null);
690
+ return A(() => {
681
691
  if (!e) {
682
- J(o.current), Q(i.current), s(null), c({ width: 0, height: 0 }), h("idle"), f(null);
692
+ re(n.current), ae(c.current), d(null), f({ width: 0, height: 0 }), s("idle"), g(null);
683
693
  return;
684
694
  }
685
- let w = !1, p = null;
686
- const m = (x, u) => {
687
- w || (c({ width: x, height: u }), h("ready"), f(null));
688
- }, y = () => {
689
- J(o.current), Q(i.current), p == null || p.getTracks().forEach((x) => x.stop()), p = null, s(null);
690
- }, F = async () => {
691
- h("requesting");
692
- const x = await navigator.mediaDevices.getUserMedia(ve);
693
- if (w) {
694
- x.getTracks().forEach((E) => E.stop());
695
+ let o = !1, l = null;
696
+ const m = (v, y) => {
697
+ o || (f({ width: v, height: y }), s("ready"), g(null));
698
+ }, w = () => {
699
+ re(n.current), ae(c.current), l == null || l.getTracks().forEach((v) => v.stop()), l = null, d(null);
700
+ }, S = async () => {
701
+ s("requesting");
702
+ const v = await navigator.mediaDevices.getUserMedia(Le);
703
+ if (o) {
704
+ v.getTracks().forEach((k) => k.stop());
695
705
  return;
696
706
  }
697
- p = x, s(x);
698
- const u = o.current;
699
- u && (u.srcObject = x, u.muted = !0, u.playsInline = !0, u.autoplay = !0, await u.play(), m(u.videoWidth, u.videoHeight));
700
- }, R = async (x) => {
701
- h("requesting"), s(null);
702
- const u = o.current;
703
- u && (u.src = x, u.muted = !0, u.loop = !0, u.playsInline = !0, u.autoplay = !0, u.crossOrigin = "anonymous", await u.play(), m(u.videoWidth, u.videoHeight));
704
- }, v = async (x) => {
705
- h("requesting"), s(null);
706
- const u = i.current;
707
- u && (await new Promise((E, C) => {
708
- u.onload = () => E(), u.onerror = () => C(new Error("Unable to load image")), u.src = x;
709
- }), m(u.naturalWidth, u.naturalHeight));
707
+ l = v, d(v);
708
+ const y = n.current;
709
+ y && (y.srcObject = v, y.muted = !0, y.playsInline = !0, y.autoplay = !0, await y.play(), m(y.videoWidth, y.videoHeight));
710
+ }, R = async (v) => {
711
+ s("requesting"), d(null);
712
+ const y = n.current;
713
+ y && (y.src = v, y.muted = !0, y.loop = !0, y.playsInline = !0, y.autoplay = !0, y.crossOrigin = "anonymous", await y.play(), m(y.videoWidth, y.videoHeight));
714
+ }, x = async (v) => {
715
+ s("requesting"), d(null);
716
+ const y = c.current;
717
+ y && (await new Promise((k, C) => {
718
+ y.onload = () => k(), y.onerror = () => C(new Error("Unable to load image")), y.src = v;
719
+ }), m(y.naturalWidth, y.naturalHeight));
710
720
  };
711
- return y(), (async () => {
721
+ return w(), (async () => {
712
722
  try {
713
- if (n === "webcam") {
714
- await F();
723
+ if (a === "webcam") {
724
+ await S();
715
725
  return;
716
726
  }
717
- if (n === "video") {
727
+ if (a === "video") {
718
728
  if (!(r != null && r.src)) throw new Error("Missing video source");
719
729
  await R(r.src);
720
730
  return;
721
731
  }
722
732
  if (!(t != null && t.src)) throw new Error("Missing image source");
723
- await v(t.src);
724
- } catch (x) {
725
- if (w) return;
726
- h("error"), f(x instanceof Error ? x.message : `Unable to initialize ${n}`);
733
+ await x(t.src);
734
+ } catch (v) {
735
+ if (o) return;
736
+ s("error"), g(v instanceof Error ? v.message : `Unable to initialize ${a}`);
727
737
  }
728
738
  })(), () => {
729
- w = !0, y();
739
+ o = !0, w();
730
740
  };
731
- }, [e, t, n, r]), {
732
- videoRef: o,
733
- imageRef: i,
734
- stream: a,
735
- mediaSize: l,
736
- status: d,
737
- error: b
741
+ }, [e, t, a, r]), {
742
+ videoRef: n,
743
+ imageRef: c,
744
+ stream: u,
745
+ mediaSize: i,
746
+ status: h,
747
+ error: p
738
748
  };
739
- }, _e = ({
749
+ }, Ye = ({
740
750
  enabled: e,
741
751
  imageRef: t,
742
- selectedSource: n,
752
+ selectedSource: a,
743
753
  status: r,
744
- videoRef: o
754
+ videoRef: n
745
755
  }) => {
746
- const [i, a] = S(null);
747
- return M(() => {
756
+ const [c, u] = M(null);
757
+ return A(() => {
748
758
  if (!e || r !== "ready") {
749
- a((c) => (c == null || c.dispose(), null));
759
+ u((f) => (f == null || f.dispose(), null));
750
760
  return;
751
761
  }
752
- const s = n === "image" ? t.current : o.current;
753
- if (!s) return;
754
- const l = n === "image" ? new L.Texture(s) : new L.VideoTexture(s);
755
- return l.colorSpace = L.SRGBColorSpace, l.minFilter = L.LinearFilter, l.magFilter = L.LinearFilter, l.generateMipmaps = !1, l.needsUpdate = !0, a((c) => (c == null || c.dispose(), l)), () => {
756
- l.dispose();
762
+ const d = a === "image" ? t.current : n.current;
763
+ if (!d) return;
764
+ const i = a === "image" ? new z.Texture(d) : new z.VideoTexture(d);
765
+ return i.colorSpace = z.SRGBColorSpace, i.minFilter = z.LinearFilter, i.magFilter = z.LinearFilter, i.generateMipmaps = !1, i.needsUpdate = !0, u((f) => (f == null || f.dispose(), i)), () => {
766
+ i.dispose();
757
767
  };
758
- }, [e, t, n, r, o]), i;
759
- }, He = ({
768
+ }, [e, t, a, r, n]), c;
769
+ }, Je = ({
760
770
  externalTracker: e,
761
771
  imageOptions: t,
762
- layout: n,
772
+ layout: a,
763
773
  managesOwnMedia: r,
764
- mediaError: o,
765
- mediaFitMode: i,
766
- mediaSize: a,
767
- mediaStatus: s,
768
- mirrored: l,
769
- selectedImage: c,
770
- selectedImageId: d,
771
- selectedSource: h,
772
- selectedVideo: b,
773
- selectedVideoId: f,
774
- setMirrored: w,
775
- setSelectedImageId: p,
774
+ mediaError: n,
775
+ mediaFitMode: c,
776
+ mediaSize: u,
777
+ mediaStatus: d,
778
+ mirrored: i,
779
+ selectedImage: f,
780
+ selectedImageId: h,
781
+ selectedSource: s,
782
+ selectedVideo: p,
783
+ selectedVideoId: g,
784
+ setMirrored: o,
785
+ setSelectedImageId: l,
776
786
  setSelectedSource: m,
777
- setSelectedVideoId: y,
778
- setShowMediaControls: F,
787
+ setSelectedVideoId: w,
788
+ setShowMediaControls: S,
779
789
  showMediaControls: R,
780
- tracker: v,
781
- videoOptions: I,
782
- viewportSize: x
790
+ tracker: x,
791
+ videoOptions: E,
792
+ viewportSize: v
783
793
  }) => {
784
- const u = h === "image" ? `${A.image.label}: ${(c == null ? void 0 : c.label) ?? ""}` : h === "video" ? `${A.video.label}: ${(b == null ? void 0 : b.label) ?? ""}` : A.webcam.label;
794
+ const y = s === "image" ? `${O.image.label}: ${(f == null ? void 0 : f.label) ?? ""}` : s === "video" ? `${O.video.label}: ${(p == null ? void 0 : p.label) ?? ""}` : O.webcam.label;
785
795
  return {
786
- activeDelegate: r ? v.activeDelegate : null,
787
- faces: r ? v.faces : e.faces,
796
+ activeDelegate: r ? x.activeDelegate : null,
797
+ faces: r ? x.faces : e.faces,
788
798
  imageOptions: t,
789
- layout: n,
790
- mediaError: o,
791
- mediaFitMode: i,
792
- mediaLabel: u,
793
- mediaStatus: s,
794
- mirrored: l,
795
- selectedImageId: d,
796
- selectedSource: h,
797
- selectedVideoId: f,
798
- setMirrored: w,
799
- setSelectedImageId: p,
799
+ layout: a,
800
+ mediaError: n,
801
+ mediaFitMode: c,
802
+ mediaLabel: y,
803
+ mediaStatus: d,
804
+ mirrored: i,
805
+ selectedImageId: h,
806
+ selectedSource: s,
807
+ selectedVideoId: g,
808
+ setMirrored: o,
809
+ setSelectedImageId: l,
800
810
  setSelectedSource: m,
801
- setSelectedVideoId: y,
802
- setShowMediaControls: F,
811
+ setSelectedVideoId: w,
812
+ setShowMediaControls: S,
803
813
  showMediaControls: R,
804
- trackerError: r ? v.error : null,
805
- trackerStatus: r ? v.status : e.trackerStatus,
806
- videoOptions: I,
807
- viewportSize: x,
808
- mediaSize: a
814
+ trackerError: r ? x.error : null,
815
+ trackerStatus: r ? x.status : e.trackerStatus,
816
+ videoOptions: E,
817
+ viewportSize: v,
818
+ mediaSize: u
809
819
  };
810
- }, Pe = ({
820
+ }, Ze = ({
811
821
  mediaTexture: e,
812
822
  previewMode: t,
813
- renderOutputs: n,
823
+ renderOutputs: a,
814
824
  sceneRenderOutputs: r
815
- }) => $(
825
+ }) => G(
816
826
  () => ({
817
- requested: n,
827
+ requested: a,
818
828
  previewMode: t,
819
829
  mediaColorTexture: e,
820
830
  sceneColorTexture: r.sceneColorTexture,
821
- finalColorTexture: n.finalColor ? r.sceneColorTexture : null,
831
+ finalColorTexture: a.finalColor ? r.sceneColorTexture : null,
822
832
  sceneDepthTexture: r.sceneDepthTexture,
823
833
  estimatedDepthTexture: null,
824
834
  available: {
825
835
  mediaColor: e !== null,
826
836
  sceneColor: r.sceneColorTexture !== null,
827
- finalColor: !!(n.finalColor && r.sceneColorTexture),
837
+ finalColor: !!(a.finalColor && r.sceneColorTexture),
828
838
  sceneDepth: r.sceneDepthTexture !== null,
829
839
  estimatedDepth: !1
830
840
  }
831
841
  }),
832
- [e, t, n, r]
833
- ), $e = ({
842
+ [e, t, a, r]
843
+ ), et = ({
834
844
  fitMode: e,
835
845
  imageOptions: t,
836
- initialImageId: n,
846
+ initialImageId: a,
837
847
  initialMirrored: r,
838
- initialSource: o,
839
- initialVideoId: i,
840
- mediaStrategy: a,
841
- previewMode: s,
842
- renderOutputs: l,
843
- showMediaControlsByDefault: c,
844
- source: d,
845
- videoOptions: h
848
+ initialSource: n,
849
+ initialVideoId: c,
850
+ mediaStrategy: u,
851
+ previewMode: d,
852
+ renderOutputs: i,
853
+ showMediaControlsByDefault: f,
854
+ source: h,
855
+ videoOptions: s
846
856
  }) => {
847
- const b = X(null), f = X(null), w = De(b), p = $(
848
- () => Ae({
857
+ const p = _(null), g = _(null), o = je(p), l = G(
858
+ () => qe({
849
859
  imageOptions: t,
850
- initialImageId: n,
851
- initialSource: o,
852
- initialVideoId: i,
853
- source: d,
854
- videoOptions: h
860
+ initialImageId: a,
861
+ initialSource: n,
862
+ initialVideoId: c,
863
+ source: h,
864
+ videoOptions: s
855
865
  }),
856
- [t, n, o, i, d, h]
857
- ), [m, y] = S(r), [F, R] = S(c), [v, I] = S(
858
- p.selectedSource
859
- ), [x, u] = S(p.selectedImageId), [E, C] = S(p.selectedVideoId), [j, V] = S({
866
+ [t, a, n, c, h, s]
867
+ ), [m, w] = M(r), [S, R] = M(f), [x, E] = M(
868
+ l.selectedSource
869
+ ), [v, y] = M(l.selectedImageId), [k, C] = M(l.selectedVideoId), [Y, P] = M({
860
870
  sceneColorTexture: null,
861
871
  sceneDepthTexture: null
862
- }), z = a === "internal";
863
- M(() => {
864
- d && (I(p.selectedSource), u(p.selectedImageId), C(p.selectedVideoId));
865
- }, [p, d]);
866
- const K = t.find((P) => P.id === x) ?? t[0], G = h.find((P) => P.id === E) ?? h[0], T = We({
867
- enabled: z,
868
- imageAsset: K,
869
- selectedSource: v,
870
- videoAsset: G
871
- }), _ = ke(e, v), D = $(
872
- () => Le(T.mediaSize, w, _),
873
- [T.mediaSize, _, w]
874
- ), re = _e({
875
- enabled: !!(l.mediaColor || l.finalColor),
872
+ }), F = u === "internal";
873
+ A(() => {
874
+ h && (E(l.selectedSource), y(l.selectedImageId), C(l.selectedVideoId));
875
+ }, [l, h]);
876
+ const J = t.find((q) => q.id === v) ?? t[0], Z = s.find((q) => q.id === k) ?? s[0], T = Qe({
877
+ enabled: F,
878
+ imageAsset: J,
879
+ selectedSource: x,
880
+ videoAsset: Z
881
+ }), W = He(e, x), V = G(
882
+ () => Ge(T.mediaSize, o, W),
883
+ [T.mediaSize, W, o]
884
+ ), de = Ye({
885
+ enabled: !!(i.mediaColor || i.finalColor),
876
886
  imageRef: T.imageRef,
877
- selectedSource: v,
887
+ selectedSource: x,
878
888
  status: T.status,
879
889
  videoRef: T.videoRef
880
- }), H = Me(v, m), ne = Xe({
890
+ }), H = Be(x, m), ue = We({
881
891
  displayMirrored: H,
882
- enabled: z && T.status === "ready" && D !== null,
892
+ enabled: F && T.status === "ready" && V !== null,
883
893
  imageRef: T.imageRef,
884
- layout: D,
885
- selectedSource: v,
894
+ layout: V,
895
+ selectedSource: x,
886
896
  sourceStream: T.stream,
887
897
  videoRef: T.videoRef
888
- }), oe = Be({
889
- enabled: !z,
890
- selectedSource: v
891
- }), ie = He({
892
- externalTracker: oe,
898
+ }), me = Ke({
899
+ enabled: !F,
900
+ selectedSource: x
901
+ }), fe = Je({
902
+ externalTracker: me,
893
903
  imageOptions: t,
894
- layout: D,
895
- managesOwnMedia: z,
904
+ layout: V,
905
+ managesOwnMedia: F,
896
906
  mediaError: T.error,
897
- mediaFitMode: _,
907
+ mediaFitMode: W,
898
908
  mediaSize: T.mediaSize,
899
909
  mediaStatus: T.status,
900
910
  mirrored: H,
901
- selectedImage: K,
902
- selectedImageId: x,
903
- selectedSource: v,
904
- selectedVideo: G,
905
- selectedVideoId: E,
906
- setMirrored: y,
907
- setSelectedImageId: u,
908
- setSelectedSource: I,
911
+ selectedImage: J,
912
+ selectedImageId: v,
913
+ selectedSource: x,
914
+ selectedVideo: Z,
915
+ selectedVideoId: k,
916
+ setMirrored: w,
917
+ setSelectedImageId: y,
918
+ setSelectedSource: E,
909
919
  setSelectedVideoId: C,
910
920
  setShowMediaControls: R,
911
- showMediaControls: F,
912
- tracker: ne,
913
- videoOptions: h,
914
- viewportSize: w
915
- }), ae = Pe({
916
- mediaTexture: re,
917
- previewMode: s,
918
- renderOutputs: l,
919
- sceneRenderOutputs: j
921
+ showMediaControls: S,
922
+ tracker: ue,
923
+ videoOptions: s,
924
+ viewportSize: o
925
+ }), pe = Ze({
926
+ mediaTexture: de,
927
+ previewMode: d,
928
+ renderOutputs: i,
929
+ sceneRenderOutputs: Y
920
930
  });
921
931
  return {
922
- containerRef: b,
923
- displayCanvasRef: f,
932
+ containerRef: p,
933
+ displayCanvasRef: g,
924
934
  displayMirrored: H,
925
- layout: D,
926
- managesOwnMedia: z,
935
+ layout: V,
936
+ managesOwnMedia: F,
927
937
  media: T,
928
- renderOutputState: ae,
929
- renderState: ie,
930
- selectedImageId: x,
931
- selectedSource: v,
932
- selectedVideoId: E,
933
- setSceneRenderOutputs: V,
934
- setSelectedImageId: u,
935
- setSelectedSource: I,
938
+ renderOutputState: pe,
939
+ renderState: fe,
940
+ selectedImageId: v,
941
+ selectedSource: x,
942
+ selectedVideoId: k,
943
+ setSceneRenderOutputs: P,
944
+ setSelectedImageId: y,
945
+ setSelectedSource: E,
936
946
  setSelectedVideoId: C,
937
- showMediaControls: F,
938
- viewportSize: w
947
+ showMediaControls: S,
948
+ viewportSize: o
939
949
  };
940
- }, U = ({ children: e }) => /* @__PURE__ */ g(W, { children: e });
941
- U.displayName = "XRViewport.Scene";
942
- const N = ({ children: e }) => /* @__PURE__ */ g(W, { children: e });
943
- N.displayName = "XRViewport.Overlay";
944
- const qe = (e, t) => {
950
+ }, K = ({ children: e }) => /* @__PURE__ */ b(N, { children: e });
951
+ K.displayName = "XRViewport.Scene";
952
+ const Q = ({ children: e }) => /* @__PURE__ */ b(N, { children: e });
953
+ Q.displayName = "XRViewport.Overlay";
954
+ const tt = (e, t) => {
945
955
  if (e === "dom")
946
956
  return {
947
957
  sceneContent: null,
948
958
  overlayContent: t
949
959
  };
950
- let n = null, r = null;
951
- const o = [];
952
- return he.forEach(t, (i) => {
953
- var s;
954
- if (!me(i)) {
955
- i != null && o.push(i);
960
+ let a = null, r = null;
961
+ const n = [];
962
+ return Ce.forEach(t, (c) => {
963
+ var d;
964
+ if (!Ee(c)) {
965
+ c != null && n.push(c);
956
966
  return;
957
967
  }
958
- const a = (s = i.type) == null ? void 0 : s.displayName;
959
- if (a === U.displayName) {
960
- n = i.props.children;
968
+ const u = (d = c.type) == null ? void 0 : d.displayName;
969
+ if (u === K.displayName) {
970
+ a = c.props.children;
961
971
  return;
962
972
  }
963
- if (a === N.displayName) {
964
- r = i.props.children;
973
+ if (u === Q.displayName) {
974
+ r = c.props.children;
965
975
  return;
966
976
  }
967
- o.push(i);
968
- }), !r && o.length > 0 && (r = o), {
969
- sceneContent: n,
977
+ n.push(c);
978
+ }), !r && n.length > 0 && (r = n), {
979
+ sceneContent: a,
970
980
  overlayContent: r
971
981
  };
972
- }, Z = (e, t) => typeof e == "function" ? e(t) : e;
973
- function Ue(e) {
974
- return e.Scene = U, e.Overlay = N, e;
982
+ }, ne = (e, t) => typeof e == "function" ? e(t) : e;
983
+ function rt(e) {
984
+ return e.Scene = K, e.Overlay = Q, e;
975
985
  }
976
- const rt = Ue(({
986
+ const vt = rt(({
977
987
  children: e,
978
988
  fitMode: t = "auto",
979
- imageOptions: n = [],
989
+ imageOptions: a = [],
980
990
  initialImageId: r,
981
- initialMirrored: o = !0,
982
- initialSource: i = "webcam",
983
- initialVideoId: a,
984
- mediaStrategy: s = "internal",
985
- mediaDock: l = "bottom-left",
986
- mode: c = "dom",
987
- previewMode: d = "finalColor",
988
- renderOutputs: h = {},
989
- showMediaControlsByDefault: b = !0,
990
- source: f,
991
- style: w,
992
- videoOptions: p = []
991
+ initialMirrored: n = !0,
992
+ initialSource: c = "webcam",
993
+ initialVideoId: u,
994
+ mediaStrategy: d = "internal",
995
+ mediaDock: i = "bottom-left",
996
+ mode: f = "dom",
997
+ previewMode: h = "finalColor",
998
+ renderOutputs: s = {},
999
+ showMediaControlsByDefault: p = !0,
1000
+ source: g,
1001
+ style: o,
1002
+ videoOptions: l = []
993
1003
  }) => {
994
- const m = $e({
1004
+ const m = et({
995
1005
  fitMode: t,
996
- imageOptions: n,
1006
+ imageOptions: a,
997
1007
  initialImageId: r,
998
- initialMirrored: o,
999
- initialSource: i,
1000
- initialVideoId: a,
1001
- mediaStrategy: s,
1002
- previewMode: d,
1003
- renderOutputs: h,
1004
- showMediaControlsByDefault: b,
1005
- source: f,
1006
- videoOptions: p
1007
- }), y = typeof e == "function" ? e(m.renderState) : e, { sceneContent: F, overlayContent: R } = qe(c, y), v = Z(
1008
- F,
1008
+ initialMirrored: n,
1009
+ initialSource: c,
1010
+ initialVideoId: u,
1011
+ mediaStrategy: d,
1012
+ previewMode: h,
1013
+ renderOutputs: s,
1014
+ showMediaControlsByDefault: p,
1015
+ source: g,
1016
+ videoOptions: l
1017
+ }), w = typeof e == "function" ? e(m.renderState) : e, { sceneContent: S, overlayContent: R } = tt(f, w), x = ne(
1018
+ S,
1009
1019
  m.renderState
1010
- ), I = Z(
1020
+ ), E = ne(
1011
1021
  R,
1012
1022
  m.renderState
1013
1023
  );
1014
- return /* @__PURE__ */ g(be.Provider, { value: m.renderState, children: /* @__PURE__ */ g(we.Provider, { value: m.renderOutputState, children: /* @__PURE__ */ g(
1015
- Ee,
1024
+ return /* @__PURE__ */ b(Ie.Provider, { value: m.renderState, children: /* @__PURE__ */ b(Fe.Provider, { value: m.renderOutputState, children: /* @__PURE__ */ b(
1025
+ Pe,
1016
1026
  {
1017
1027
  containerRef: m.containerRef,
1018
1028
  displayCanvasRef: m.displayCanvasRef,
1019
- imageOptions: n,
1029
+ imageOptions: a,
1020
1030
  imageRef: m.media.imageRef,
1021
1031
  layout: m.layout,
1022
1032
  managesOwnMedia: m.managesOwnMedia,
1023
- mediaDock: l,
1033
+ mediaDock: i,
1024
1034
  mirrored: m.displayMirrored,
1025
- mode: c,
1026
- overlayContent: I,
1027
- renderOutputs: h,
1028
- sceneContent: v,
1035
+ mode: f,
1036
+ overlayContent: E,
1037
+ renderOutputs: s,
1038
+ sceneContent: x,
1029
1039
  selectedImageId: m.selectedImageId,
1030
1040
  selectedSource: m.selectedSource,
1031
1041
  selectedVideoId: m.selectedVideoId,
@@ -1034,13 +1044,13 @@ const rt = Ue(({
1034
1044
  setSelectedSource: m.setSelectedSource,
1035
1045
  setSelectedVideoId: m.setSelectedVideoId,
1036
1046
  showMediaControls: m.showMediaControls,
1037
- style: w,
1038
- videoOptions: p,
1047
+ style: o,
1048
+ videoOptions: l,
1039
1049
  videoRef: m.media.videoRef,
1040
1050
  viewportSize: m.viewportSize
1041
1051
  }
1042
1052
  ) }) });
1043
- }), Ne = {
1053
+ }), at = {
1044
1054
  position: "absolute",
1045
1055
  top: -28,
1046
1056
  left: 0,
@@ -1051,13 +1061,13 @@ const rt = Ue(({
1051
1061
  fontWeight: 700,
1052
1062
  padding: "4px 8px",
1053
1063
  whiteSpace: "nowrap"
1054
- }, nt = ({
1064
+ }, xt = ({
1055
1065
  boundingBox: e,
1056
1066
  label: t = "face bounding box",
1057
- color: n = "#22c55e",
1067
+ color: a = "#22c55e",
1058
1068
  style: r,
1059
- labelStyle: o
1060
- }) => /* @__PURE__ */ g(
1069
+ labelStyle: n
1070
+ }) => /* @__PURE__ */ b(
1061
1071
  "div",
1062
1072
  {
1063
1073
  style: {
@@ -1066,43 +1076,416 @@ const rt = Ue(({
1066
1076
  top: `${e.top * 100}%`,
1067
1077
  width: `${e.width * 100}%`,
1068
1078
  height: `${e.height * 100}%`,
1069
- border: `3px solid ${n}`,
1079
+ border: `3px solid ${a}`,
1070
1080
  boxSizing: "border-box",
1071
1081
  pointerEvents: "none",
1072
1082
  zIndex: 20,
1073
1083
  ...r
1074
1084
  },
1075
- children: t !== null && /* @__PURE__ */ g("div", { style: { ...Ne, ...o }, children: t })
1085
+ children: t !== null && /* @__PURE__ */ b("div", { style: { ...at, ...n }, children: t })
1086
+ }
1087
+ ), j = [
1088
+ {
1089
+ id: "capabilities",
1090
+ title: "Capability report",
1091
+ steps: "Run detectXRCapabilities with model probes.",
1092
+ expect: "Rendering supported (WebGL, OffscreenCanvas, WebAssembly); camera not unsupported; model assets reachable.",
1093
+ mode: "automated",
1094
+ layer: "capability"
1095
+ },
1096
+ {
1097
+ id: "session-start",
1098
+ title: "Session binds and starts",
1099
+ steps: "setMediaSource (webcam or the supplied stream) and start().",
1100
+ expect: "Lifecycle reaches running within the timeout; feed frames advance.",
1101
+ mode: "automated",
1102
+ layer: "lifecycle"
1103
+ },
1104
+ {
1105
+ id: "model-ready",
1106
+ title: "Tracker models initialize",
1107
+ steps: "Acquire each requested model and wait for ready.",
1108
+ expect: "Every model reaches ready; none errors.",
1109
+ mode: "automated",
1110
+ layer: "model"
1111
+ },
1112
+ {
1113
+ id: "model-detects",
1114
+ title: "Trackers run inference",
1115
+ steps: "Sample diagnostics while running.",
1116
+ expect: "Each ready model reports inferences > 0 (detection itself needs a subject in frame).",
1117
+ mode: "automated",
1118
+ layer: "model"
1119
+ },
1120
+ {
1121
+ id: "pause-resume",
1122
+ title: "Pause and resume",
1123
+ steps: "session.pause(), then resume().",
1124
+ expect: "Lifecycle paused then running; feed resumes.",
1125
+ mode: "automated",
1126
+ layer: "lifecycle"
1127
+ },
1128
+ {
1129
+ id: "stop-start",
1130
+ title: "Stop and rebind",
1131
+ steps: "session.stop(), then setMediaSource + start() again.",
1132
+ expect: "Lifecycle stopped then running on the same source.",
1133
+ mode: "automated",
1134
+ layer: "lifecycle"
1135
+ },
1136
+ {
1137
+ id: "performance",
1138
+ title: "Performance sample",
1139
+ steps: "Measure frame rate and tracker inference over the window.",
1140
+ expect: "Frame rate ≥ 20 fps and total inference ≤ 50 ms while running.",
1141
+ mode: "automated",
1142
+ layer: "performance"
1143
+ }
1144
+ ], nt = [
1145
+ {
1146
+ id: "permission-prompt",
1147
+ title: "First-visit permission prompt",
1148
+ steps: "Open the app in a fresh profile; tap Allow on the prompt.",
1149
+ expect: "Camera starts; no second prompt on reload.",
1150
+ mode: "manual",
1151
+ layer: "capability"
1152
+ },
1153
+ {
1154
+ id: "permission-blocked",
1155
+ title: "Blocked camera recovers",
1156
+ steps: "Block the camera in site settings, reload, then allow it from the address bar.",
1157
+ expect: "Gate shows blocked with instructions; allowing flips it without a reload.",
1158
+ mode: "manual",
1159
+ layer: "capability"
1160
+ },
1161
+ {
1162
+ id: "rear-camera",
1163
+ title: "Rear camera",
1164
+ steps: "Switch front → rear on /camera-switching.",
1165
+ expect: "Rear feed is straight (text readable); tracking stays aligned.",
1166
+ mode: "manual",
1167
+ layer: "lifecycle"
1168
+ },
1169
+ {
1170
+ id: "orientation",
1171
+ title: "Rotate the device",
1172
+ steps: "Rotate portrait ↔ landscape while tracking a face.",
1173
+ expect: "Anchored content stays on the face; no stretched feed.",
1174
+ mode: "manual",
1175
+ layer: "lifecycle"
1176
+ },
1177
+ {
1178
+ id: "background-foreground",
1179
+ title: "Background and return",
1180
+ steps: "Switch apps / lock the screen for 10 s and come back.",
1181
+ expect: "Feed resumes by itself; no frozen frame; trackers continue.",
1182
+ mode: "manual",
1183
+ layer: "lifecycle"
1184
+ },
1185
+ {
1186
+ id: "camera-interrupted",
1187
+ title: "Camera taken by another app",
1188
+ steps: "Take a call or open the native camera, then return.",
1189
+ expect: "Session reports camera-lost and recovers on retry.",
1190
+ mode: "manual",
1191
+ layer: "lifecycle"
1192
+ },
1193
+ {
1194
+ id: "thermal",
1195
+ title: "Sustained use",
1196
+ steps: "Run face + body tracking for 5 minutes.",
1197
+ expect: "Adaptive quality steps down before the frame rate collapses; no crash.",
1198
+ mode: "manual",
1199
+ layer: "performance"
1200
+ },
1201
+ {
1202
+ id: "low-end",
1203
+ title: "Low-end device",
1204
+ steps: "Run the automated set on the slowest supported device.",
1205
+ expect: "All pass; performance may land on the low tier.",
1206
+ mode: "manual",
1207
+ layer: "performance"
1208
+ }
1209
+ ], Rt = (e) => j.find((t) => t.id === e) ?? nt.find((t) => t.id === e), I = (e, t) => {
1210
+ const a = e.match(t);
1211
+ return a ? a[1] : "";
1212
+ }, st = (e) => {
1213
+ const t = /iPhone|iPad|iPod/.test(e) || /Macintosh/.test(e) && /Mobile/.test(e), a = /Android/.test(e);
1214
+ let r = { name: "unknown", version: "" };
1215
+ /Edg\//.test(e) ? r = { name: "Edge", version: I(e, /Edg\/(\d+)/) } : /OPR\//.test(e) ? r = { name: "Opera", version: I(e, /OPR\/(\d+)/) } : /SamsungBrowser\//.test(e) ? r = { name: "Samsung Internet", version: I(e, /SamsungBrowser\/(\d+)/) } : /CriOS\//.test(e) ? r = { name: "Chrome iOS", version: I(e, /CriOS\/(\d+)/) } : /FxiOS\//.test(e) ? r = { name: "Firefox iOS", version: I(e, /FxiOS\/(\d+)/) } : /Firefox\//.test(e) ? r = { name: "Firefox", version: I(e, /Firefox\/(\d+)/) } : /Chrome\//.test(e) ? r = { name: "Chrome", version: I(e, /Chrome\/(\d+)/) } : /Safari\//.test(e) && (r = { name: "Safari", version: I(e, /Version\/(\d+)/) });
1216
+ let n = { name: "unknown", version: "" };
1217
+ return t ? n = { name: "iOS", version: I(e, /OS (\d+[._]\d+)/).replace("_", ".") } : a ? n = { name: "Android", version: I(e, /Android (\d+(?:\.\d+)?)/) } : /Mac OS X/.test(e) ? n = { name: "macOS", version: I(e, /Mac OS X (\d+[._]\d+)/).replace("_", ".") } : /Windows NT/.test(e) ? n = { name: "Windows", version: I(e, /Windows NT (\d+\.\d+)/) } : /Linux/.test(e) && (n = { name: "Linux", version: "" }), { browser: r, os: n, mobile: t || a || /Mobile/.test(e) };
1218
+ }, it = () => {
1219
+ var r, n;
1220
+ const e = typeof navigator < "u" ? navigator : void 0, t = (e == null ? void 0 : e.userAgent) ?? "", a = st(t);
1221
+ return {
1222
+ userAgent: t,
1223
+ platform: (e == null ? void 0 : e.platform) ?? "",
1224
+ ...a,
1225
+ screen: typeof window < "u" ? {
1226
+ width: ((r = window.screen) == null ? void 0 : r.width) ?? 0,
1227
+ height: ((n = window.screen) == null ? void 0 : n.height) ?? 0,
1228
+ dpr: window.devicePixelRatio || 1
1229
+ } : { width: 0, height: 0, dpr: 1 },
1230
+ deviceMemoryGb: typeof (e == null ? void 0 : e.deviceMemory) == "number" ? e.deviceMemory : null,
1231
+ hardwareConcurrency: typeof (e == null ? void 0 : e.hardwareConcurrency) == "number" ? e.hardwareConcurrency : null,
1232
+ secureContext: typeof window < "u" ? !!window.isSecureContext : !1,
1233
+ videoCaptureStream: typeof HTMLVideoElement < "u" && ("captureStream" in HTMLVideoElement.prototype || "mozCaptureStream" in HTMLVideoElement.prototype),
1234
+ touch: typeof navigator < "u" && (navigator.maxTouchPoints ?? 0) > 0
1235
+ };
1236
+ }, ot = [D.FACE_TRACKER, D.HAND_TRACKER, D.BODY_TRACKER], se = "__xr_compat__", ce = (e) => new Promise((t) => setTimeout(t, e)), L = async (e, t, a = 50) => {
1237
+ const r = Date.now() + t;
1238
+ for (; Date.now() < r; ) {
1239
+ if (e()) return !0;
1240
+ await ce(a);
1241
+ }
1242
+ return e();
1243
+ }, lt = (e, t) => e ? /^(camera-|no-camera|webgl-|offscreen-canvas-|wasm-)/.test(e) ? "capability" : /^model-/.test(e) ? "model" : /^(lifecycle|timeout:lifecycle|feed-stalled|start-)/.test(e) ? "lifecycle" : /^(fps|inference|frame)/.test(e) ? "performance" : t : t, ct = (e) => {
1244
+ const t = {
1245
+ pass: 0,
1246
+ fail: 0,
1247
+ skip: 0,
1248
+ causes: { capability: 0, model: 0, lifecycle: 0, performance: 0, unknown: 0 }
1249
+ };
1250
+ for (const a of e)
1251
+ t[a.status] += 1, a.status === "fail" && (t.causes[a.cause ?? "unknown"] += 1);
1252
+ return t;
1253
+ }, dt = (e, t, a = {}) => ({
1254
+ version: 1,
1255
+ sdkVersion: a.sdkVersion ?? "dev",
1256
+ checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
1257
+ label: a.label ?? "",
1258
+ environment: it(),
1259
+ capabilities: t,
1260
+ results: e,
1261
+ summary: ct(e)
1262
+ }), Ct = async (e, t = {}) => {
1263
+ var h;
1264
+ const a = t.timeoutMs ?? 2e4, r = t.models ?? ot, n = new Set(
1265
+ t.scenarios ?? j.map((s) => s.id)
1266
+ ), c = [];
1267
+ let u = null, d = !1;
1268
+ const i = (s, p, g, o) => {
1269
+ var m;
1270
+ const l = {
1271
+ id: s,
1272
+ status: o.status,
1273
+ cause: o.status === "fail" ? lt(o.code ?? null, p) : null,
1274
+ // Codes describe failures; a pass carries none.
1275
+ code: o.status === "fail" ? o.code ?? null : null,
1276
+ detail: o.detail,
1277
+ durationMs: Math.round(performance.now() - g)
1278
+ };
1279
+ c.push(l), (m = t.onResult) == null || m.call(t, l);
1280
+ }, f = async () => {
1281
+ t.stream ? await e.setMediaSource({
1282
+ source: ee.STREAM,
1283
+ stream: t.stream,
1284
+ sourceKind: "video"
1285
+ }) : await e.setMediaSource({ source: ee.WEBCAM }), await e.start();
1286
+ };
1287
+ try {
1288
+ for (const s of j) {
1289
+ if (!n.has(s.id)) continue;
1290
+ const p = performance.now();
1291
+ try {
1292
+ const g = s.id;
1293
+ switch (g) {
1294
+ case "capabilities": {
1295
+ u = await ye({
1296
+ models: r,
1297
+ timeoutMs: Math.min(a, 8e3)
1298
+ });
1299
+ const o = r.map((m) => we(u, m)).filter((m) => !m.supported && m.reason).map((m) => m.reason.code), l = Array.from(new Set(o));
1300
+ i(s.id, s.layer, p, {
1301
+ status: l.length ? "fail" : "pass",
1302
+ code: l[0] ?? null,
1303
+ detail: l.length ? `blocked: ${l.join(", ")}` : `webgl${u.rendering.webglVersion}, camera ${u.camera.status}`
1304
+ });
1305
+ break;
1306
+ }
1307
+ case "session-start": {
1308
+ await f();
1309
+ const o = await L(
1310
+ () => e.store.getSnapshot().lifecycle === "running",
1311
+ a
1312
+ ), l = e.store.getSnapshot().feedFrames, m = o && await L(() => e.store.getSnapshot().feedFrames > l, a);
1313
+ d = o && m;
1314
+ const w = e.store.getSnapshot().error;
1315
+ i(s.id, s.layer, p, {
1316
+ status: d ? "pass" : "fail",
1317
+ code: w ? w.reason : o ? "feed-stalled" : "timeout:lifecycle",
1318
+ detail: d ? `running on ${e.store.getSnapshot().sourceKind}` : w ? w.message : o ? "running but no feed frames advanced" : `lifecycle ${e.store.getSnapshot().lifecycle}`
1319
+ });
1320
+ break;
1321
+ }
1322
+ case "model-ready": {
1323
+ if (!d) {
1324
+ i(s.id, s.layer, p, {
1325
+ status: "skip",
1326
+ detail: "session did not start"
1327
+ });
1328
+ break;
1329
+ }
1330
+ const o = [];
1331
+ await Promise.all(
1332
+ r.map(async (l) => {
1333
+ try {
1334
+ await e.registry.acquire(l, se), await L(
1335
+ () => e.store.getSnapshot().pipeline.has(l),
1336
+ a
1337
+ ) || o.push(`${l}: timeout`);
1338
+ } catch (m) {
1339
+ o.push(`${l}: ${ge(m).code}`);
1340
+ }
1341
+ })
1342
+ ), i(s.id, s.layer, p, {
1343
+ status: o.length ? "fail" : "pass",
1344
+ code: o.length ? o[0].split(": ")[1] === "timeout" ? "model-init-failed" : o[0].split(": ")[1] : null,
1345
+ detail: o.length ? o.join("; ") : `${r.length} models ready`
1346
+ });
1347
+ break;
1348
+ }
1349
+ case "model-detects": {
1350
+ if (!d) {
1351
+ i(s.id, s.layer, p, {
1352
+ status: "skip",
1353
+ detail: "session did not start"
1354
+ });
1355
+ break;
1356
+ }
1357
+ const o = await L(
1358
+ () => $(e, r, null).models.every((R) => R.state !== "ready" || R.inferences > 0),
1359
+ Math.min(a, 8e3)
1360
+ ), l = $(e, r, null), m = l.models.filter((S) => S.state === "ready" && S.inferences === 0).map((S) => S.label), w = l.models.filter((S) => S.state === "error").map((S) => {
1361
+ var R;
1362
+ return `${S.label}: ${((R = S.error) == null ? void 0 : R.message) ?? "error"}`;
1363
+ });
1364
+ i(s.id, s.layer, p, {
1365
+ status: o && !w.length ? "pass" : "fail",
1366
+ code: w.length ? "model-init-failed" : m.length ? "model-idle" : null,
1367
+ detail: w.length ? w.join("; ") : m.length ? `no inference from ${m.join(", ")}` : l.models.map((S) => `${S.label} ${S.inferences} run · ${S.detections ?? "–"} det`).join(", ")
1368
+ });
1369
+ break;
1370
+ }
1371
+ case "pause-resume": {
1372
+ if (!d) {
1373
+ i(s.id, s.layer, p, {
1374
+ status: "skip",
1375
+ detail: "session did not start"
1376
+ });
1377
+ break;
1378
+ }
1379
+ e.pause();
1380
+ const o = e.store.getSnapshot().lifecycle === "paused";
1381
+ await e.resume();
1382
+ const l = await L(
1383
+ () => e.store.getSnapshot().lifecycle === "running",
1384
+ a
1385
+ ), m = e.store.getSnapshot().feedFrames, w = l && await L(() => e.store.getSnapshot().feedFrames > m, a);
1386
+ i(s.id, s.layer, p, {
1387
+ status: o && l && w ? "pass" : "fail",
1388
+ code: o ? l ? "feed-stalled" : "lifecycle:resume" : "lifecycle:pause",
1389
+ detail: o && l && w ? "paused → running, feed advanced" : `paused=${o} resumed=${l} advanced=${w}`
1390
+ });
1391
+ break;
1392
+ }
1393
+ case "stop-start": {
1394
+ if (!d) {
1395
+ i(s.id, s.layer, p, {
1396
+ status: "skip",
1397
+ detail: "session did not start"
1398
+ });
1399
+ break;
1400
+ }
1401
+ await e.stop();
1402
+ const o = e.store.getSnapshot().lifecycle === "stopped";
1403
+ await f();
1404
+ const l = await L(
1405
+ () => e.store.getSnapshot().lifecycle === "running",
1406
+ a
1407
+ );
1408
+ i(s.id, s.layer, p, {
1409
+ status: o && l ? "pass" : "fail",
1410
+ code: o ? "lifecycle:restart" : "lifecycle:stop",
1411
+ detail: o && l ? "stopped → running" : `stopped=${o} running=${l}`
1412
+ });
1413
+ break;
1414
+ }
1415
+ case "performance": {
1416
+ if (!d) {
1417
+ i(s.id, s.layer, p, {
1418
+ status: "skip",
1419
+ detail: "session did not start"
1420
+ });
1421
+ break;
1422
+ }
1423
+ const o = t.performanceWindowMs ?? 3e3;
1424
+ let l = 0, m = 0;
1425
+ const w = () => {
1426
+ l += 1, m = requestAnimationFrame(w);
1427
+ };
1428
+ m = requestAnimationFrame(w);
1429
+ const S = $(e, r, null);
1430
+ await ce(o), cancelAnimationFrame(m);
1431
+ const R = $(e, r, {
1432
+ feedFrames: S.session.feedFrames,
1433
+ sampledAt: S.sampledAt
1434
+ }), x = l * 1e3 / o, E = R.inferenceMsTotal, v = x >= 20 && E <= 50;
1435
+ i(s.id, s.layer, p, {
1436
+ status: v ? "pass" : "fail",
1437
+ code: x < 20 ? "fps-low" : E > 50 ? "inference-high" : null,
1438
+ detail: `${x.toFixed(0)} fps · feed ${R.session.feedFps.toFixed(0)} fps · inference ${E.toFixed(1)} ms`
1439
+ });
1440
+ break;
1441
+ }
1442
+ default:
1443
+ i(g, s.layer, p, { status: "skip", detail: "no runner" });
1444
+ }
1445
+ } catch (g) {
1446
+ const o = g instanceof Error ? g.message : String(g), l = (h = e.store.getSnapshot().error) == null ? void 0 : h.reason;
1447
+ i(s.id, s.layer, p, {
1448
+ status: "fail",
1449
+ code: l ? be(l).code : null,
1450
+ detail: l ? `${o} (${l})` : o
1451
+ });
1452
+ }
1453
+ }
1454
+ } finally {
1455
+ for (const s of r) e.registry.release(s, se);
1456
+ t.keepSessionRunning || await e.stop().catch(() => {
1457
+ });
1076
1458
  }
1077
- ), ot = (e) => {
1078
- const [t, n] = S(null);
1079
- return M(() => {
1459
+ return dt(c, u, t);
1460
+ }, Et = (e) => {
1461
+ const [t, a] = M(null);
1462
+ return A(() => {
1080
1463
  let r = 0;
1081
- const o = () => {
1082
- var l, c;
1083
- r = requestAnimationFrame(o);
1084
- const i = (c = (l = e == null ? void 0 : e.detectionResults) == null ? void 0 : l.faceLandmarks) == null ? void 0 : c[0];
1085
- if (!i || i.length === 0) {
1086
- n(null);
1464
+ const n = () => {
1465
+ var i, f;
1466
+ r = requestAnimationFrame(n);
1467
+ const c = (f = (i = e == null ? void 0 : e.detectionResults) == null ? void 0 : i.faceLandmarks) == null ? void 0 : f[0];
1468
+ if (!c || c.length === 0) {
1469
+ a(null);
1087
1470
  return;
1088
1471
  }
1089
- const a = fe(i), s = {
1090
- left: a.minX,
1091
- top: a.minY,
1092
- width: a.width,
1093
- height: a.height
1472
+ const u = Me(c), d = {
1473
+ left: u.minX,
1474
+ top: u.minY,
1475
+ width: u.width,
1476
+ height: u.height
1094
1477
  };
1095
- n((d) => d && d.left === s.left && d.top === s.top && d.width === s.width && d.height === s.height ? d : s);
1478
+ a((h) => h && h.left === d.left && h.top === d.top && h.width === d.width && h.height === d.height ? h : d);
1096
1479
  };
1097
- return o(), () => {
1480
+ return n(), () => {
1098
1481
  cancelAnimationFrame(r);
1099
1482
  };
1100
1483
  }, [e]), t;
1101
- }, it = ({
1484
+ }, Mt = ({
1102
1485
  background: e = "#000",
1103
1486
  children: t,
1104
- style: n
1105
- }) => /* @__PURE__ */ g(
1487
+ style: a
1488
+ }) => /* @__PURE__ */ b(
1106
1489
  "div",
1107
1490
  {
1108
1491
  style: {
@@ -1110,68 +1493,150 @@ const rt = Ue(({
1110
1493
  inset: 0,
1111
1494
  overflow: "hidden",
1112
1495
  background: e,
1113
- ...n
1496
+ ...a
1114
1497
  },
1115
1498
  children: t
1116
1499
  }
1117
- ), at = (e) => {
1118
- const { makeDefault: t = !0, ...n } = e;
1119
- return /* @__PURE__ */ g(
1120
- pe,
1500
+ ), kt = (e) => {
1501
+ const { makeDefault: t = !0, ...a } = e;
1502
+ return /* @__PURE__ */ b(
1503
+ ke,
1121
1504
  {
1122
1505
  position: [0, 0, 40],
1123
1506
  fov: 30,
1124
1507
  near: 0.1,
1125
1508
  far: 1e3,
1126
1509
  makeDefault: t,
1127
- ...n
1510
+ ...a
1128
1511
  }
1129
1512
  );
1130
- }, st = ["fill", "contain"];
1513
+ }, Tt = ["fill", "contain"];
1131
1514
  export {
1132
- zt as BasicAnimatedTextureController,
1133
- nt as BoundingBoxOverlay,
1134
- dt as HeadTracker,
1135
- Xt as MAX_GIF_BYTES,
1136
- kt as MAX_GIF_FRAMES,
1137
- At as MAX_GIF_PIXELS,
1138
- at as PerspectiveCamera,
1139
- Ct as ScreenRectAspectContext,
1140
- st as TEXTURE_FITS,
1141
- Lt as TextureSourceLoadError,
1142
- it as XRCompositor,
1515
+ Hr as BasicAnimatedTextureController,
1516
+ xt as BoundingBoxOverlay,
1517
+ j as COMPAT_SCENARIOS,
1518
+ At as EMPTY_QUALITY_SIGNALS,
1519
+ ua as FACE_REGION_POLYGONS,
1520
+ kr as HAND_JOINTS,
1521
+ Jt as HeadTracker,
1522
+ ma as IRIS_FULL_OPENNESS,
1523
+ fa as IrisLead,
1524
+ nt as MANUAL_COMPAT_SCENARIOS,
1525
+ qr as MAX_GIF_BYTES,
1526
+ Gr as MAX_GIF_FRAMES,
1527
+ Ur as MAX_GIF_PIXELS,
1528
+ pa as MAX_OVERLAY_LABELS,
1529
+ Tr as OscillationTracker,
1530
+ Ir as POSE_JOINTS,
1531
+ kt as PerspectiveCamera,
1532
+ ha as SEGMENTATION_OVERLAY_FRAGMENT_SHADER,
1533
+ ga as SEGMENTATION_OVERLAY_VERTEX_SHADER,
1534
+ vr as ScreenRectAspectContext,
1535
+ Tt as TEXTURE_FITS,
1536
+ jr as TextureSourceLoadError,
1537
+ Mt as XRCompositor,
1143
1538
  B as XRLayer,
1144
- xe as XRMediaSurface,
1145
- tt as XRTrackingOverlay,
1146
- rt as XRViewport,
1147
- fe as computeLandmarkBounds,
1148
- Vt as computeScreenTransform,
1149
- xt as createFaceInfoTarget,
1150
- Dt as createTextureSourceResolver,
1151
- Bt as disposeResolvedTextureSource,
1152
- vt as getFaceInfo,
1153
- Wt as getPlaybackFrame,
1154
- _t as getSequenceFrame,
1155
- St as getThreeBlending,
1156
- Rt as getThreeDepthFunction,
1157
- It as getThreeSide,
1158
- Ht as gifTextureSourceProvider,
1159
- Ft as hasFullUnitUVBounds,
1160
- Me as resolveCalibrationFaceDisplayMirrored,
1161
- Pt as resolveTextureSource,
1162
- $t as throwIfAborted,
1163
- Xe as useCalibrationFaceTracker,
1164
- ot as useFaceBoundingBox,
1165
- Et as useScreenSpace,
1166
- ut as useTrackerContext,
1167
- mt as useXRCameraTexture,
1168
- se as useXRContext,
1169
- ft as useXRError,
1170
- le as useXRModel,
1171
- ce as useXRModelNode,
1172
- pt as useXRPipelineSnapshot,
1173
- gt as useXRReady,
1174
- bt as useXRRenderSize,
1175
- qt as useXRViewportRenderOutputs,
1176
- Ut as useXRViewportState
1539
+ Ae as XRMediaSurface,
1540
+ St as XRTrackingOverlay,
1541
+ vt as XRViewport,
1542
+ Lt as XR_MODEL_LABELS,
1543
+ _t as classifyCameraFailure,
1544
+ lt as classifyCompatCause,
1545
+ ya as computeIrisEye,
1546
+ Me as computeLandmarkBounds,
1547
+ wa as computeMaskUvTransform,
1548
+ Kr as computeScreenTransform,
1549
+ dt as createCompatReport,
1550
+ wr as createFaceInfoTarget,
1551
+ ia as createGestureDetectorState,
1552
+ ba as createIrisEye,
1553
+ Sa as createIrisResult,
1554
+ Xt as createQualityState,
1555
+ va as createSegmentationOverlayMaterial,
1556
+ xa as createSemanticMaskTexture,
1557
+ Qr as createTextureSourceResolver,
1558
+ it as describeCompatEnvironment,
1559
+ Yr as disposeResolvedTextureSource,
1560
+ Ot as fillLandmarkPolygon,
1561
+ zt as fillPolygon,
1562
+ Rt as findCompatScenario,
1563
+ Fr as fingerExtensions,
1564
+ oa as gestureStatesEqual,
1565
+ br as getFaceInfo,
1566
+ Jr as getPlaybackFrame,
1567
+ Zr as getSequenceFrame,
1568
+ xr as getThreeBlending,
1569
+ Rr as getThreeDepthFunction,
1570
+ Cr as getThreeSide,
1571
+ ea as gifTextureSourceProvider,
1572
+ Nr as hasFullUnitUVBounds,
1573
+ Dt as judgeSample,
1574
+ Pt as lockQuality,
1575
+ Vt as mapDomExceptionToReason,
1576
+ ge as mapModelErrorToReason,
1577
+ Ar as measureArmRaise,
1578
+ Lr as measureFingerPattern,
1579
+ _r as measureGrab,
1580
+ Xr as measureHandHeight,
1581
+ Or as measureOpenPalm,
1582
+ zr as measurePinch,
1583
+ Dr as measureTPose,
1584
+ Pr as measureThumb,
1585
+ st as parseUserAgent,
1586
+ $t as permissionStateToStatus,
1587
+ Ra as rasterizeFaceRegions,
1588
+ Bt as readDeviceSignals,
1589
+ Nt as resetQuality,
1590
+ Ca as resolveActiveOverlayLabelIndices,
1591
+ Be as resolveCalibrationFaceDisplayMirrored,
1592
+ Wt as resolveInitialTierIndex,
1593
+ Ea as resolveMaskSize,
1594
+ Ma as resolveOverlayLabelIndices,
1595
+ Ht as resolvePerformanceBudget,
1596
+ qt as resolveQualityTier,
1597
+ ta as resolveTextureSource,
1598
+ Ct as runCompatChecks,
1599
+ $ as sampleXRDiagnostics,
1600
+ Gt as semanticMaskLabelIndex,
1601
+ be as sessionReasonToFallback,
1602
+ Ut as setQualityTier,
1603
+ la as snapshotGestureState,
1604
+ ca as stepGestureDetector,
1605
+ jt as stepQualityController,
1606
+ ct as summarizeCompatResults,
1607
+ ra as throwIfAborted,
1608
+ Vr as thumbDirection,
1609
+ $r as thumbExtension,
1610
+ Kt as tierToApply,
1611
+ ka as updateIrisResult,
1612
+ Ta as updateSegmentationOverlayMaterial,
1613
+ Ia as uploadSemanticMask,
1614
+ We as useCalibrationFaceTracker,
1615
+ Et as useFaceBoundingBox,
1616
+ Er as useScreenSpace,
1617
+ Fa as useSegmentationOverlayMaterial,
1618
+ Aa as useSemanticMaskTexture,
1619
+ Zt as useTrackerContext,
1620
+ tr as useXRCameraDeviceId,
1621
+ rr as useXRCameraFacing,
1622
+ ar as useXRCameraTexture,
1623
+ ie as useXRContext,
1624
+ Qt as useXRDiagnostics,
1625
+ nr as useXRError,
1626
+ sr as useXRFeedCrop,
1627
+ ir as useXRLifecycle,
1628
+ or as useXRMirrored,
1629
+ Se as useXRModel,
1630
+ lr as useXRModelErrors,
1631
+ ve as useXRModelNode,
1632
+ cr as useXROrientation,
1633
+ dr as useXRPipelineSnapshot,
1634
+ ur as useXRQualityConfig,
1635
+ mr as useXRQualityState,
1636
+ fr as useXRReady,
1637
+ pr as useXRRenderSize,
1638
+ hr as useXRSessionCameraPermission,
1639
+ gr as useXRTrackerStatus,
1640
+ aa as useXRViewportRenderOutputs,
1641
+ na as useXRViewportState
1177
1642
  };