react-native-webrtc-kaleidoscope 1.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1081) hide show
  1. package/NOTICE.md +20 -9
  2. package/README.md +197 -47
  3. package/android/build.gradle +16 -4
  4. package/android/src/main/assets/selfie_segmenter.tflite +0 -0
  5. package/android/src/main/java/com/simiancraft/kaleidoscope/CompositeLayers.kt +127 -0
  6. package/android/src/main/java/com/simiancraft/kaleidoscope/EffectTuning.kt +71 -40
  7. package/android/src/main/java/com/simiancraft/kaleidoscope/KaleidoscopeModule.kt +86 -25
  8. package/android/src/main/java/com/simiancraft/kaleidoscope/Registration.kt +26 -28
  9. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/CompositeFactory.kt +691 -0
  10. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/LayerShaders.kt +30 -0
  11. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/TransformFactory.kt +325 -0
  12. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Egl.kt +82 -70
  13. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Fbo.kt +50 -47
  14. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/FramePipeline.kt +159 -0
  15. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlDebug.kt +23 -23
  16. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlProgram.kt +77 -53
  17. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Ingest.kt +144 -0
  18. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Orientation.kt +58 -0
  19. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Shaders.kt +58 -67
  20. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/ShadersGenerated.kt +1172 -23
  21. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/Mask.kt +277 -254
  22. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/MaskTuning.kt +28 -25
  23. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/SegmentationEngine.kt +154 -0
  24. package/android/src/test/java/com/simiancraft/kaleidoscope/CompositeLayersTest.kt +165 -0
  25. package/app.plugin.js +9 -255
  26. package/catalog/composites/clouds/clouds.controls.tsx +19 -0
  27. package/catalog/composites/clouds/clouds.ts +32 -0
  28. package/catalog/composites/corporate-blobs/corporate-blobs.controls.tsx +24 -0
  29. package/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  30. package/catalog/composites/corporate-blobs/corporate-blobs.ts +51 -0
  31. package/catalog/composites/corporate-blobs/corporate-blobs.web.ts +42 -0
  32. package/catalog/composites/fairy-cave/fairy-cave.controls.tsx +33 -0
  33. package/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  34. package/catalog/composites/fairy-cave/fairy-cave.ts +53 -0
  35. package/catalog/composites/fairy-cave/fairy-cave.web.ts +47 -0
  36. package/catalog/composites/fairy-grotto/fairy-grotto.controls.tsx +34 -0
  37. package/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  38. package/catalog/composites/fairy-grotto/fairy-grotto.ts +54 -0
  39. package/catalog/composites/fairy-grotto/fairy-grotto.web.ts +47 -0
  40. package/catalog/composites/fairy-hollow/fairy-hollow.controls.tsx +34 -0
  41. package/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  42. package/catalog/composites/fairy-hollow/fairy-hollow.ts +55 -0
  43. package/catalog/composites/fairy-hollow/fairy-hollow.web.ts +47 -0
  44. package/catalog/composites/nebula/nebula.controls.tsx +19 -0
  45. package/catalog/composites/nebula/nebula.thumb.webp +0 -0
  46. package/catalog/composites/nebula/nebula.ts +37 -0
  47. package/catalog/composites/nebula/nebula.web.ts +30 -0
  48. package/catalog/composites/observation-deck/observation-deck.controls.tsx +28 -0
  49. package/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  50. package/catalog/composites/observation-deck/observation-deck.ts +59 -0
  51. package/catalog/composites/observation-deck/observation-deck.web.ts +50 -0
  52. package/catalog/composites/simianlights/simianlights.controls.tsx +19 -0
  53. package/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  54. package/catalog/composites/simianlights/simianlights.ts +34 -0
  55. package/catalog/composites/simianlights/simianlights.web.ts +29 -0
  56. package/catalog/composites/underwater/underwater.controls.tsx +19 -0
  57. package/catalog/composites/underwater/underwater.thumb.webp +0 -0
  58. package/catalog/composites/underwater/underwater.ts +42 -0
  59. package/catalog/composites/underwater/underwater.web.ts +36 -0
  60. package/catalog/composites/wizard-tower/wizard-tower.controls.tsx +23 -0
  61. package/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  62. package/catalog/composites/wizard-tower/wizard-tower.ts +44 -0
  63. package/catalog/composites/wizard-tower/wizard-tower.web.ts +35 -0
  64. package/catalog/composites/wizard-tower-night/wizard-tower-night.controls.tsx +22 -0
  65. package/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  66. package/catalog/composites/wizard-tower-night/wizard-tower-night.ts +43 -0
  67. package/catalog/composites/wizard-tower-night/wizard-tower-night.web.ts +35 -0
  68. package/catalog/images/README.md +188 -0
  69. package/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  70. package/catalog/images/corporate/corporate-logo.ts +6 -0
  71. package/catalog/images/corporate/corporate-logo.web.ts +7 -0
  72. package/catalog/images/corporate/corporate-logo.webp +0 -0
  73. package/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  74. package/catalog/images/debug/debug-resolutions.ts +6 -0
  75. package/catalog/images/debug/debug-resolutions.web.ts +7 -0
  76. package/catalog/images/debug/debug-resolutions.webp +0 -0
  77. package/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  78. package/catalog/images/fairy-caves/grotto.ts +6 -0
  79. package/catalog/images/fairy-caves/grotto.web.ts +7 -0
  80. package/catalog/images/fairy-caves/grotto.webp +0 -0
  81. package/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  82. package/catalog/images/fairy-caves/hollow.ts +6 -0
  83. package/catalog/images/fairy-caves/hollow.web.ts +7 -0
  84. package/catalog/images/fairy-caves/hollow.webp +0 -0
  85. package/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  86. package/catalog/images/fairy-caves/treehouse-2.ts +6 -0
  87. package/catalog/images/fairy-caves/treehouse-2.web.ts +7 -0
  88. package/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  89. package/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  90. package/catalog/images/fairy-caves/treehouse-3.ts +6 -0
  91. package/catalog/images/fairy-caves/treehouse-3.web.ts +7 -0
  92. package/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  93. package/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  94. package/catalog/images/fairy-caves/treehouse.ts +6 -0
  95. package/catalog/images/fairy-caves/treehouse.web.ts +7 -0
  96. package/catalog/images/fairy-caves/treehouse.webp +0 -0
  97. package/catalog/images/home/home-dark.thumb.webp +0 -0
  98. package/catalog/images/home/home-dark.ts +6 -0
  99. package/catalog/images/home/home-dark.web.ts +7 -0
  100. package/catalog/images/home/home-dark.webp +0 -0
  101. package/catalog/images/home/home-light.thumb.webp +0 -0
  102. package/catalog/images/home/home-light.ts +6 -0
  103. package/catalog/images/home/home-light.web.ts +7 -0
  104. package/catalog/images/home/home-light.webp +0 -0
  105. package/catalog/images/image-ids.ts +42 -0
  106. package/catalog/images/image.types.ts +5 -0
  107. package/catalog/images/index.ts +7 -0
  108. package/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  109. package/catalog/images/nature/landscape-dark.ts +6 -0
  110. package/catalog/images/nature/landscape-dark.web.ts +7 -0
  111. package/catalog/images/nature/landscape-dark.webp +0 -0
  112. package/catalog/images/nature/landscape-light.thumb.webp +0 -0
  113. package/catalog/images/nature/landscape-light.ts +6 -0
  114. package/catalog/images/nature/landscape-light.web.ts +7 -0
  115. package/catalog/images/nature/landscape-light.webp +0 -0
  116. package/catalog/images/office/office-dark.thumb.webp +0 -0
  117. package/catalog/images/office/office-dark.ts +6 -0
  118. package/catalog/images/office/office-dark.web.ts +7 -0
  119. package/catalog/images/office/office-dark.webp +0 -0
  120. package/catalog/images/office/office-light.thumb.webp +0 -0
  121. package/catalog/images/office/office-light.ts +6 -0
  122. package/catalog/images/office/office-light.web.ts +7 -0
  123. package/catalog/images/office/office-light.webp +0 -0
  124. package/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  125. package/catalog/images/sci-fi/sci-fi-light.ts +6 -0
  126. package/catalog/images/sci-fi/sci-fi-light.web.ts +7 -0
  127. package/catalog/images/sci-fi/sci-fi-light.webp +0 -0
  128. package/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  129. package/catalog/images/simiancraft/simiancraft-dark-transparency.ts +6 -0
  130. package/catalog/images/simiancraft/simiancraft-dark-transparency.web.ts +9 -0
  131. package/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  132. package/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  133. package/catalog/images/simiancraft/simiancraft-dark.ts +6 -0
  134. package/catalog/images/simiancraft/simiancraft-dark.web.ts +7 -0
  135. package/catalog/images/simiancraft/simiancraft-dark.webp +0 -0
  136. package/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  137. package/catalog/images/simiancraft/simiancraft-light-transparency.ts +6 -0
  138. package/catalog/images/simiancraft/simiancraft-light-transparency.web.ts +9 -0
  139. package/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  140. package/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  141. package/catalog/images/simiancraft/simiancraft-light.ts +6 -0
  142. package/catalog/images/simiancraft/simiancraft-light.web.ts +7 -0
  143. package/catalog/images/simiancraft/simiancraft-light.webp +0 -0
  144. package/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  145. package/catalog/images/spaceship/observation-deck.ts +6 -0
  146. package/catalog/images/spaceship/observation-deck.web.ts +7 -0
  147. package/catalog/images/spaceship/observation-deck.webp +0 -0
  148. package/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  149. package/catalog/images/underwater/oceanscape-dark.ts +6 -0
  150. package/catalog/images/underwater/oceanscape-dark.web.ts +7 -0
  151. package/catalog/images/underwater/oceanscape-dark.webp +0 -0
  152. package/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  153. package/catalog/images/wizard-tower/wizard-tower-1.ts +6 -0
  154. package/catalog/images/wizard-tower/wizard-tower-1.web.ts +7 -0
  155. package/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  156. package/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  157. package/catalog/images/wizard-tower/wizard-tower-2.ts +6 -0
  158. package/catalog/images/wizard-tower/wizard-tower-2.web.ts +7 -0
  159. package/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  160. package/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  161. package/catalog/images/wizard-tower/wizard-tower-night.ts +6 -0
  162. package/catalog/images/wizard-tower/wizard-tower-night.web.ts +7 -0
  163. package/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  164. package/catalog/shaders/README.md +114 -0
  165. package/catalog/shaders/_shared/composite-blit.frag +26 -0
  166. package/catalog/shaders/_shared/composite-camera.frag +17 -0
  167. package/catalog/shaders/_shared/composite-image.frag +23 -0
  168. package/catalog/shaders/_shared/composite-masked.frag +26 -0
  169. package/catalog/shaders/_shared/composite-subject.frag +27 -0
  170. package/catalog/shaders/_shared/passthrough.vert +27 -0
  171. package/catalog/shaders/_shared/transform.frag +27 -0
  172. package/catalog/shaders/_shared/types.ts +63 -0
  173. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.tsx +37 -0
  174. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.frag +123 -0
  175. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.ts +106 -0
  176. package/catalog/shaders/blur/blur.form.tsx +29 -0
  177. package/catalog/shaders/blur/blur.ts +32 -0
  178. package/catalog/shaders/blur/composite-blur.frag +42 -0
  179. package/catalog/shaders/clouds/clouds.form.tsx +39 -0
  180. package/catalog/shaders/clouds/clouds.frag +128 -0
  181. package/catalog/shaders/clouds/clouds.presets.md +37 -0
  182. package/catalog/shaders/clouds/clouds.ts +124 -0
  183. package/catalog/shaders/corporate-blobs/corporate-blobs.form.tsx +44 -0
  184. package/catalog/shaders/corporate-blobs/corporate-blobs.frag +224 -0
  185. package/catalog/shaders/corporate-blobs/corporate-blobs.ts +136 -0
  186. package/catalog/shaders/fireflies/fireflies.form.tsx +33 -0
  187. package/catalog/shaders/fireflies/fireflies.frag +68 -0
  188. package/catalog/shaders/fireflies/fireflies.ts +61 -0
  189. package/catalog/shaders/godrays/godrays.form.tsx +37 -0
  190. package/catalog/shaders/godrays/godrays.frag +85 -0
  191. package/catalog/shaders/godrays/godrays.ts +105 -0
  192. package/catalog/shaders/index.ts +78 -0
  193. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.tsx +55 -0
  194. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.frag +262 -0
  195. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.ts +137 -0
  196. package/catalog/shaders/nebula/nebula.form.tsx +34 -0
  197. package/catalog/shaders/nebula/nebula.frag +151 -0
  198. package/catalog/shaders/nebula/nebula.ts +74 -0
  199. package/catalog/shaders/plasma/plasma.form.tsx +32 -0
  200. package/catalog/shaders/plasma/plasma.frag +55 -0
  201. package/catalog/shaders/plasma/plasma.ts +44 -0
  202. package/catalog/shaders/simianlights/simianlights.form.tsx +34 -0
  203. package/catalog/shaders/simianlights/simianlights.frag +151 -0
  204. package/catalog/shaders/simianlights/simianlights.ts +73 -0
  205. package/dist/catalog/composites/clouds/clouds.controls.d.ts +3 -0
  206. package/dist/catalog/composites/clouds/clouds.controls.d.ts.map +1 -0
  207. package/dist/catalog/composites/clouds/clouds.controls.js +11 -0
  208. package/dist/catalog/composites/clouds/clouds.controls.js.map +1 -0
  209. package/dist/catalog/composites/clouds/clouds.d.ts +26 -0
  210. package/dist/catalog/composites/clouds/clouds.d.ts.map +1 -0
  211. package/dist/catalog/composites/clouds/clouds.js +33 -0
  212. package/dist/catalog/composites/clouds/clouds.js.map +1 -0
  213. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts +3 -0
  214. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts.map +1 -0
  215. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js +13 -0
  216. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js.map +1 -0
  217. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts +37 -0
  218. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  219. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js +52 -0
  220. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js.map +1 -0
  221. package/dist/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  222. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts +37 -0
  223. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts.map +1 -0
  224. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js +46 -0
  225. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js.map +1 -0
  226. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts +3 -0
  227. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts.map +1 -0
  228. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js +13 -0
  229. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js.map +1 -0
  230. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts +42 -0
  231. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts.map +1 -0
  232. package/dist/catalog/composites/fairy-cave/fairy-cave.js +54 -0
  233. package/dist/catalog/composites/fairy-cave/fairy-cave.js.map +1 -0
  234. package/dist/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  235. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts +42 -0
  236. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts.map +1 -0
  237. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js +51 -0
  238. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js.map +1 -0
  239. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts +3 -0
  240. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts.map +1 -0
  241. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js +14 -0
  242. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js.map +1 -0
  243. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts +42 -0
  244. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts.map +1 -0
  245. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js +55 -0
  246. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js.map +1 -0
  247. package/dist/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  248. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts +42 -0
  249. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts.map +1 -0
  250. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js +51 -0
  251. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js.map +1 -0
  252. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts +3 -0
  253. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts.map +1 -0
  254. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js +14 -0
  255. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js.map +1 -0
  256. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts +42 -0
  257. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts.map +1 -0
  258. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js +56 -0
  259. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js.map +1 -0
  260. package/dist/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  261. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts +42 -0
  262. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts.map +1 -0
  263. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js +51 -0
  264. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js.map +1 -0
  265. package/dist/catalog/composites/nebula/nebula.controls.d.ts +3 -0
  266. package/dist/catalog/composites/nebula/nebula.controls.d.ts.map +1 -0
  267. package/dist/catalog/composites/nebula/nebula.controls.js +11 -0
  268. package/dist/catalog/composites/nebula/nebula.controls.js.map +1 -0
  269. package/dist/catalog/composites/nebula/nebula.d.ts +22 -0
  270. package/dist/catalog/composites/nebula/nebula.d.ts.map +1 -0
  271. package/dist/catalog/composites/nebula/nebula.js +38 -0
  272. package/dist/catalog/composites/nebula/nebula.js.map +1 -0
  273. package/dist/catalog/composites/nebula/nebula.thumb.webp +0 -0
  274. package/dist/catalog/composites/nebula/nebula.web.d.ts +22 -0
  275. package/dist/catalog/composites/nebula/nebula.web.d.ts.map +1 -0
  276. package/dist/catalog/composites/nebula/nebula.web.js +34 -0
  277. package/dist/catalog/composites/nebula/nebula.web.js.map +1 -0
  278. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts +3 -0
  279. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts.map +1 -0
  280. package/dist/catalog/composites/observation-deck/observation-deck.controls.js +13 -0
  281. package/dist/catalog/composites/observation-deck/observation-deck.controls.js.map +1 -0
  282. package/dist/catalog/composites/observation-deck/observation-deck.d.ts +41 -0
  283. package/dist/catalog/composites/observation-deck/observation-deck.d.ts.map +1 -0
  284. package/dist/catalog/composites/observation-deck/observation-deck.js +60 -0
  285. package/dist/catalog/composites/observation-deck/observation-deck.js.map +1 -0
  286. package/dist/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  287. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts +41 -0
  288. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts.map +1 -0
  289. package/dist/catalog/composites/observation-deck/observation-deck.web.js +54 -0
  290. package/dist/catalog/composites/observation-deck/observation-deck.web.js.map +1 -0
  291. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts +3 -0
  292. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts.map +1 -0
  293. package/dist/catalog/composites/simianlights/simianlights.controls.js +11 -0
  294. package/dist/catalog/composites/simianlights/simianlights.controls.js.map +1 -0
  295. package/dist/catalog/composites/simianlights/simianlights.d.ts +22 -0
  296. package/dist/catalog/composites/simianlights/simianlights.d.ts.map +1 -0
  297. package/dist/catalog/composites/simianlights/simianlights.js +30 -0
  298. package/dist/catalog/composites/simianlights/simianlights.js.map +1 -0
  299. package/dist/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  300. package/dist/catalog/composites/simianlights/simianlights.web.d.ts +22 -0
  301. package/dist/catalog/composites/simianlights/simianlights.web.d.ts.map +1 -0
  302. package/dist/catalog/composites/simianlights/simianlights.web.js +33 -0
  303. package/dist/catalog/composites/simianlights/simianlights.web.js.map +1 -0
  304. package/dist/catalog/composites/underwater/underwater.controls.d.ts +3 -0
  305. package/dist/catalog/composites/underwater/underwater.controls.d.ts.map +1 -0
  306. package/dist/catalog/composites/underwater/underwater.controls.js +11 -0
  307. package/dist/catalog/composites/underwater/underwater.controls.js.map +1 -0
  308. package/dist/catalog/composites/underwater/underwater.d.ts +30 -0
  309. package/dist/catalog/composites/underwater/underwater.d.ts.map +1 -0
  310. package/dist/catalog/composites/underwater/underwater.js +43 -0
  311. package/dist/catalog/composites/underwater/underwater.js.map +1 -0
  312. package/dist/catalog/composites/underwater/underwater.thumb.webp +0 -0
  313. package/dist/catalog/composites/underwater/underwater.web.d.ts +30 -0
  314. package/dist/catalog/composites/underwater/underwater.web.d.ts.map +1 -0
  315. package/dist/catalog/composites/underwater/underwater.web.js +40 -0
  316. package/dist/catalog/composites/underwater/underwater.web.js.map +1 -0
  317. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts +3 -0
  318. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts.map +1 -0
  319. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js +15 -0
  320. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js.map +1 -0
  321. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts +31 -0
  322. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts.map +1 -0
  323. package/dist/catalog/composites/wizard-tower/wizard-tower.js +45 -0
  324. package/dist/catalog/composites/wizard-tower/wizard-tower.js.map +1 -0
  325. package/dist/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  326. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts +31 -0
  327. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts.map +1 -0
  328. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js +39 -0
  329. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js.map +1 -0
  330. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts +3 -0
  331. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts.map +1 -0
  332. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js +14 -0
  333. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js.map +1 -0
  334. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts +31 -0
  335. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts.map +1 -0
  336. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js +44 -0
  337. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js.map +1 -0
  338. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  339. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts +31 -0
  340. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts.map +1 -0
  341. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js +39 -0
  342. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js.map +1 -0
  343. package/dist/catalog/images/corporate/corporate-logo.d.ts +3 -0
  344. package/dist/catalog/images/corporate/corporate-logo.d.ts.map +1 -0
  345. package/dist/catalog/images/corporate/corporate-logo.js +8 -0
  346. package/dist/catalog/images/corporate/corporate-logo.js.map +1 -0
  347. package/dist/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  348. package/dist/catalog/images/corporate/corporate-logo.web.d.ts +3 -0
  349. package/dist/catalog/images/corporate/corporate-logo.web.d.ts.map +1 -0
  350. package/dist/catalog/images/corporate/corporate-logo.web.js +12 -0
  351. package/dist/catalog/images/corporate/corporate-logo.web.js.map +1 -0
  352. package/dist/catalog/images/corporate/corporate-logo.webp +0 -0
  353. package/dist/catalog/images/debug/debug-resolutions.d.ts +3 -0
  354. package/dist/catalog/images/debug/debug-resolutions.d.ts.map +1 -0
  355. package/dist/catalog/images/debug/debug-resolutions.js +8 -0
  356. package/dist/catalog/images/debug/debug-resolutions.js.map +1 -0
  357. package/dist/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  358. package/dist/catalog/images/debug/debug-resolutions.web.d.ts +3 -0
  359. package/dist/catalog/images/debug/debug-resolutions.web.d.ts.map +1 -0
  360. package/dist/catalog/images/debug/debug-resolutions.web.js +12 -0
  361. package/dist/catalog/images/debug/debug-resolutions.web.js.map +1 -0
  362. package/dist/catalog/images/debug/debug-resolutions.webp +0 -0
  363. package/dist/catalog/images/fairy-caves/grotto.d.ts +3 -0
  364. package/dist/catalog/images/fairy-caves/grotto.d.ts.map +1 -0
  365. package/dist/catalog/images/fairy-caves/grotto.js +8 -0
  366. package/dist/catalog/images/fairy-caves/grotto.js.map +1 -0
  367. package/dist/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  368. package/dist/catalog/images/fairy-caves/grotto.web.d.ts +3 -0
  369. package/dist/catalog/images/fairy-caves/grotto.web.d.ts.map +1 -0
  370. package/dist/catalog/images/fairy-caves/grotto.web.js +12 -0
  371. package/dist/catalog/images/fairy-caves/grotto.web.js.map +1 -0
  372. package/dist/catalog/images/fairy-caves/grotto.webp +0 -0
  373. package/dist/catalog/images/fairy-caves/hollow.d.ts +3 -0
  374. package/dist/catalog/images/fairy-caves/hollow.d.ts.map +1 -0
  375. package/dist/catalog/images/fairy-caves/hollow.js +8 -0
  376. package/dist/catalog/images/fairy-caves/hollow.js.map +1 -0
  377. package/dist/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  378. package/dist/catalog/images/fairy-caves/hollow.web.d.ts +3 -0
  379. package/dist/catalog/images/fairy-caves/hollow.web.d.ts.map +1 -0
  380. package/dist/catalog/images/fairy-caves/hollow.web.js +12 -0
  381. package/dist/catalog/images/fairy-caves/hollow.web.js.map +1 -0
  382. package/dist/catalog/images/fairy-caves/hollow.webp +0 -0
  383. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts +3 -0
  384. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts.map +1 -0
  385. package/dist/catalog/images/fairy-caves/treehouse-2.js +8 -0
  386. package/dist/catalog/images/fairy-caves/treehouse-2.js.map +1 -0
  387. package/dist/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  388. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts +3 -0
  389. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts.map +1 -0
  390. package/dist/catalog/images/fairy-caves/treehouse-2.web.js +12 -0
  391. package/dist/catalog/images/fairy-caves/treehouse-2.web.js.map +1 -0
  392. package/dist/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  393. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts +3 -0
  394. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts.map +1 -0
  395. package/dist/catalog/images/fairy-caves/treehouse-3.js +8 -0
  396. package/dist/catalog/images/fairy-caves/treehouse-3.js.map +1 -0
  397. package/dist/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  398. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts +3 -0
  399. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts.map +1 -0
  400. package/dist/catalog/images/fairy-caves/treehouse-3.web.js +12 -0
  401. package/dist/catalog/images/fairy-caves/treehouse-3.web.js.map +1 -0
  402. package/dist/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  403. package/dist/catalog/images/fairy-caves/treehouse.d.ts +3 -0
  404. package/dist/catalog/images/fairy-caves/treehouse.d.ts.map +1 -0
  405. package/dist/catalog/images/fairy-caves/treehouse.js +8 -0
  406. package/dist/catalog/images/fairy-caves/treehouse.js.map +1 -0
  407. package/dist/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  408. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts +3 -0
  409. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts.map +1 -0
  410. package/dist/catalog/images/fairy-caves/treehouse.web.js +12 -0
  411. package/dist/catalog/images/fairy-caves/treehouse.web.js.map +1 -0
  412. package/dist/catalog/images/fairy-caves/treehouse.webp +0 -0
  413. package/dist/catalog/images/home/home-dark.d.ts +3 -0
  414. package/dist/catalog/images/home/home-dark.d.ts.map +1 -0
  415. package/dist/catalog/images/home/home-dark.js +8 -0
  416. package/dist/catalog/images/home/home-dark.js.map +1 -0
  417. package/dist/catalog/images/home/home-dark.thumb.webp +0 -0
  418. package/dist/catalog/images/home/home-dark.web.d.ts +3 -0
  419. package/dist/catalog/images/home/home-dark.web.d.ts.map +1 -0
  420. package/dist/catalog/images/home/home-dark.web.js +12 -0
  421. package/dist/catalog/images/home/home-dark.web.js.map +1 -0
  422. package/dist/catalog/images/home/home-dark.webp +0 -0
  423. package/dist/catalog/images/home/home-light.d.ts +3 -0
  424. package/dist/catalog/images/home/home-light.d.ts.map +1 -0
  425. package/dist/catalog/images/home/home-light.js +8 -0
  426. package/dist/catalog/images/home/home-light.js.map +1 -0
  427. package/dist/catalog/images/home/home-light.thumb.webp +0 -0
  428. package/dist/catalog/images/home/home-light.web.d.ts +3 -0
  429. package/dist/catalog/images/home/home-light.web.d.ts.map +1 -0
  430. package/dist/catalog/images/home/home-light.web.js +12 -0
  431. package/dist/catalog/images/home/home-light.web.js.map +1 -0
  432. package/dist/catalog/images/home/home-light.webp +0 -0
  433. package/dist/catalog/images/image-ids.d.ts +3 -0
  434. package/dist/catalog/images/image-ids.d.ts.map +1 -0
  435. package/dist/catalog/images/image-ids.js +43 -0
  436. package/dist/catalog/images/image-ids.js.map +1 -0
  437. package/dist/catalog/images/image.types.d.ts +2 -0
  438. package/dist/catalog/images/image.types.d.ts.map +1 -0
  439. package/dist/catalog/images/image.types.js +3 -0
  440. package/dist/catalog/images/image.types.js.map +1 -0
  441. package/dist/catalog/images/index.d.ts +3 -0
  442. package/dist/catalog/images/index.d.ts.map +1 -0
  443. package/dist/catalog/images/index.js +10 -0
  444. package/dist/catalog/images/index.js.map +1 -0
  445. package/dist/catalog/images/nature/landscape-dark.d.ts +3 -0
  446. package/dist/catalog/images/nature/landscape-dark.d.ts.map +1 -0
  447. package/dist/catalog/images/nature/landscape-dark.js +8 -0
  448. package/dist/catalog/images/nature/landscape-dark.js.map +1 -0
  449. package/dist/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  450. package/dist/catalog/images/nature/landscape-dark.web.d.ts +3 -0
  451. package/dist/catalog/images/nature/landscape-dark.web.d.ts.map +1 -0
  452. package/dist/catalog/images/nature/landscape-dark.web.js +12 -0
  453. package/dist/catalog/images/nature/landscape-dark.web.js.map +1 -0
  454. package/dist/catalog/images/nature/landscape-dark.webp +0 -0
  455. package/dist/catalog/images/nature/landscape-light.d.ts +3 -0
  456. package/dist/catalog/images/nature/landscape-light.d.ts.map +1 -0
  457. package/dist/catalog/images/nature/landscape-light.js +8 -0
  458. package/dist/catalog/images/nature/landscape-light.js.map +1 -0
  459. package/dist/catalog/images/nature/landscape-light.thumb.webp +0 -0
  460. package/dist/catalog/images/nature/landscape-light.web.d.ts +3 -0
  461. package/dist/catalog/images/nature/landscape-light.web.d.ts.map +1 -0
  462. package/dist/catalog/images/nature/landscape-light.web.js +12 -0
  463. package/dist/catalog/images/nature/landscape-light.web.js.map +1 -0
  464. package/dist/catalog/images/nature/landscape-light.webp +0 -0
  465. package/dist/catalog/images/office/office-dark.d.ts +3 -0
  466. package/dist/catalog/images/office/office-dark.d.ts.map +1 -0
  467. package/dist/catalog/images/office/office-dark.js +8 -0
  468. package/dist/catalog/images/office/office-dark.js.map +1 -0
  469. package/dist/catalog/images/office/office-dark.thumb.webp +0 -0
  470. package/dist/catalog/images/office/office-dark.web.d.ts +3 -0
  471. package/dist/catalog/images/office/office-dark.web.d.ts.map +1 -0
  472. package/dist/catalog/images/office/office-dark.web.js +12 -0
  473. package/dist/catalog/images/office/office-dark.web.js.map +1 -0
  474. package/dist/catalog/images/office/office-dark.webp +0 -0
  475. package/dist/catalog/images/office/office-light.d.ts +3 -0
  476. package/dist/catalog/images/office/office-light.d.ts.map +1 -0
  477. package/dist/catalog/images/office/office-light.js +8 -0
  478. package/dist/catalog/images/office/office-light.js.map +1 -0
  479. package/dist/catalog/images/office/office-light.thumb.webp +0 -0
  480. package/dist/catalog/images/office/office-light.web.d.ts +3 -0
  481. package/dist/catalog/images/office/office-light.web.d.ts.map +1 -0
  482. package/dist/catalog/images/office/office-light.web.js +12 -0
  483. package/dist/catalog/images/office/office-light.web.js.map +1 -0
  484. package/dist/catalog/images/office/office-light.webp +0 -0
  485. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts +3 -0
  486. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts.map +1 -0
  487. package/dist/catalog/images/sci-fi/sci-fi-light.js +8 -0
  488. package/dist/catalog/images/sci-fi/sci-fi-light.js.map +1 -0
  489. package/dist/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  490. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts +3 -0
  491. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts.map +1 -0
  492. package/dist/catalog/images/sci-fi/sci-fi-light.web.js +12 -0
  493. package/dist/catalog/images/sci-fi/sci-fi-light.web.js.map +1 -0
  494. package/dist/catalog/images/sci-fi/sci-fi-light.webp +0 -0
  495. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts +3 -0
  496. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts.map +1 -0
  497. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js +8 -0
  498. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js.map +1 -0
  499. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  500. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts +3 -0
  501. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts.map +1 -0
  502. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js +12 -0
  503. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js.map +1 -0
  504. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  505. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts +3 -0
  506. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts.map +1 -0
  507. package/dist/catalog/images/simiancraft/simiancraft-dark.js +8 -0
  508. package/dist/catalog/images/simiancraft/simiancraft-dark.js.map +1 -0
  509. package/dist/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  510. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts +3 -0
  511. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts.map +1 -0
  512. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js +12 -0
  513. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js.map +1 -0
  514. package/dist/catalog/images/simiancraft/simiancraft-dark.webp +0 -0
  515. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts +3 -0
  516. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts.map +1 -0
  517. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js +8 -0
  518. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js.map +1 -0
  519. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  520. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts +3 -0
  521. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts.map +1 -0
  522. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js +12 -0
  523. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js.map +1 -0
  524. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  525. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts +3 -0
  526. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts.map +1 -0
  527. package/dist/catalog/images/simiancraft/simiancraft-light.js +8 -0
  528. package/dist/catalog/images/simiancraft/simiancraft-light.js.map +1 -0
  529. package/dist/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  530. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts +3 -0
  531. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts.map +1 -0
  532. package/dist/catalog/images/simiancraft/simiancraft-light.web.js +12 -0
  533. package/dist/catalog/images/simiancraft/simiancraft-light.web.js.map +1 -0
  534. package/dist/catalog/images/simiancraft/simiancraft-light.webp +0 -0
  535. package/dist/catalog/images/spaceship/observation-deck.d.ts +3 -0
  536. package/dist/catalog/images/spaceship/observation-deck.d.ts.map +1 -0
  537. package/dist/catalog/images/spaceship/observation-deck.js +8 -0
  538. package/dist/catalog/images/spaceship/observation-deck.js.map +1 -0
  539. package/dist/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  540. package/dist/catalog/images/spaceship/observation-deck.web.d.ts +3 -0
  541. package/dist/catalog/images/spaceship/observation-deck.web.d.ts.map +1 -0
  542. package/dist/catalog/images/spaceship/observation-deck.web.js +12 -0
  543. package/dist/catalog/images/spaceship/observation-deck.web.js.map +1 -0
  544. package/dist/catalog/images/spaceship/observation-deck.webp +0 -0
  545. package/dist/catalog/images/underwater/oceanscape-dark.d.ts +3 -0
  546. package/dist/catalog/images/underwater/oceanscape-dark.d.ts.map +1 -0
  547. package/dist/catalog/images/underwater/oceanscape-dark.js +8 -0
  548. package/dist/catalog/images/underwater/oceanscape-dark.js.map +1 -0
  549. package/dist/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  550. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts +3 -0
  551. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts.map +1 -0
  552. package/dist/catalog/images/underwater/oceanscape-dark.web.js +12 -0
  553. package/dist/catalog/images/underwater/oceanscape-dark.web.js.map +1 -0
  554. package/dist/catalog/images/underwater/oceanscape-dark.webp +0 -0
  555. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts +3 -0
  556. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts.map +1 -0
  557. package/dist/catalog/images/wizard-tower/wizard-tower-1.js +8 -0
  558. package/dist/catalog/images/wizard-tower/wizard-tower-1.js.map +1 -0
  559. package/dist/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  560. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts +3 -0
  561. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts.map +1 -0
  562. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js +12 -0
  563. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js.map +1 -0
  564. package/dist/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  565. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts +3 -0
  566. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts.map +1 -0
  567. package/dist/catalog/images/wizard-tower/wizard-tower-2.js +8 -0
  568. package/dist/catalog/images/wizard-tower/wizard-tower-2.js.map +1 -0
  569. package/dist/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  570. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts +3 -0
  571. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts.map +1 -0
  572. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js +12 -0
  573. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js.map +1 -0
  574. package/dist/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  575. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts +3 -0
  576. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts.map +1 -0
  577. package/dist/catalog/images/wizard-tower/wizard-tower-night.js +8 -0
  578. package/dist/catalog/images/wizard-tower/wizard-tower-night.js.map +1 -0
  579. package/dist/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  580. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts +3 -0
  581. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts.map +1 -0
  582. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js +12 -0
  583. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js.map +1 -0
  584. package/dist/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  585. package/dist/catalog/shaders/_shared/types.d.ts +38 -0
  586. package/dist/catalog/shaders/_shared/types.d.ts.map +1 -0
  587. package/dist/catalog/shaders/_shared/types.js +15 -0
  588. package/dist/catalog/shaders/_shared/types.js.map +1 -0
  589. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts +26 -0
  590. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts.map +1 -0
  591. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts +3 -0
  592. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts.map +1 -0
  593. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js +15 -0
  594. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js.map +1 -0
  595. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js +84 -0
  596. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js.map +1 -0
  597. package/dist/catalog/shaders/blur/blur.d.ts +15 -0
  598. package/dist/catalog/shaders/blur/blur.d.ts.map +1 -0
  599. package/dist/catalog/shaders/blur/blur.form.d.ts +3 -0
  600. package/dist/catalog/shaders/blur/blur.form.d.ts.map +1 -0
  601. package/dist/catalog/shaders/blur/blur.form.js +15 -0
  602. package/dist/catalog/shaders/blur/blur.form.js.map +1 -0
  603. package/dist/catalog/shaders/blur/blur.js +27 -0
  604. package/dist/catalog/shaders/blur/blur.js.map +1 -0
  605. package/dist/catalog/shaders/clouds/clouds.d.ts +34 -0
  606. package/dist/catalog/shaders/clouds/clouds.d.ts.map +1 -0
  607. package/dist/catalog/shaders/clouds/clouds.form.d.ts +3 -0
  608. package/dist/catalog/shaders/clouds/clouds.form.d.ts.map +1 -0
  609. package/dist/catalog/shaders/clouds/clouds.form.js +15 -0
  610. package/dist/catalog/shaders/clouds/clouds.form.js.map +1 -0
  611. package/dist/catalog/shaders/clouds/clouds.js +98 -0
  612. package/dist/catalog/shaders/clouds/clouds.js.map +1 -0
  613. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts +40 -0
  614. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  615. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts +3 -0
  616. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts.map +1 -0
  617. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js +15 -0
  618. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js.map +1 -0
  619. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js +100 -0
  620. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js.map +1 -0
  621. package/dist/catalog/shaders/fireflies/fireflies.d.ts +18 -0
  622. package/dist/catalog/shaders/fireflies/fireflies.d.ts.map +1 -0
  623. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts +3 -0
  624. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts.map +1 -0
  625. package/dist/catalog/shaders/fireflies/fireflies.form.js +15 -0
  626. package/dist/catalog/shaders/fireflies/fireflies.form.js.map +1 -0
  627. package/dist/catalog/shaders/fireflies/fireflies.js +47 -0
  628. package/dist/catalog/shaders/fireflies/fireflies.js.map +1 -0
  629. package/dist/catalog/shaders/godrays/godrays.d.ts +26 -0
  630. package/dist/catalog/shaders/godrays/godrays.d.ts.map +1 -0
  631. package/dist/catalog/shaders/godrays/godrays.form.d.ts +3 -0
  632. package/dist/catalog/shaders/godrays/godrays.form.d.ts.map +1 -0
  633. package/dist/catalog/shaders/godrays/godrays.form.js +15 -0
  634. package/dist/catalog/shaders/godrays/godrays.form.js.map +1 -0
  635. package/dist/catalog/shaders/godrays/godrays.js +83 -0
  636. package/dist/catalog/shaders/godrays/godrays.js.map +1 -0
  637. package/dist/catalog/shaders/index.d.ts +73 -0
  638. package/dist/catalog/shaders/index.d.ts.map +1 -0
  639. package/dist/catalog/shaders/index.js +30 -0
  640. package/dist/catalog/shaders/index.js.map +1 -0
  641. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts +44 -0
  642. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts.map +1 -0
  643. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts +3 -0
  644. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts.map +1 -0
  645. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js +16 -0
  646. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js.map +1 -0
  647. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js +91 -0
  648. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js.map +1 -0
  649. package/dist/catalog/shaders/nebula/nebula.d.ts +20 -0
  650. package/dist/catalog/shaders/nebula/nebula.d.ts.map +1 -0
  651. package/dist/catalog/shaders/nebula/nebula.form.d.ts +3 -0
  652. package/dist/catalog/shaders/nebula/nebula.form.d.ts.map +1 -0
  653. package/dist/catalog/shaders/nebula/nebula.form.js +15 -0
  654. package/dist/catalog/shaders/nebula/nebula.form.js.map +1 -0
  655. package/dist/catalog/shaders/nebula/nebula.js +58 -0
  656. package/dist/catalog/shaders/nebula/nebula.js.map +1 -0
  657. package/dist/catalog/shaders/plasma/plasma.d.ts +16 -0
  658. package/dist/catalog/shaders/plasma/plasma.d.ts.map +1 -0
  659. package/dist/catalog/shaders/plasma/plasma.form.d.ts +3 -0
  660. package/dist/catalog/shaders/plasma/plasma.form.d.ts.map +1 -0
  661. package/dist/catalog/shaders/plasma/plasma.form.js +15 -0
  662. package/dist/catalog/shaders/plasma/plasma.form.js.map +1 -0
  663. package/dist/catalog/shaders/plasma/plasma.js +32 -0
  664. package/dist/catalog/shaders/plasma/plasma.js.map +1 -0
  665. package/dist/catalog/shaders/simianlights/simianlights.d.ts +20 -0
  666. package/dist/catalog/shaders/simianlights/simianlights.d.ts.map +1 -0
  667. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts +3 -0
  668. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts.map +1 -0
  669. package/dist/catalog/shaders/simianlights/simianlights.form.js +15 -0
  670. package/dist/catalog/shaders/simianlights/simianlights.form.js.map +1 -0
  671. package/dist/catalog/shaders/simianlights/simianlights.js +57 -0
  672. package/dist/catalog/shaders/simianlights/simianlights.js.map +1 -0
  673. package/dist/src/components/form/control-form.d.ts +37 -0
  674. package/dist/src/components/form/control-form.d.ts.map +1 -0
  675. package/dist/src/components/form/control-form.js +55 -0
  676. package/dist/src/components/form/control-form.js.map +1 -0
  677. package/dist/src/components/form/make-controls.d.ts +22 -0
  678. package/dist/src/components/form/make-controls.d.ts.map +1 -0
  679. package/dist/src/components/form/make-controls.js +19 -0
  680. package/dist/src/components/form/make-controls.js.map +1 -0
  681. package/dist/src/components/form/scope.d.ts +2 -0
  682. package/dist/src/components/form/scope.d.ts.map +1 -0
  683. package/dist/src/components/form/scope.js +11 -0
  684. package/dist/src/components/form/scope.js.map +1 -0
  685. package/dist/src/components/form/use-field.d.ts +10 -0
  686. package/dist/src/components/form/use-field.d.ts.map +1 -0
  687. package/dist/src/components/form/use-field.js +27 -0
  688. package/dist/src/components/form/use-field.js.map +1 -0
  689. package/dist/src/components/preset-book-menu/index.d.ts +52 -0
  690. package/dist/src/components/preset-book-menu/index.d.ts.map +1 -0
  691. package/dist/src/components/preset-book-menu/index.js +152 -0
  692. package/dist/src/components/preset-book-menu/index.js.map +1 -0
  693. package/dist/src/components/preset-book-menu/layout.d.ts +25 -0
  694. package/dist/src/components/preset-book-menu/layout.d.ts.map +1 -0
  695. package/dist/src/components/preset-book-menu/layout.js +19 -0
  696. package/dist/src/components/preset-book-menu/layout.js.map +1 -0
  697. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts +88 -0
  698. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts.map +1 -0
  699. package/dist/src/components/preset-book-menu/preset-book-menu.types.js +14 -0
  700. package/dist/src/components/preset-book-menu/preset-book-menu.types.js.map +1 -0
  701. package/dist/src/components/preset-book-menu/preset-grid.d.ts +16 -0
  702. package/dist/src/components/preset-book-menu/preset-grid.d.ts.map +1 -0
  703. package/dist/src/components/preset-book-menu/preset-grid.js +49 -0
  704. package/dist/src/components/preset-book-menu/preset-grid.js.map +1 -0
  705. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts +3 -0
  706. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts.map +1 -0
  707. package/dist/src/components/preset-book-menu/resolve-image-uri.js +28 -0
  708. package/dist/src/components/preset-book-menu/resolve-image-uri.js.map +1 -0
  709. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts +13 -0
  710. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts.map +1 -0
  711. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js +5 -0
  712. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js.map +1 -0
  713. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts +3 -0
  714. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts.map +1 -0
  715. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js +17 -0
  716. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js.map +1 -0
  717. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts +14 -0
  718. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts.map +1 -0
  719. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js +36 -0
  720. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js.map +1 -0
  721. package/dist/src/components/preset-control-panel/control-section.d.ts +9 -0
  722. package/dist/src/components/preset-control-panel/control-section.d.ts.map +1 -0
  723. package/dist/src/components/preset-control-panel/control-section.js +47 -0
  724. package/dist/src/components/preset-control-panel/control-section.js.map +1 -0
  725. package/dist/src/components/preset-control-panel/control.d.ts +10 -0
  726. package/dist/src/components/preset-control-panel/control.d.ts.map +1 -0
  727. package/dist/src/components/preset-control-panel/control.js +35 -0
  728. package/dist/src/components/preset-control-panel/control.js.map +1 -0
  729. package/dist/src/components/preset-control-panel/index.d.ts +14 -0
  730. package/dist/src/components/preset-control-panel/index.d.ts.map +1 -0
  731. package/dist/src/components/preset-control-panel/index.js +49 -0
  732. package/dist/src/components/preset-control-panel/index.js.map +1 -0
  733. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts +11 -0
  734. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts.map +1 -0
  735. package/dist/src/components/preset-control-panel/mask-control-panel.js +34 -0
  736. package/dist/src/components/preset-control-panel/mask-control-panel.js.map +1 -0
  737. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts +12 -0
  738. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts.map +1 -0
  739. package/dist/src/components/preset-control-panel/preset-control-panel.js +23 -0
  740. package/dist/src/components/preset-control-panel/preset-control-panel.js.map +1 -0
  741. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts +14 -0
  742. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts.map +1 -0
  743. package/dist/src/components/preset-control-panel/transform-control-panel.js +58 -0
  744. package/dist/src/components/preset-control-panel/transform-control-panel.js.map +1 -0
  745. package/dist/src/components/preset-tile/index.d.ts +24 -0
  746. package/dist/src/components/preset-tile/index.d.ts.map +1 -0
  747. package/dist/src/components/preset-tile/index.js +98 -0
  748. package/dist/src/components/preset-tile/index.js.map +1 -0
  749. package/dist/src/components/theme/provider.d.ts +18 -0
  750. package/dist/src/components/theme/provider.d.ts.map +1 -0
  751. package/dist/src/components/theme/provider.js +29 -0
  752. package/dist/src/components/theme/provider.js.map +1 -0
  753. package/dist/src/components/theme/slots.d.ts +17 -0
  754. package/dist/src/components/theme/slots.d.ts.map +1 -0
  755. package/dist/src/components/theme/slots.js +9 -0
  756. package/dist/src/components/theme/slots.js.map +1 -0
  757. package/dist/src/components/ui/button.d.ts +14 -0
  758. package/dist/src/components/ui/button.d.ts.map +1 -0
  759. package/dist/src/components/ui/button.js +29 -0
  760. package/dist/src/components/ui/button.js.map +1 -0
  761. package/dist/src/components/ui/color-picker.d.ts +12 -0
  762. package/dist/src/components/ui/color-picker.d.ts.map +1 -0
  763. package/dist/src/components/ui/color-picker.js +43 -0
  764. package/dist/src/components/ui/color-picker.js.map +1 -0
  765. package/dist/src/components/ui/index.d.ts +6 -0
  766. package/dist/src/components/ui/index.d.ts.map +1 -0
  767. package/dist/src/components/ui/index.js +18 -0
  768. package/dist/src/components/ui/index.js.map +1 -0
  769. package/dist/src/components/ui/label.d.ts +10 -0
  770. package/dist/src/components/ui/label.d.ts.map +1 -0
  771. package/dist/src/components/ui/label.js +14 -0
  772. package/dist/src/components/ui/label.js.map +1 -0
  773. package/dist/src/components/ui/point.d.ts +19 -0
  774. package/dist/src/components/ui/point.d.ts.map +1 -0
  775. package/dist/src/components/ui/point.js +52 -0
  776. package/dist/src/components/ui/point.js.map +1 -0
  777. package/dist/src/components/ui/polygon-field.d.ts +10 -0
  778. package/dist/src/components/ui/polygon-field.d.ts.map +1 -0
  779. package/dist/src/components/ui/polygon-field.js +50 -0
  780. package/dist/src/components/ui/polygon-field.js.map +1 -0
  781. package/dist/src/components/ui/readout.d.ts +10 -0
  782. package/dist/src/components/ui/readout.d.ts.map +1 -0
  783. package/dist/src/components/ui/readout.js +14 -0
  784. package/dist/src/components/ui/readout.js.map +1 -0
  785. package/dist/src/components/ui/slider-value.d.ts +8 -0
  786. package/dist/src/components/ui/slider-value.d.ts.map +1 -0
  787. package/dist/src/components/ui/slider-value.js +17 -0
  788. package/dist/src/components/ui/slider-value.js.map +1 -0
  789. package/dist/src/components/ui/slider.d.ts +15 -0
  790. package/dist/src/components/ui/slider.d.ts.map +1 -0
  791. package/dist/src/components/ui/slider.js +58 -0
  792. package/dist/src/components/ui/slider.js.map +1 -0
  793. package/dist/src/components/ui/switch.d.ts +8 -0
  794. package/dist/src/components/ui/switch.d.ts.map +1 -0
  795. package/dist/src/components/ui/switch.js +24 -0
  796. package/dist/src/components/ui/switch.js.map +1 -0
  797. package/dist/src/index.d.ts +18 -0
  798. package/dist/src/index.d.ts.map +1 -0
  799. package/dist/src/index.js +187 -0
  800. package/dist/src/index.js.map +1 -0
  801. package/dist/src/index.web.d.ts +32 -0
  802. package/dist/src/index.web.d.ts.map +1 -0
  803. package/dist/src/index.web.js +119 -0
  804. package/dist/src/index.web.js.map +1 -0
  805. package/dist/src/kaleidoscope/controls.d.ts +24 -0
  806. package/dist/src/kaleidoscope/controls.d.ts.map +1 -0
  807. package/dist/src/kaleidoscope/controls.js +92 -0
  808. package/dist/src/kaleidoscope/controls.js.map +1 -0
  809. package/dist/src/kaleidoscope/effect.d.ts +4 -0
  810. package/dist/src/kaleidoscope/effect.d.ts.map +1 -0
  811. package/dist/src/kaleidoscope/effect.js +7 -0
  812. package/dist/src/kaleidoscope/effect.js.map +1 -0
  813. package/dist/src/kaleidoscope/effect.types.d.ts +47 -0
  814. package/dist/src/kaleidoscope/effect.types.d.ts.map +1 -0
  815. package/dist/src/kaleidoscope/effect.types.js +9 -0
  816. package/dist/src/kaleidoscope/effect.types.js.map +1 -0
  817. package/dist/src/kaleidoscope/shader-to-spec.d.ts +4 -0
  818. package/dist/src/kaleidoscope/shader-to-spec.d.ts.map +1 -0
  819. package/dist/src/kaleidoscope/shader-to-spec.js +17 -0
  820. package/dist/src/kaleidoscope/shader-to-spec.js.map +1 -0
  821. package/dist/src/kaleidoscope/types.d.ts +79 -0
  822. package/dist/src/kaleidoscope/types.d.ts.map +1 -0
  823. package/dist/src/kaleidoscope/types.js +18 -0
  824. package/dist/src/kaleidoscope/types.js.map +1 -0
  825. package/dist/src/kaleidoscope.preset-book.types.d.ts +86 -0
  826. package/dist/src/kaleidoscope.preset-book.types.d.ts.map +1 -0
  827. package/dist/src/kaleidoscope.preset-book.types.js +16 -0
  828. package/dist/src/kaleidoscope.preset-book.types.js.map +1 -0
  829. package/dist/src/lib/primitives.types.d.ts +3 -0
  830. package/dist/src/lib/primitives.types.d.ts.map +1 -0
  831. package/dist/src/lib/primitives.types.js +5 -0
  832. package/dist/src/lib/primitives.types.js.map +1 -0
  833. package/dist/src/lib/test-id.d.ts +30 -0
  834. package/dist/src/lib/test-id.d.ts.map +1 -0
  835. package/dist/src/lib/test-id.js +81 -0
  836. package/dist/src/lib/test-id.js.map +1 -0
  837. package/dist/{livekit.d.ts → src/livekit.d.ts} +3 -3
  838. package/dist/src/livekit.d.ts.map +1 -0
  839. package/dist/{livekit.js → src/livekit.js} +12 -6
  840. package/dist/src/livekit.js.map +1 -0
  841. package/dist/src/nativewind.d.ts +7 -0
  842. package/dist/src/nativewind.d.ts.map +1 -0
  843. package/dist/src/nativewind.js +43 -0
  844. package/dist/src/nativewind.js.map +1 -0
  845. package/dist/web-driver/effects/composite.d.ts +14 -0
  846. package/dist/web-driver/effects/composite.d.ts.map +1 -0
  847. package/dist/web-driver/effects/composite.js +576 -0
  848. package/dist/web-driver/effects/composite.js.map +1 -0
  849. package/dist/web-driver/effects/layer-shaders.d.ts +2 -0
  850. package/dist/web-driver/effects/layer-shaders.d.ts.map +1 -0
  851. package/dist/web-driver/effects/layer-shaders.js +11 -0
  852. package/dist/web-driver/effects/layer-shaders.js.map +1 -0
  853. package/dist/web-driver/effects/transform.d.ts +4 -0
  854. package/dist/web-driver/effects/transform.d.ts.map +1 -0
  855. package/dist/web-driver/effects/transform.js +66 -0
  856. package/dist/web-driver/effects/transform.js.map +1 -0
  857. package/dist/web-driver/index.d.ts +6 -0
  858. package/dist/web-driver/index.d.ts.map +1 -0
  859. package/dist/web-driver/index.js +21 -0
  860. package/dist/web-driver/index.js.map +1 -0
  861. package/dist/web-driver/insertable-streams.d.ts.map +1 -0
  862. package/dist/{web → web-driver}/insertable-streams.js +5 -1
  863. package/dist/web-driver/insertable-streams.js.map +1 -0
  864. package/dist/web-driver/segmenter.d.ts +29 -0
  865. package/dist/web-driver/segmenter.d.ts.map +1 -0
  866. package/dist/{web → web-driver}/segmenter.js +40 -2
  867. package/dist/web-driver/segmenter.js.map +1 -0
  868. package/dist/web-driver/shaders.d.ts +2 -0
  869. package/dist/web-driver/shaders.d.ts.map +1 -0
  870. package/dist/web-driver/shaders.generated.d.ts +17 -0
  871. package/dist/web-driver/shaders.generated.d.ts.map +1 -0
  872. package/dist/web-driver/shaders.generated.js +1180 -0
  873. package/dist/web-driver/shaders.generated.js.map +1 -0
  874. package/dist/web-driver/shaders.js +28 -0
  875. package/dist/web-driver/shaders.js.map +1 -0
  876. package/dist/{web → web-driver}/tuning.d.ts +4 -0
  877. package/dist/web-driver/tuning.d.ts.map +1 -0
  878. package/dist/{web → web-driver}/tuning.js +26 -8
  879. package/dist/web-driver/tuning.js.map +1 -0
  880. package/ios/Kaleidoscope.podspec +30 -13
  881. package/ios/KaleidoscopeModule/BundledImage.swift +39 -0
  882. package/ios/KaleidoscopeModule/CompositeLayers.swift +142 -0
  883. package/ios/KaleidoscopeModule/EffectTuning.swift +91 -51
  884. package/ios/KaleidoscopeModule/KaleidoscopeModule.swift +57 -17
  885. package/ios/KaleidoscopeModule/Registration.swift +37 -15
  886. package/ios/KaleidoscopeModule/effects/CompositeProcessor.swift +906 -0
  887. package/ios/KaleidoscopeModule/effects/FrameBridge.swift +30 -24
  888. package/ios/KaleidoscopeModule/effects/TransformProcessor.swift +174 -0
  889. package/ios/KaleidoscopeModule/gpu/CompositeRendering.swift +352 -0
  890. package/ios/KaleidoscopeModule/gpu/Ingest.swift +171 -0
  891. package/ios/KaleidoscopeModule/gpu/MetalRenderer.swift +473 -366
  892. package/ios/KaleidoscopeModule/gpu/Orientation.swift +83 -0
  893. package/ios/KaleidoscopeModule/gpu/ShaderLibrary.swift +100 -54
  894. package/ios/KaleidoscopeModule/gpu/TextureBridge.swift +252 -80
  895. package/ios/KaleidoscopeModule/resources/selfie_segmenter.tflite +0 -0
  896. package/ios/KaleidoscopeModule/segmentation/MaskTuning.swift +11 -11
  897. package/ios/KaleidoscopeModule/segmentation/Segmenter.swift +431 -107
  898. package/ios/KaleidoscopeModule/shaders/GENERATIVE.txt +9 -0
  899. package/ios/KaleidoscopeModule/shaders/SHADERS.txt +14 -2
  900. package/ios/KaleidoscopeModule/shaders/anamorphic-lensflare.metalsrc +47 -0
  901. package/ios/KaleidoscopeModule/shaders/clouds.metalsrc +185 -0
  902. package/ios/KaleidoscopeModule/shaders/composite-blit.metalsrc +22 -0
  903. package/ios/KaleidoscopeModule/shaders/{blur.metalsrc → composite-blur.metalsrc} +29 -8
  904. package/ios/KaleidoscopeModule/shaders/composite-camera.metalsrc +22 -0
  905. package/ios/KaleidoscopeModule/shaders/composite-image.metalsrc +24 -0
  906. package/ios/KaleidoscopeModule/shaders/composite-masked.metalsrc +22 -0
  907. package/ios/KaleidoscopeModule/shaders/composite-subject.metalsrc +23 -0
  908. package/ios/KaleidoscopeModule/shaders/corporate-blobs.metalsrc +221 -0
  909. package/ios/KaleidoscopeModule/shaders/fireflies.metalsrc +44 -0
  910. package/ios/KaleidoscopeModule/shaders/godrays.metalsrc +46 -0
  911. package/ios/KaleidoscopeModule/shaders/light-beams-and-motes.metalsrc +316 -0
  912. package/ios/KaleidoscopeModule/shaders/nebula.metalsrc +45 -45
  913. package/ios/KaleidoscopeModule/shaders/plasma.metalsrc +26 -0
  914. package/ios/KaleidoscopeModule/shaders/simianlights.metalsrc +45 -45
  915. package/ios/KaleidoscopeModule/shaders/transform.metalsrc +22 -0
  916. package/package.json +489 -45
  917. package/plugin/build/android/assets.js +45 -0
  918. package/plugin/build/android/index.js +34 -0
  919. package/plugin/build/index.js +39 -0
  920. package/plugin/build/ios/assets.js +110 -0
  921. package/plugin/build/ios/deployment-target.js +105 -0
  922. package/plugin/build/ios/index.js +63 -0
  923. package/plugin/build/ios/pods.js +73 -0
  924. package/plugin/build/lib/constants.js +15 -0
  925. package/plugin/build/lib/file-manipulation.js +57 -0
  926. package/plugin/build/lib/mods.js +36 -0
  927. package/plugin/build/lib/preset-book.js +215 -0
  928. package/plugin/build/lib/types.js +16 -0
  929. package/src/components/form/control-form.tsx +112 -0
  930. package/src/components/form/make-controls.ts +33 -0
  931. package/src/components/form/scope.ts +9 -0
  932. package/src/components/form/use-field.ts +35 -0
  933. package/src/components/preset-book-menu/index.tsx +286 -0
  934. package/src/components/preset-book-menu/layout.tsx +63 -0
  935. package/src/components/preset-book-menu/preset-book-menu.types.ts +112 -0
  936. package/src/components/preset-book-menu/preset-grid.tsx +80 -0
  937. package/src/components/preset-book-menu/resolve-image-uri.ts +31 -0
  938. package/src/components/preset-book-menu/resolve-image-uri.types.ts +18 -0
  939. package/src/components/preset-book-menu/resolve-image-uri.web.ts +15 -0
  940. package/src/components/preset-control-panel/composite-layer-control-panel.tsx +56 -0
  941. package/src/components/preset-control-panel/control-section.tsx +84 -0
  942. package/src/components/preset-control-panel/control.tsx +50 -0
  943. package/src/components/preset-control-panel/index.ts +31 -0
  944. package/src/components/preset-control-panel/mask-control-panel.tsx +93 -0
  945. package/src/components/preset-control-panel/preset-control-panel.tsx +48 -0
  946. package/src/components/preset-control-panel/transform-control-panel.tsx +146 -0
  947. package/src/components/preset-tile/index.tsx +160 -0
  948. package/src/components/theme/provider.tsx +50 -0
  949. package/src/components/theme/slots.ts +37 -0
  950. package/src/components/ui/button.tsx +54 -0
  951. package/src/components/ui/color-picker.tsx +74 -0
  952. package/src/components/ui/index.ts +10 -0
  953. package/src/components/ui/label.tsx +24 -0
  954. package/src/components/ui/point.tsx +116 -0
  955. package/src/components/ui/polygon-field.tsx +84 -0
  956. package/src/components/ui/readout.tsx +25 -0
  957. package/src/components/ui/slider-value.ts +15 -0
  958. package/src/components/ui/slider.tsx +98 -0
  959. package/src/components/ui/switch.tsx +40 -0
  960. package/src/index.ts +205 -87
  961. package/src/index.web.ts +133 -63
  962. package/src/kaleidoscope/controls.ts +127 -0
  963. package/src/kaleidoscope/effect.ts +5 -0
  964. package/src/kaleidoscope/effect.types.ts +63 -0
  965. package/src/kaleidoscope/shader-to-spec.ts +16 -0
  966. package/src/kaleidoscope/types.ts +101 -0
  967. package/src/kaleidoscope.preset-book.types.ts +105 -0
  968. package/src/lib/primitives.types.ts +5 -0
  969. package/src/lib/test-id.ts +81 -0
  970. package/src/livekit.ts +6 -4
  971. package/src/nativewind.ts +41 -0
  972. package/android/src/main/assets/backgrounds/office-1.png +0 -0
  973. package/android/src/main/assets/backgrounds/office-2.png +0 -0
  974. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BackgroundImageFactory.kt +0 -335
  975. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BlurFactory.kt +0 -336
  976. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/MirrorFactory.kt +0 -57
  977. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GpuEffectFactory.kt +0 -14
  978. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GpuEffectProcessor.kt +0 -198
  979. package/dist/backgrounds/index.d.ts +0 -3
  980. package/dist/backgrounds/index.d.ts.map +0 -1
  981. package/dist/backgrounds/index.js +0 -6
  982. package/dist/backgrounds/index.js.map +0 -1
  983. package/dist/backgrounds/office-1.d.ts +0 -3
  984. package/dist/backgrounds/office-1.d.ts.map +0 -1
  985. package/dist/backgrounds/office-1.js +0 -5
  986. package/dist/backgrounds/office-1.js.map +0 -1
  987. package/dist/backgrounds/office-1.web.d.ts +0 -3
  988. package/dist/backgrounds/office-1.web.d.ts.map +0 -1
  989. package/dist/backgrounds/office-1.web.js +0 -8
  990. package/dist/backgrounds/office-1.web.js.map +0 -1
  991. package/dist/backgrounds/office-1.webp +0 -0
  992. package/dist/backgrounds/office-2.d.ts +0 -3
  993. package/dist/backgrounds/office-2.d.ts.map +0 -1
  994. package/dist/backgrounds/office-2.js +0 -5
  995. package/dist/backgrounds/office-2.js.map +0 -1
  996. package/dist/backgrounds/office-2.web.d.ts +0 -3
  997. package/dist/backgrounds/office-2.web.d.ts.map +0 -1
  998. package/dist/backgrounds/office-2.web.js +0 -8
  999. package/dist/backgrounds/office-2.web.js.map +0 -1
  1000. package/dist/backgrounds/office-2.webp +0 -0
  1001. package/dist/backgrounds/preset-source.types.d.ts +0 -2
  1002. package/dist/backgrounds/preset-source.types.d.ts.map +0 -1
  1003. package/dist/backgrounds/preset-source.types.js +0 -2
  1004. package/dist/backgrounds/preset-source.types.js.map +0 -1
  1005. package/dist/backgrounds/presets.d.ts +0 -3
  1006. package/dist/backgrounds/presets.d.ts.map +0 -1
  1007. package/dist/backgrounds/presets.js +0 -21
  1008. package/dist/backgrounds/presets.js.map +0 -1
  1009. package/dist/index.d.ts +0 -28
  1010. package/dist/index.d.ts.map +0 -1
  1011. package/dist/index.js +0 -128
  1012. package/dist/index.js.map +0 -1
  1013. package/dist/index.web.d.ts +0 -37
  1014. package/dist/index.web.d.ts.map +0 -1
  1015. package/dist/index.web.js +0 -97
  1016. package/dist/index.web.js.map +0 -1
  1017. package/dist/livekit.d.ts.map +0 -1
  1018. package/dist/livekit.js.map +0 -1
  1019. package/dist/types.d.ts +0 -67
  1020. package/dist/types.d.ts.map +0 -1
  1021. package/dist/types.js +0 -13
  1022. package/dist/types.js.map +0 -1
  1023. package/dist/web/effects/background-image.d.ts +0 -3
  1024. package/dist/web/effects/background-image.d.ts.map +0 -1
  1025. package/dist/web/effects/background-image.js +0 -217
  1026. package/dist/web/effects/background-image.js.map +0 -1
  1027. package/dist/web/effects/blur.d.ts +0 -3
  1028. package/dist/web/effects/blur.d.ts.map +0 -1
  1029. package/dist/web/effects/blur.js +0 -241
  1030. package/dist/web/effects/blur.js.map +0 -1
  1031. package/dist/web/effects/mirror.d.ts +0 -3
  1032. package/dist/web/effects/mirror.d.ts.map +0 -1
  1033. package/dist/web/effects/mirror.js +0 -31
  1034. package/dist/web/effects/mirror.js.map +0 -1
  1035. package/dist/web/effects/passthrough.d.ts +0 -3
  1036. package/dist/web/effects/passthrough.d.ts.map +0 -1
  1037. package/dist/web/effects/passthrough.js +0 -15
  1038. package/dist/web/effects/passthrough.js.map +0 -1
  1039. package/dist/web/insertable-streams.d.ts.map +0 -1
  1040. package/dist/web/insertable-streams.js.map +0 -1
  1041. package/dist/web/segmenter.d.ts +0 -20
  1042. package/dist/web/segmenter.d.ts.map +0 -1
  1043. package/dist/web/segmenter.js.map +0 -1
  1044. package/dist/web/shaders.d.ts +0 -2
  1045. package/dist/web/shaders.d.ts.map +0 -1
  1046. package/dist/web/shaders.generated.d.ts +0 -4
  1047. package/dist/web/shaders.generated.d.ts.map +0 -1
  1048. package/dist/web/shaders.generated.js +0 -54
  1049. package/dist/web/shaders.generated.js.map +0 -1
  1050. package/dist/web/shaders.js +0 -32
  1051. package/dist/web/shaders.js.map +0 -1
  1052. package/dist/web/tuning.d.ts.map +0 -1
  1053. package/dist/web/tuning.js.map +0 -1
  1054. package/ios/KaleidoscopeModule/effects/BackgroundImageProcessor.swift +0 -226
  1055. package/ios/KaleidoscopeModule/effects/BlurProcessor.swift +0 -178
  1056. package/ios/KaleidoscopeModule/effects/MirrorProcessor.swift +0 -136
  1057. package/ios/KaleidoscopeModule/resources/backgrounds/office-1.png +0 -0
  1058. package/ios/KaleidoscopeModule/resources/backgrounds/office-2.png +0 -0
  1059. package/ios/KaleidoscopeModule/shaders/composite.metalsrc +0 -22
  1060. package/src/backgrounds/README.md +0 -78
  1061. package/src/backgrounds/index.ts +0 -7
  1062. package/src/backgrounds/office-1.ts +0 -6
  1063. package/src/backgrounds/office-1.web.ts +0 -9
  1064. package/src/backgrounds/office-1.webp +0 -0
  1065. package/src/backgrounds/office-2.ts +0 -6
  1066. package/src/backgrounds/office-2.web.ts +0 -9
  1067. package/src/backgrounds/office-2.webp +0 -0
  1068. package/src/backgrounds/preset-source.types.ts +0 -5
  1069. package/src/backgrounds/presets.ts +0 -23
  1070. package/src/types.ts +0 -80
  1071. package/src/web/effects/background-image.ts +0 -277
  1072. package/src/web/effects/blur.ts +0 -291
  1073. package/src/web/effects/mirror.ts +0 -37
  1074. package/src/web/effects/passthrough.ts +0 -17
  1075. package/src/web/insertable-streams.ts +0 -112
  1076. package/src/web/segmenter.ts +0 -73
  1077. package/src/web/shaders.generated.ts +0 -56
  1078. package/src/web/shaders.ts +0 -31
  1079. package/src/web/tuning.ts +0 -53
  1080. /package/{src/backgrounds → catalog/images}/assets.d.ts +0 -0
  1081. /package/dist/{web → web-driver}/insertable-streams.d.ts +0 -0
package/NOTICE.md CHANGED
@@ -4,23 +4,34 @@ react-native-webrtc-kaleidoscope ships under the MIT license (see [LICENSE](./LI
4
4
 
5
5
  ## Runtime peer dependency
6
6
 
7
- - **react-native-webrtc** MIT license. <https://github.com/react-native-webrtc/react-native-webrtc>. The `track._setVideoEffects(...)` JS surface, the Android `ProcessorProvider` registry, and the iOS `RTCVideoFrameProcessor` protocol all originate upstream. This package is a consumer of, not a fork of, that codebase.
7
+ - **react-native-webrtc**: MIT license. <https://github.com/react-native-webrtc/react-native-webrtc>. The `track._setVideoEffects(...)` JS surface, the Android `ProcessorProvider` registry, and the iOS `RTCVideoFrameProcessor` protocol all originate upstream. This package is a consumer of, not a fork of, that codebase.
8
8
 
9
- ## Native segmentation backends (used by the `blur` effect)
9
+ ## Segmentation backends (used by the segmentation mask that drives the `blur` and image layers)
10
10
 
11
- - **Apple Vision** (iOS) system framework. `VNGeneratePersonSegmentationRequest`. Subject to the Apple SDK License Agreement.
12
- - **MLKit Selfie Segmentation** (Android) — Apache License 2.0. Distributed by Google as a managed AAR. <https://developers.google.com/ml-kit/vision/selfie-segmentation>.
13
- - **MediaPipe Selfie Segmentation** (web) Apache License 2.0. Loaded as an `optionalDependency` so native consumers do not bundle the WASM payload. <https://github.com/google-ai-edge/mediapipe>.
11
+ All three platforms run Google's MediaPipe selfie segmentation. The native targets use the MediaPipe Tasks Image Segmenter with a model bundled in this package; the web target uses the legacy MediaPipe Selfie Segmentation Solution loaded at runtime from a CDN.
12
+
13
+ - **MediaPipe Tasks Vision** (Android): Apache License 2.0. The `com.google.mediapipe:tasks-vision` AAR, `ImageSegmenter` API. <https://github.com/google-ai-edge/mediapipe>.
14
+ - **MediaPipe Tasks Vision** (iOS): Apache License 2.0. The `MediaPipeTasksVision` CocoaPod, `ImageSegmenter` API. <https://github.com/google-ai-edge/mediapipe>.
15
+ - **MediaPipe Selfie Segmentation** (web): Apache License 2.0. The `@mediapipe/selfie_segmentation` Solution, loaded at runtime from `cdn.jsdelivr.net` (not bundled in this package). <https://github.com/google-ai-edge/mediapipe>.
16
+
17
+ ### Bundled model
18
+
19
+ The native targets redistribute a TensorFlow Lite model inside the published package; it ships in `android/src/main/assets/selfie_segmenter.tflite` and in the iOS `Kaleidoscope.bundle`.
20
+
21
+ - **MediaPipe SelfieSegmenter** (`selfie_segmenter.tflite`): distributed by Google as part of MediaPipe Solutions.
22
+ - Source: <https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_segmenter/float16/latest/selfie_segmenter.tflite>
23
+ - Model card: <https://storage.googleapis.com/mediapipe-assets/Model%20Card%20MediaPipe%20Selfie%20Segmentation.pdf>
24
+ - The MediaPipe project and SDK are published by Google under the Apache License 2.0. The `selfie_segmenter.tflite` weights are redistributed here as published by Google as part of MediaPipe Solutions; Google does not attach a separate license to the hosted model file, so its use is governed by the model card above. The web target does not bundle this file; it fetches its model from the CDN at runtime.
14
25
 
15
26
  ## Algorithmic and architectural references
16
27
 
17
- - **mrousavy/FaceBlurApp** segmentation + GPU composite at 60–120 FPS. Different plumbing (camera-preview pipeline, not a WebRTC track), but the algorithmic shape of "mask + blurred copy + composite" is the same.
18
- - **Volcomix/virtual-background** TFLite WASM reference for the web blur composite.
28
+ - **mrousavy/FaceBlurApp**: segmentation + GPU composite at 60–120 FPS. Different plumbing (camera-preview pipeline, not a WebRTC track), but the algorithmic shape of "mask + blurred copy + composite" is the same.
29
+ - **Volcomix/virtual-background**: TFLite WASM reference for the web blur composite.
19
30
 
20
31
  ## Trademarks
21
32
 
22
- - "Apple", "Vision", "Core Image", and related Apple marks are trademarks of Apple Inc. Used here as nominative references only.
23
- - "Google", "MLKit", and "MediaPipe" are trademarks of Google LLC. Used here as nominative references only.
33
+ - "Apple", "Core Image", "Metal", and related Apple marks are trademarks of Apple Inc. Used here as nominative references only.
34
+ - "Google", "MediaPipe", and "TensorFlow Lite" are trademarks of Google LLC. Used here as nominative references only.
24
35
  - "WebRTC" is a project of the W3C and IETF.
25
36
 
26
37
  This package is not affiliated with, endorsed by, or certified by Apple, Google, the W3C, or the `react-native-webrtc` project.
package/README.md CHANGED
@@ -8,31 +8,40 @@
8
8
  [![npm version](https://img.shields.io/npm/v/react-native-webrtc-kaleidoscope?color=cb3837&logo=npm)](https://www.npmjs.com/package/react-native-webrtc-kaleidoscope)
9
9
  [![Types: included](https://img.shields.io/npm/types/react-native-webrtc-kaleidoscope?color=3178c6&logo=typescript)](https://www.npmjs.com/package/react-native-webrtc-kaleidoscope)
10
10
  [![CI](https://github.com/simiancraft/react-native-webrtc-kaleidoscope/actions/workflows/ci.yml/badge.svg)](https://github.com/simiancraft/react-native-webrtc-kaleidoscope/actions/workflows/ci.yml)
11
+ [![codecov](https://codecov.io/gh/simiancraft/react-native-webrtc-kaleidoscope/graph/badge.svg)](https://codecov.io/gh/simiancraft/react-native-webrtc-kaleidoscope)
12
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/simiancraft/react-native-webrtc-kaleidoscope/badge)](https://securityscorecards.dev/viewer/?uri=github.com/simiancraft/react-native-webrtc-kaleidoscope)
11
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
12
14
 
13
- > Live video effects for `react-native-webrtc`, packaged as a managed-Expo-friendly Expo Module.
15
+ <p align="center">
16
+ <code>kaleidoscope</code> &nbsp;•&nbsp; <code>transform</code> &nbsp;•&nbsp; <code>mask</code>
17
+ </p>
18
+
19
+ > Creative, shader-based video effects for React Native video calls: blur or replace a person's background in a teleconference. Works with `react-native-webrtc` and LiveKit, managed-Expo-friendly.
20
+
21
+ **Bind a track once, then drive it with three verbs.** `kaleidoscope` swaps the background effect (blur, a still image, or a procedural shader), `transform` reorients the frame, and `mask` tunes the segmentation edge. The effects you can command are a typed preset book you declare in your own project; at `expo prebuild`, only the assets you actually reference ship in your native bundle.
14
22
 
15
23
  ## Status
16
24
 
17
- **Active development; not yet production-ready.** Published to npm at `1.0.0` (semantic-release cut the first tag at 1.0.0; the number reflects release automation, not a maturity claim). The npm presentation, marketing, and release-quality polish will come in a later pass; right now the README's job is to tell the truth about what works.
25
+ **Active development; not yet production-ready.** Published to npm (the badge shows the current version, which tracks release automation rather than maturity). Presentation and install-doc polish come later; for now the README documents what works.
18
26
 
19
27
  ### What works today
20
28
 
21
- - **Mirror** (horizontal flip).
22
- - **Blur** (background blur, person stays sharp).
23
- - **Background replacement** (composite a still PNG behind the segmented person; two bundled office presets, library-side asset pipeline).
24
- - **Runtime tuning** of the GLSL effects; see the [Use](#use) section.
29
+ - **`kaleidoscope`**: the art axis. Blur, a bundled background image (ten themed backgrounds plus a calibration grid, or your own assets), or a procedural shader, commanded by preset name. The generative shaders that ship are `plasma`, `clouds`, `godrays`, `fireflies`, `nebula`, `simianlights`, `anamorphic-lensflare`, `light-beams-and-motes`, and `corporate-blobs`.
30
+ - **`transform`**: absolute flips and rotation (snapped to 90°), reapplied as full state each call.
31
+ - **`mask`**: the segmentation edge (hardness, threshold) shared by every art effect.
32
+ - **Tree-shaking**: declare a preset book; only the assets you reference ship in your native bundle (web tree-shakes by import).
33
+ - **Drop-in UI (optional)**: a preset-driven `PresetBookMenu` (the menu) under `react-native-webrtc-kaleidoscope/preset-book-menu`, plus a headless live-editor kit (`PresetControlPanel`, mask and transform controls, a theme provider) under `react-native-webrtc-kaleidoscope/preset-control-panel`. Controlled and NativeWind-ready. See [Drop-in UI](#drop-in-ui-optional).
25
34
 
26
- | Platform | Mirror | Blur | Background replacement | Notes |
35
+ | Platform | Transform | Blur | Background replacement | Notes |
27
36
  |---|---|---|---|---|
28
37
  | Web (Chrome / Edge) | ✓ | ✓ | ✓ | MediaStreamTrackProcessor + MediaPipe Selfie Segmentation (WASM, CDN) |
29
- | Android (API 24+) | ✓ | ✓ | ✓ | OpenGL ES 3.0 + MLKit Selfie Segmentation |
30
- | iOS (≥ 15) | ✓ | ✓ | ✓ | Metal + Vision (person segmentation), verified on device. Older A11 devices (iPhone X) run at a lower frame rate |
31
- | Safari / Firefox | | | | No Insertable Streams; `applyVideoEffects` throws a typed error |
38
+ | Android (API 24+) | ✓ | ✓ | ✓ | OpenGL ES 3.0 + MediaPipe Selfie Segmentation (Tasks) |
39
+ | iOS (≥ 15) | ✓ | ✓ | ✓ | Metal + MediaPipe Selfie Segmentation (Tasks), verified on device. Older A11 devices (iPhone X) run at a lower frame rate |
40
+ | Safari / Firefox | n/a | n/a | n/a | No Insertable Streams; the effects throw a clear capability error |
32
41
 
33
42
  ### Coming soon
34
43
 
35
- - **Procedural backgrounds** (animated shaders behind the person, not just still images). Same composite path; the only new piece is each effect's background producer.
44
+ - **Animated image backgrounds**: a bundled still that moves (beyond the procedural shaders, which already render behind the person today). Same composite path; the new piece is a per-effect background producer for animated images.
36
45
  - A careful pass over the npm presentation, install docs, and demo polish before any "we recommend you use this" framing.
37
46
 
38
47
  ## Install
@@ -53,12 +62,14 @@ bun add @livekit/react-native @livekit/react-native-webrtc react-native-webrtc-k
53
62
 
54
63
  Pick one fork. Installing both upstream `react-native-webrtc` and `@livekit/react-native-webrtc` in the same app will cause native class collisions; that's the consumer's problem to resolve.
55
64
 
56
- **Native wiring.** `@livekit/react-native` hands you a `LocalVideoTrack`; apply effects to its underlying `MediaStreamTrack`:
65
+ **Native wiring.** `@livekit/react-native` hands you a `LocalVideoTrack`; bind effects to its underlying `MediaStreamTrack`:
57
66
 
58
67
  ```ts
59
- import { applyVideoEffects } from 'react-native-webrtc-kaleidoscope';
68
+ import { bindKaleidoscope } from 'react-native-webrtc-kaleidoscope';
69
+ import { presets } from './kaleidoscope.preset-book';
60
70
 
61
- applyVideoEffects(localCameraTrack.mediaStreamTrack, ['blur']);
71
+ const { kaleidoscope } = bindKaleidoscope(localCameraTrack.mediaStreamTrack, { presets });
72
+ kaleidoscope('blur-soft');
62
73
  ```
63
74
 
64
75
  **Web wiring.** On web, LiveKit owns the `RTCRtpSender`, so you cannot swap the track yourself; go through LiveKit's processor API instead. The opt-in `/livekit` subpath ships a ready-made processor (it needs `livekit-client`, which a LiveKit app already has):
@@ -69,7 +80,7 @@ import { KaleidoscopeProcessor } from 'react-native-webrtc-kaleidoscope/livekit'
69
80
  await localVideoTrack.setProcessor(new KaleidoscopeProcessor(['blur']), true);
70
81
  ```
71
82
 
72
- The second argument shows the processed stream in your local preview. The processor tears down its Insertable-Streams pipeline on camera flip (`restart`) and unpublish (`destroy`), so repeated flips do not leak generators.
83
+ The `true` second argument to `setProcessor` shows the processed stream in your local preview. The processor tears down its Insertable-Streams pipeline on camera flip (`restart`) and unpublish (`destroy`), so repeated flips do not leak generators.
73
84
 
74
85
  ## Configure
75
86
 
@@ -93,49 +104,181 @@ bunx expo prebuild
93
104
 
94
105
  ## Use
95
106
 
107
+ First declare a **preset book** in your project: a flat catalog of **composites**, the only things you can command. A composite is `{ name, taxonomy, thumbnail?, layers }`, where `taxonomy` is the picker's grouping path, root first (`[group]` or `[group, category]`, e.g. `['Backgrounds', 'Office']`); everything is a layer stack, painted back to front. A layer is `{ id, shader, target?, blend? }` plus the shader's fields: `image` takes a `source`; `direct` samples the ingest-normalized (upright, non-mirrored) camera frame for its target (`target: 'subject'` is the masked person, `target: 'background'` the full frame); `blur` and the generative shaders (`plasma`, `clouds`, …) take `uniforms`. `target` defaults to `'background'` (fullscreen); `'subject'` stencils to the segmented person. Each layer's `id` is unique within its composite. Declare the book `as const satisfies PresetBook` for per-layer typing.
108
+
109
+ ```ts
110
+ // kaleidoscope.preset-book.ts
111
+ import type { PresetBook } from 'react-native-webrtc-kaleidoscope';
112
+ import { officeDark } from 'react-native-webrtc-kaleidoscope/images/office/office-dark';
113
+ // Packaged composites ship ready to use; import and spread them in.
114
+ import { wizardTower } from 'react-native-webrtc-kaleidoscope/composites/wizard-tower';
115
+
116
+ export const presets = {
117
+ // Replace your background with an image, you composited over it.
118
+ 'office-dark': {
119
+ name: 'Dark Office',
120
+ taxonomy: ['Backgrounds', 'Office'],
121
+ thumbnail: officeDark,
122
+ layers: [
123
+ { id: 'office-dark', shader: 'image', source: officeDark },
124
+ { id: 'you', shader: 'direct', target: 'subject' },
125
+ ],
126
+ },
127
+ // Blur the background, stay sharp.
128
+ 'blur-heavy': {
129
+ name: 'Heavy',
130
+ taxonomy: ['Effects', 'Blur'],
131
+ layers: [
132
+ { id: 'bg', shader: 'blur', target: 'background', uniforms: { sigma: 7 } },
133
+ { id: 'you', shader: 'direct', target: 'subject' },
134
+ ],
135
+ },
136
+ // A packaged multi-layer composite (clouds + a cut-out image + you).
137
+ 'wizard-tower': wizardTower,
138
+ } as const satisfies PresetBook;
139
+ ```
140
+
141
+ Then bind a track once and drive it with the three verbs:
142
+
96
143
  ```ts
97
144
  import { mediaDevices } from 'react-native-webrtc';
98
- import {
99
- applyVideoEffects,
100
- setBlurSigma,
101
- setMaskHardness,
102
- setMaskThreshold,
103
- } from 'react-native-webrtc-kaleidoscope';
145
+ import { bindKaleidoscope } from 'react-native-webrtc-kaleidoscope';
146
+ import { presets } from './kaleidoscope.preset-book';
104
147
 
105
148
  const stream = await mediaDevices.getUserMedia({ video: true });
106
149
  const [track] = stream.getVideoTracks();
107
150
 
108
- applyVideoEffects(track, ['mirror']);
109
- applyVideoEffects(track, ['blur']);
110
- applyVideoEffects(track, [{ name: 'background-image', source: 'office-1' }]);
111
- applyVideoEffects(track, []); // clear all effects
151
+ const { kaleidoscope, transform, mask } = bindKaleidoscope(track, {
152
+ presets,
153
+ // Web rebuilds the pipeline per command and yields a NEW track; read it here
154
+ // (attach to <video> or replaceTrack). Native mutates the bound track in place.
155
+ onTrack: (out) => {
156
+ /* setPreviewTrack(out) */
157
+ },
158
+ });
159
+
160
+ // kaleidoscope, the art axis. Pass a preset id (autocompletes from your book):
161
+ kaleidoscope('wizard-tower');
162
+ // Override a layer's uniforms live, addressed by layer id, while the patched
163
+ // preset is active (merged, no pipeline rebuild). `shader` types the uniforms:
164
+ kaleidoscope('blur-heavy', [{ id: 'bg', shader: 'blur', uniforms: { sigma: 5 } }]);
165
+ kaleidoscope(null); // clear the art
166
+
167
+ // transform, absolute geometry. Every call is the full state from identity;
168
+ // re-pass what you want to keep. rotate snaps to the nearest 90°.
169
+ transform({ flip: { x: true }, rotate: 90 });
170
+ transform(); // reset to identity
171
+
172
+ // mask, the segmentation edge shared by every art effect. Both required, 0..1.
173
+ mask({ hardness: 0.5, threshold: 0.5 });
174
+ ```
175
+
176
+ That is the whole runtime surface: `kaleidoscope`, `transform`, `mask`.
177
+
178
+ Numeric shader uniforms are normalized 0..1 by convention where practical; JSDoc documents each option's expected range as an IntelliSense hint (ranges are not enforced at runtime; validate in your own layer if you forward them to end users).
179
+
180
+ **Tuning note:** all three platforms run MediaPipe selfie segmentation (Tasks Image Segmenter on native, the Selfie Segmentation Solution on web), so the mask edge that suits one may differ slightly from another. `mask({ hardness, threshold })` defaults to `0.5 / 0.5`; nudge it to match your camera and lighting.
112
181
 
113
- // Runtime tuning (effects pick up the new values on the next frame):
114
- setBlurSigma(25); // Gaussian σ; clamped to [0.5, 64], default 8.
115
- setMaskHardness(0.2); // smoothstep transition width; clamped to [0, 1]. 0 = soft halo, 1 = near-step. Default 0.5.
116
- setMaskThreshold(0.7); // smoothstep center; clamped to [0.05, 0.95]. Higher rejects low-confidence pixels. Default 0.5.
182
+ ## Drop-in UI (optional)
183
+
184
+ Build your own controls against the three verbs, or import a ready-made, headless picker from `react-native-webrtc-kaleidoscope/preset-book-menu` that reads your preset book directly:
185
+
186
+ ```tsx
187
+ import { useEffect, useState } from 'react';
188
+ import { PresetBookMenu } from 'react-native-webrtc-kaleidoscope/preset-book-menu';
189
+ import { presets } from './kaleidoscope.preset-book';
190
+
191
+ // `kaleidoscope` is the verb returned by bindKaleidoscope(track, { presets }).
192
+ function BackgroundControls({ kaleidoscope }) {
193
+ const [art, setArt] = useState<keyof typeof presets | null>(null);
194
+ useEffect(() => {
195
+ if (art) kaleidoscope(art);
196
+ else kaleidoscope(null);
197
+ }, [art, kaleidoscope]);
198
+
199
+ return <PresetBookMenu presets={presets} value={art} onSelect={setArt} />;
200
+ }
117
201
  ```
118
202
 
119
- Effects chain in array order.
203
+ `PresetBookMenu` is a two-level browser driven by each composite's `taxonomy`: a tab row across the top, one tab per **group** (`taxonomy[0]`, e.g. Effects, Worlds, Backgrounds, Shaders), and a left-hand menu of **categories** (`taxonomy[1]`) under the active group; the tile grid is filtered by both. A flat (depth-1) group shows no category menu. Every preset renders as a uniform tile: a wallpaper when the composite has a `thumbnail`, a recessed button of the same footprint when it does not, so a thumbnail-less preset never breaks the grid. The same pieces are exported as standalone primitives (`PresetGrid`, `PresetTile`, plus the `usePresetBookMenu` hook and `PresetBookMenuLayout`), so you can lay out your own. Selection is controlled (`value` + `onSelect(id)`, narrowed to your book's keys); the components are presentational: they emit the selected id, you apply it via `kaleidoscope`.
120
204
 
121
- **Tuning note:** optimal values are platform-specific because each segmentation model (MediaPipe on web, MLKit on Android, Vision when iOS lands) produces a different confidence distribution. Working defaults on a typical well-lit scene:
205
+ **Styling, three tiers.** Sensible defaults out of the box; override with an RN `style` prop, a `className` prop, or a `renderTile` render-prop slot for full control.
122
206
 
123
- | Platform | Blur sigma | Mask hardness | Mask threshold |
124
- |---|---|---|---|
125
- | Web (MediaPipe) | 25 | 0.2 | 0.85 |
126
- | Android (MLKit) | 30 | 0.2 | 0.6 |
207
+ **NativeWind-ready.** The components accept `className`. To turn it on, import the opt-in registration once in your NativeWind interop setup (`nativewind` is an optional peer dependency; the core `./preset-book-menu` import never pulls it in):
127
208
 
128
- The library ships neutral defaults (8, 0.5, 0.5) and consumers tune at runtime via the API above; whether to ship the dialed-in values as platform-specific defaults is an open question waiting on iOS data.
209
+ ```ts
210
+ import { registerKaleidoscopeNativeWind } from 'react-native-webrtc-kaleidoscope/nativewind';
211
+ registerKaleidoscopeNativeWind();
212
+ ```
213
+
214
+ ### Live controls (the editor)
215
+
216
+ For a tuning or admin panel, `react-native-webrtc-kaleidoscope/preset-control-panel` ships a headless editor that reads the active preset and renders a control per tunable uniform, plus the mask and transform panels:
217
+
218
+ ```tsx
219
+ import {
220
+ KaleidoscopeThemeProvider,
221
+ PresetControlPanel,
222
+ MaskControlPanel,
223
+ TransformControlPanel,
224
+ } from 'react-native-webrtc-kaleidoscope/preset-control-panel';
225
+
226
+ // `controls` is the object from bindKaleidoscope(track, { presets }).
227
+ <KaleidoscopeThemeProvider>
228
+ <PresetControlPanel presets={presets} value={art} onPatch={(p) => controls.kaleidoscope(art, [p])} />
229
+ <MaskControlPanel hardness={h} threshold={t} onChange={setMask} />
230
+ <TransformControlPanel flip={flip} rotate={rotate} onChange={setTransform} />
231
+ </KaleidoscopeThemeProvider>
232
+ ```
233
+
234
+ Each preset supplies its editor as a `controls` component on the book entry. The packaged composites export theirs at `react-native-webrtc-kaleidoscope/composites/<name>/controls`; for your own presets, compose `CompositeLayerControlPanel` over a shader's control descriptor (or `makeControls` for a custom widget). See [catalog/shaders/README.md](./catalog/shaders/README.md).
235
+
236
+ Like the picker, the editor is controlled and presentational: it emits patches and you apply them. `KaleidoscopeThemeProvider` themes every control at once (a slot bank; `style` works everywhere, `className` via the same opt-in NativeWind interop). The sliders need `@react-native-community/slider` (an optional peer; a native module, so installing it needs a dev-client rebuild).
237
+
238
+ Live per-layer tuning runs on web today; on native the editor renders but the live per-layer uniform channel is in progress. Mask and transform are live on every platform.
239
+
240
+ ## Worlds
241
+
242
+ Packaged composites: a multi-layer stack (a generative shader or a cut-out image, the masked person on top), imported and spread into your book (e.g. `import { wizardTower } from 'react-native-webrtc-kaleidoscope/composites/wizard-tower'`). They carry their own `taxonomy: ['Worlds', <group>]`, so the menu groups them under the Worlds tab.
243
+
244
+ | Wizard Tower | Observation Deck | Fairy Cave |
245
+ |---|---|---|
246
+ | <img src="composites/wizard-tower/wizard-tower.thumb.webp" width="220" alt="wizard-tower" /> | <img src="composites/observation-deck/observation-deck.thumb.webp" width="220" alt="observation-deck" /> | <img src="composites/fairy-cave/fairy-cave.thumb.webp" width="220" alt="fairy-cave" /> |
247
+ | Underwater | Nebula | Simianlights |
248
+ | <img src="composites/underwater/underwater.thumb.webp" width="220" alt="underwater" /> | <img src="composites/nebula/nebula.thumb.webp" width="220" alt="nebula" /> | <img src="composites/simianlights/simianlights.thumb.webp" width="220" alt="simianlights" /> |
249
+ | Corporate Blobs | | |
250
+ | <img src="composites/corporate-blobs/corporate-blobs.thumb.webp" width="220" alt="corporate-blobs" /> | | |
251
+
252
+ The `clouds` (Sky) composite also ships; its preview tile is pending.
253
+
254
+ ## Background presets
255
+
256
+ The bundled backgrounds ship as `image` layers, filed by category and imported per image (e.g. `import { officeDark } from 'react-native-webrtc-kaleidoscope/images/office/office-dark'`). On web an image can also be any image URL or data URI; native resolves bundled image ids only.
257
+
258
+ | Category | Light | Dark |
259
+ |---|---|---|
260
+ | Office | <img src="images/office/office-light.thumb.webp" width="220" alt="office-light" /> | <img src="images/office/office-dark.thumb.webp" width="220" alt="office-dark" /> |
261
+ | Home | <img src="images/home/home-light.thumb.webp" width="220" alt="home-light" /> | <img src="images/home/home-dark.thumb.webp" width="220" alt="home-dark" /> |
262
+ | Nature | <img src="images/nature/landscape-light.thumb.webp" width="220" alt="landscape-light" /> | <img src="images/nature/landscape-dark.thumb.webp" width="220" alt="landscape-dark" /> |
263
+ | Sci-Fi | <img src="images/sci-fi/sci-fi-light.thumb.webp" width="220" alt="sci-fi-light" /> | |
264
+ | Underwater | | <img src="images/underwater/oceanscape-dark.thumb.webp" width="220" alt="oceanscape-dark" /> |
265
+ | Simiancraft | <img src="images/simiancraft/simiancraft-light.thumb.webp" width="220" alt="simiancraft-light" /> | <img src="images/simiancraft/simiancraft-dark.thumb.webp" width="220" alt="simiancraft-dark" /> |
266
+
267
+ The `simiancraft` category also ships two transparent brand images, `simiancraft-light-transparency` and `simiancraft-dark-transparency` (alpha preserved). Plus **`debug-resolutions`**, a viewport/resolution calibration grid for verifying background cover-fit:
268
+
269
+ <img src="images/debug/debug-resolutions.thumb.webp" width="220" alt="debug-resolutions" />
270
+
271
+ See [`catalog/images/README.md`](./catalog/images/README.md) for the folder layout, the two image formats, and how to add one.
129
272
 
130
273
  ## Web and native differences
131
274
 
132
275
  The API surface is the same across platforms, but the runtimes differ in ways worth knowing before you wire effects in:
133
276
 
134
- - **Effect parameters.** Web reads tuning from the global setters (`setBlurSigma`, `setMaskHardness`, `setMaskThreshold`) on the next frame. Native currently ignores per-call `EffectSpec` parameters such as `{ name: 'blur', sigma: 12 }`; tuning is global through the same setters. Per-call uniforms through the native registry are a follow-up.
135
- - **Background source.** `background-image.source` is a bundled preset name on native (the upstream `_setVideoEffects` registry is keyed by flat strings, not URIs), but on web it accepts either a preset name or an arbitrary image URL or data URI.
136
- - **Background presets ship as tree-shakeable files.** Two example backgrounds (`office-1`, `office-2`) are importable per preset: `import { office1 } from 'react-native-webrtc-kaleidoscope/backgrounds/office-1'`. Each preset is its own file behind its own subpath export, and the package sets `sideEffects: false`, so an unused preset is dropped by web bundlers — and, since Metro doesn't tree-shake, simply never imported on native. Web resolves the bundled WebP to a URL; native loads its own bundled copy by name. Web also still accepts an arbitrary image URL or data URI. See [`src/backgrounds/README.md`](./src/backgrounds/README.md).
137
- - **Segmentation model on web.** The web blur and background-image effects load MediaPipe Selfie Segmentation from the jsdelivr CDN (`cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation`) on first use. A strict Content-Security-Policy must allow that origin for `script-src`, `connect-src`, and the WASM fetch, and the effects do not work offline. Mirror needs no model.
138
- - **Browser support on web.** Effects use Insertable Streams (`MediaStreamTrackProcessor` and `MediaStreamTrackGenerator`), which ship in Chromium-based browsers; Safari and Firefox throw a typed capability error.
277
+ - **Output track.** On web each `kaleidoscope`/`transform` command rebuilds the Insertable-Streams pipeline and yields a NEW `MediaStreamTrack`, surfaced via `onTrack`; on native the bound track is mutated in place. `mask` updates the segmentation edge the running composite reads each frame, with no rebuild on either platform.
278
+ - **Image source.** An `image` layer's `source` is a bundled preset name on native (the upstream `_setVideoEffects` registry is keyed by flat strings, not URIs), but on web it accepts either a preset name or an arbitrary image URL or data URI.
279
+ - **Background presets ship as tree-shakeable files.** The bundled backgrounds (see [Background presets](#background-presets)) are importable per image: `import { officeDark } from 'react-native-webrtc-kaleidoscope/images/office/office-dark'`. Each image is its own file behind its own subpath export, and the package sets `sideEffects: false`, so an unused preset is dropped by web bundlers; since Metro doesn't tree-shake, it is simply never imported on native. Web resolves the bundled WebP to a URL; native loads its own bundled copy by name. Web also still accepts an arbitrary image URL or data URI. See [`catalog/images/README.md`](./catalog/images/README.md).
280
+ - **Segmentation model on web.** The web compositor loads MediaPipe Selfie Segmentation from the jsdelivr CDN (`cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation`) on first use. A strict Content-Security-Policy must allow that origin for `script-src`, `connect-src`, and the WASM fetch, and the effects do not work offline. The `transform` ops need no model.
281
+ - **Browser support on web.** Effects use Insertable Streams (`MediaStreamTrackProcessor` and `MediaStreamTrackGenerator`), which ship in Chromium-based browsers (Chrome, Edge); Safari and Firefox lack the API, so the effects throw a clear capability error and the demo falls back to the unprocessed track.
139
282
 
140
283
  ## What this isn't
141
284
 
@@ -146,14 +289,20 @@ The API surface is the same across platforms, but the runtimes differ in ways wo
146
289
 
147
290
  ## Architecture
148
291
 
149
- The codebase lives across four surfaces:
292
+ The canonical assets live in three root, folder-per-item directories, out of the TypeScript build path; the build and the prebuild copy read from them:
293
+
294
+ - `catalog/shaders/<name>/`: each shader's `.frag` plus its typed `.ts` (uniforms + control descriptor). All shaders share one vertex stage, `catalog/shaders/_shared/passthrough.vert`; there is no per-shader `.vert`. `catalog/shaders/_shared/` also holds the per-layer composite frags (`composite-camera.frag`, `composite-image.frag`, `composite-subject.frag`, `composite-masked.frag`, `composite-blit.frag`) and `transform.frag`. `bun run build:shaders` codegens the web and Android sources and transpiles the iOS Metal from these. See [catalog/shaders/README.md](./catalog/shaders/README.md) to add or extend a shader.
295
+ - `catalog/images/<category>/`: images filed by category, several per folder. Each image is a quad: `<leaf>.webp`, its `<leaf>.thumb.webp`, and the `<leaf>.ts` / `<leaf>.web.ts` loader pair, behind a `./images/<category>/<leaf>` subpath export.
296
+ - `catalog/composites/<name>/`: each packaged composite (a `KaleidoscopePreset`), behind a `./composites/<name>` subpath export.
297
+
298
+ The code lives across the platform surfaces:
150
299
 
151
- - `src/` JS facade and shared types. `applyVideoEffects(track, effects)` plus runtime tuning setters.
152
- - `src/web/` WebGL2 pipeline. MediaPipe segmentation + GLSL composite. One shader file per stage in `src/web/shaders.ts`.
153
- - `android/` OpenGL ES 3.0 pipeline. MLKit segmentation (async, worker-thread, last-known-mask cache) + GLSL composite. Shaders inline in `gpu/Shaders.kt` as `const val` strings.
154
- - `ios/` Metal pipeline (Swift) with Vision person segmentation. The canonical GLSL in `shaders/` transpiles to Metal Shading Language via `scripts/build-shaders.ts`. Implemented and verified on device.
300
+ - `src/`: JS facade and shared types. `bindKaleidoscope` returns the `kaleidoscope` / `transform` / `mask` verbs; the preset-book types live in `src/kaleidoscope/`.
301
+ - `web-driver/`: WebGL2 pipeline. MediaPipe segmentation + the layered compositor (`web-driver/effects/composite.ts`).
302
+ - `android/`: OpenGL ES 3.0 pipeline. MediaPipe Tasks segmentation + the layered compositor (`effects/CompositeFactory.kt`); codegen lands in `gpu/ShadersGenerated.kt`, the hand-written layer GLSL in `effects/LayerShaders.kt`.
303
+ - `ios/`: Metal pipeline (Swift) with MediaPipe Tasks segmentation (`selfie_segmenter.tflite`, the same model Android bundles); the canonical GLSL transpiles to Metal via `scripts/build-shaders.ts`.
155
304
 
156
- The composite shader (`shaders/composite.frag`) is the same GLSL source for every effect category (blur, background-image, future procedural backgrounds). Per-effect difference is upstream of the composite: how the `uBackground` texture gets produced.
305
+ Every effect is a LAYER in one compositor: an `image` image, a `direct` passthrough (the masked person, or the raw camera), a camera-sampling `blur`, or a generative shader, composited back to front with per-layer blend. There is one registered native effect, `composite`; its layer stack is delivered out of band and reconciled each command.
157
306
 
158
307
  See [`PATTERNS.md`](./PATTERNS.md) for the file-layout conventions, texture-orientation contract, and recipe for adding new effects, shaders, presets, or tunable parameters.
159
308
 
@@ -162,6 +311,7 @@ See [`PATTERNS.md`](./PATTERNS.md) for the file-layout conventions, texture-orie
162
311
  - [CONTRIBUTING.md](./CONTRIBUTING.md): setup, scripts, commit conventions.
163
312
  - [AGENTS.md](./AGENTS.md): agent and contributor orientation.
164
313
  - [PATTERNS.md](./PATTERNS.md): codebase conventions and how-to-extend.
314
+ - [catalog/shaders/README.md](./catalog/shaders/README.md): adding and extending shaders.
165
315
  - [SECURITY.md](./SECURITY.md): security policy and reporting.
166
316
  - [NOTICE.md](./NOTICE.md): third-party attributions.
167
317
  - Sibling projects: [chromonym](https://github.com/simiancraft/chromonym) and [unitforge](https://github.com/simiancraft/unitforge); same OSS-hygiene template.
@@ -31,6 +31,14 @@ android {
31
31
  kotlinOptions {
32
32
  jvmTarget = '17'
33
33
  }
34
+
35
+ // JVM unit tests (testDebugUnitTest) for pure-logic units like the composite
36
+ // layer-stack parser. returnDefaultValues makes android.util.Log a no-op stub
37
+ // instead of throwing; the real org.json on the test classpath (below) shadows
38
+ // the stubbed android.jar one so JSON parsing actually runs.
39
+ testOptions {
40
+ unitTests.returnDefaultValues = true
41
+ }
34
42
  }
35
43
 
36
44
  dependencies {
@@ -55,10 +63,14 @@ dependencies {
55
63
  }
56
64
  compileOnly project(rnWebrtcProject)
57
65
 
58
- // Person/background mask for the blur effect. The Google artifact ID is
59
- // `segmentation-selfie`, not `selfie-segmentation` (the plan and earlier
60
- // notes had it inverted; that is why the pin would not resolve).
61
- implementation 'com.google.mlkit:segmentation-selfie:16.0.0-beta6'
66
+ // Person/background mask: MediaPipe Tasks ImageSegmenter (Mask.kt), the same
67
+ // model family the web and iOS sides run.
68
+ implementation 'com.google.mediapipe:tasks-vision:0.10.14'
69
+
70
+ // Unit tests (JVM, testDebugUnitTest). The real org.json shadows the stubbed
71
+ // android.jar copy so CompositeLayers' JSONArray/JSONObject parsing runs for real.
72
+ testImplementation 'junit:junit:4.13.2'
73
+ testImplementation 'org.json:json:20231013'
62
74
  }
63
75
 
64
76
  // Helper: gracefully read root project ext properties with a default.
@@ -0,0 +1,127 @@
1
+ // Composite-layer spec side-channel for the native composite compositor.
2
+ //
3
+ // The Expo Module's setCompositeLayers(json) JS function writes here; the
4
+ // CompositeFactory reads the current layer stack each frame and composites it.
5
+ // This delivers the spec without re-registering: it carries the whole ordered
6
+ // layer stack (the composite is one registered effect name, "composite", whose
7
+ // contents JS swaps as the active composite changes).
8
+ //
9
+ // The wire shape is a JSON array of layer objects (see parse()). JS sends it as a
10
+ // String across the Expo bridge; we parse it once at set() time into immutable
11
+ // Kotlin models the GL thread can read without locking. @Volatile on the parsed
12
+ // reference is the memory barrier; the JS-thread write publishes, the GL-thread
13
+ // read observes the latest stable snapshot.
14
+ //
15
+ // A malformed layer is skipped with a log rather than crashing the render thread;
16
+ // an unparseable whole payload leaves the previous composite in place.
17
+
18
+ package com.simiancraft.kaleidoscope
19
+
20
+ import android.util.Log
21
+ import org.json.JSONArray
22
+ import org.json.JSONObject
23
+
24
+ /** One parsed composite layer. The `shader` discriminant decides which fields matter. */
25
+ internal data class CompositeLayer(
26
+ val id: String, // unique within a composite; the live-tuning / patch address
27
+ val shader: String,
28
+ val target: String, // "background" | "subject"
29
+ val blend: String?, // "normal" | "additive" | null (base = opaque)
30
+ val source: String?, // image id for an `image` layer; null otherwise
31
+ val uniforms: Map<String, FloatArray>, // generative-layer uniforms, by name
32
+ )
33
+
34
+ internal object CompositeLayers {
35
+ private const val TAG = "Kaleidoscope.CompositeLayers"
36
+
37
+ @Volatile
38
+ private var layers: List<CompositeLayer> = emptyList()
39
+
40
+ /** The current parsed layer stack; a stable snapshot safe to read on the GL thread. */
41
+ fun get(): List<CompositeLayer> = layers
42
+
43
+ /**
44
+ * Parse and store the composite layer stack from the JS-supplied JSON string.
45
+ * Called on the Expo module thread (JS-driven), not the GL thread. Leaves the
46
+ * previous composite in place on a whole-payload parse failure.
47
+ */
48
+ fun set(json: String) {
49
+ val parsed =
50
+ try {
51
+ parse(json)
52
+ } catch (t: Throwable) {
53
+ Log.e(TAG, "failed to parse composite layers; keeping previous composite", t)
54
+ return
55
+ }
56
+ layers = parsed
57
+ Log.i(TAG, "composite layers set: ${parsed.size} layer(s) [${parsed.joinToString(",") { it.shader }}]")
58
+ }
59
+
60
+ /** Clear the active composite (used when a non-composite effect takes over). */
61
+ fun clear() {
62
+ layers = emptyList()
63
+ }
64
+
65
+ private fun parse(json: String): List<CompositeLayer> {
66
+ val arr = JSONArray(json)
67
+ val out = ArrayList<CompositeLayer>(arr.length())
68
+ for (i in 0 until arr.length()) {
69
+ val obj = arr.optJSONObject(i) ?: continue
70
+ val shader = obj.optString("shader", "")
71
+ if (shader.isEmpty()) {
72
+ Log.w(TAG, "layer $i has no shader; skipping")
73
+ continue
74
+ }
75
+ // `id` is always present on the wire now (serializeCompositeLayers emits it);
76
+ // fall back to the array index so a malformed payload missing it still
77
+ // yields a stable, unique-per-stack address rather than a collision.
78
+ val id = if (obj.has("id") && !obj.isNull("id")) obj.getString("id") else i.toString()
79
+ val target = obj.optString("target", "background")
80
+ val blend = if (obj.has("blend") && !obj.isNull("blend")) obj.getString("blend") else null
81
+ val source = if (obj.has("source") && !obj.isNull("source")) obj.getString("source") else null
82
+ val uniforms = parseUniforms(obj.optJSONObject("uniforms"))
83
+ out.add(CompositeLayer(id, shader, target, blend, source, uniforms))
84
+ }
85
+ return out
86
+ }
87
+
88
+ // name -> FloatArray. A JSON number -> [f]; a JSON array of numbers -> FloatArray.
89
+ // A non-numeric or malformed value is skipped with a log (the shader keeps its
90
+ // GLSL default for that name).
91
+ private fun parseUniforms(obj: JSONObject?): Map<String, FloatArray> {
92
+ if (obj == null) return emptyMap()
93
+ val out = HashMap<String, FloatArray>(obj.length())
94
+ val keys = obj.keys()
95
+ while (keys.hasNext()) {
96
+ val key = keys.next()
97
+ val value = obj.opt(key)
98
+ val floats = normalize(value)
99
+ if (floats == null) {
100
+ Log.w(TAG, "skipping uniform '$key': unsupported type ${value?.javaClass?.simpleName}")
101
+ continue
102
+ }
103
+ out[key] = floats
104
+ }
105
+ return out
106
+ }
107
+
108
+ private fun normalize(value: Any?): FloatArray? =
109
+ when (value) {
110
+ is Number -> floatArrayOf(value.toFloat())
111
+ is JSONArray -> {
112
+ val out = FloatArray(value.length())
113
+ var ok = true
114
+ for (i in 0 until value.length()) {
115
+ val n = value.opt(i)
116
+ if (n is Number) {
117
+ out[i] = n.toFloat()
118
+ } else {
119
+ ok = false
120
+ break
121
+ }
122
+ }
123
+ if (ok) out else null
124
+ }
125
+ else -> null
126
+ }
127
+ }