react-native-webrtc-kaleidoscope 2.0.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 (1185) hide show
  1. package/NOTICE.md +8 -8
  2. package/README.md +185 -56
  3. package/android/build.gradle +13 -0
  4. package/android/src/main/java/com/simiancraft/kaleidoscope/CompositeLayers.kt +127 -0
  5. package/android/src/main/java/com/simiancraft/kaleidoscope/EffectTuning.kt +69 -69
  6. package/android/src/main/java/com/simiancraft/kaleidoscope/KaleidoscopeModule.kt +86 -33
  7. package/android/src/main/java/com/simiancraft/kaleidoscope/Registration.kt +23 -64
  8. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/CompositeFactory.kt +691 -0
  9. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/LayerShaders.kt +30 -0
  10. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/TransformFactory.kt +248 -200
  11. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Egl.kt +82 -70
  12. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Fbo.kt +50 -47
  13. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/FramePipeline.kt +106 -105
  14. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlDebug.kt +23 -23
  15. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlProgram.kt +76 -57
  16. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Ingest.kt +92 -71
  17. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Orientation.kt +25 -25
  18. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Shaders.kt +57 -76
  19. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/ShadersGenerated.kt +1162 -25
  20. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/Mask.kt +254 -242
  21. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/MaskTuning.kt +28 -25
  22. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/SegmentationEngine.kt +104 -98
  23. package/android/src/test/java/com/simiancraft/kaleidoscope/CompositeLayersTest.kt +165 -0
  24. package/app.plugin.js +9 -255
  25. package/catalog/composites/clouds/clouds.controls.tsx +19 -0
  26. package/catalog/composites/clouds/clouds.ts +32 -0
  27. package/catalog/composites/corporate-blobs/corporate-blobs.controls.tsx +24 -0
  28. package/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  29. package/catalog/composites/corporate-blobs/corporate-blobs.ts +51 -0
  30. package/catalog/composites/corporate-blobs/corporate-blobs.web.ts +42 -0
  31. package/catalog/composites/fairy-cave/fairy-cave.controls.tsx +33 -0
  32. package/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  33. package/catalog/composites/fairy-cave/fairy-cave.ts +53 -0
  34. package/catalog/composites/fairy-cave/fairy-cave.web.ts +47 -0
  35. package/catalog/composites/fairy-grotto/fairy-grotto.controls.tsx +34 -0
  36. package/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  37. package/catalog/composites/fairy-grotto/fairy-grotto.ts +54 -0
  38. package/catalog/composites/fairy-grotto/fairy-grotto.web.ts +47 -0
  39. package/catalog/composites/fairy-hollow/fairy-hollow.controls.tsx +34 -0
  40. package/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  41. package/catalog/composites/fairy-hollow/fairy-hollow.ts +55 -0
  42. package/catalog/composites/fairy-hollow/fairy-hollow.web.ts +47 -0
  43. package/catalog/composites/nebula/nebula.controls.tsx +19 -0
  44. package/catalog/composites/nebula/nebula.thumb.webp +0 -0
  45. package/catalog/composites/nebula/nebula.ts +37 -0
  46. package/catalog/composites/nebula/nebula.web.ts +30 -0
  47. package/catalog/composites/observation-deck/observation-deck.controls.tsx +28 -0
  48. package/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  49. package/catalog/composites/observation-deck/observation-deck.ts +59 -0
  50. package/catalog/composites/observation-deck/observation-deck.web.ts +50 -0
  51. package/catalog/composites/simianlights/simianlights.controls.tsx +19 -0
  52. package/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  53. package/catalog/composites/simianlights/simianlights.ts +34 -0
  54. package/catalog/composites/simianlights/simianlights.web.ts +29 -0
  55. package/catalog/composites/underwater/underwater.controls.tsx +19 -0
  56. package/catalog/composites/underwater/underwater.thumb.webp +0 -0
  57. package/catalog/composites/underwater/underwater.ts +42 -0
  58. package/catalog/composites/underwater/underwater.web.ts +36 -0
  59. package/catalog/composites/wizard-tower/wizard-tower.controls.tsx +23 -0
  60. package/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  61. package/catalog/composites/wizard-tower/wizard-tower.ts +44 -0
  62. package/catalog/composites/wizard-tower/wizard-tower.web.ts +35 -0
  63. package/catalog/composites/wizard-tower-night/wizard-tower-night.controls.tsx +22 -0
  64. package/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  65. package/catalog/composites/wizard-tower-night/wizard-tower-night.ts +43 -0
  66. package/catalog/composites/wizard-tower-night/wizard-tower-night.web.ts +35 -0
  67. package/catalog/images/README.md +188 -0
  68. package/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  69. package/catalog/images/corporate/corporate-logo.ts +6 -0
  70. package/catalog/images/corporate/corporate-logo.web.ts +7 -0
  71. package/catalog/images/corporate/corporate-logo.webp +0 -0
  72. package/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  73. package/catalog/images/debug/debug-resolutions.ts +6 -0
  74. package/catalog/images/debug/debug-resolutions.web.ts +7 -0
  75. package/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  76. package/catalog/images/fairy-caves/grotto.ts +6 -0
  77. package/catalog/images/fairy-caves/grotto.web.ts +7 -0
  78. package/catalog/images/fairy-caves/grotto.webp +0 -0
  79. package/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  80. package/catalog/images/fairy-caves/hollow.ts +6 -0
  81. package/catalog/images/fairy-caves/hollow.web.ts +7 -0
  82. package/catalog/images/fairy-caves/hollow.webp +0 -0
  83. package/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  84. package/catalog/images/fairy-caves/treehouse-2.ts +6 -0
  85. package/catalog/images/fairy-caves/treehouse-2.web.ts +7 -0
  86. package/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  87. package/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  88. package/catalog/images/fairy-caves/treehouse-3.ts +6 -0
  89. package/catalog/images/fairy-caves/treehouse-3.web.ts +7 -0
  90. package/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  91. package/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  92. package/catalog/images/fairy-caves/treehouse.ts +6 -0
  93. package/catalog/images/fairy-caves/treehouse.web.ts +7 -0
  94. package/catalog/images/fairy-caves/treehouse.webp +0 -0
  95. package/catalog/images/home/home-dark.thumb.webp +0 -0
  96. package/catalog/images/home/home-dark.ts +6 -0
  97. package/catalog/images/home/home-dark.web.ts +7 -0
  98. package/catalog/images/home/home-light.thumb.webp +0 -0
  99. package/catalog/images/home/home-light.ts +6 -0
  100. package/catalog/images/home/home-light.web.ts +7 -0
  101. package/catalog/images/image-ids.ts +42 -0
  102. package/catalog/images/image.types.ts +5 -0
  103. package/catalog/images/index.ts +7 -0
  104. package/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  105. package/catalog/images/nature/landscape-dark.ts +6 -0
  106. package/catalog/images/nature/landscape-dark.web.ts +7 -0
  107. package/catalog/images/nature/landscape-light.thumb.webp +0 -0
  108. package/catalog/images/nature/landscape-light.ts +6 -0
  109. package/catalog/images/nature/landscape-light.web.ts +7 -0
  110. package/catalog/images/office/office-dark.thumb.webp +0 -0
  111. package/catalog/images/office/office-dark.ts +6 -0
  112. package/catalog/images/office/office-dark.web.ts +7 -0
  113. package/catalog/images/office/office-light.thumb.webp +0 -0
  114. package/catalog/images/office/office-light.ts +6 -0
  115. package/catalog/images/office/office-light.web.ts +7 -0
  116. package/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  117. package/catalog/images/sci-fi/sci-fi-light.ts +6 -0
  118. package/catalog/images/sci-fi/sci-fi-light.web.ts +7 -0
  119. package/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  120. package/catalog/images/simiancraft/simiancraft-dark-transparency.ts +6 -0
  121. package/catalog/images/simiancraft/simiancraft-dark-transparency.web.ts +9 -0
  122. package/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  123. package/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  124. package/catalog/images/simiancraft/simiancraft-dark.ts +6 -0
  125. package/catalog/images/simiancraft/simiancraft-dark.web.ts +7 -0
  126. package/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  127. package/catalog/images/simiancraft/simiancraft-light-transparency.ts +6 -0
  128. package/catalog/images/simiancraft/simiancraft-light-transparency.web.ts +9 -0
  129. package/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  130. package/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  131. package/catalog/images/simiancraft/simiancraft-light.ts +6 -0
  132. package/catalog/images/simiancraft/simiancraft-light.web.ts +7 -0
  133. package/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  134. package/catalog/images/spaceship/observation-deck.ts +6 -0
  135. package/catalog/images/spaceship/observation-deck.web.ts +7 -0
  136. package/catalog/images/spaceship/observation-deck.webp +0 -0
  137. package/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  138. package/catalog/images/underwater/oceanscape-dark.ts +6 -0
  139. package/catalog/images/underwater/oceanscape-dark.web.ts +7 -0
  140. package/catalog/images/underwater/oceanscape-dark.webp +0 -0
  141. package/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  142. package/catalog/images/wizard-tower/wizard-tower-1.ts +6 -0
  143. package/catalog/images/wizard-tower/wizard-tower-1.web.ts +7 -0
  144. package/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  145. package/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  146. package/catalog/images/wizard-tower/wizard-tower-2.ts +6 -0
  147. package/catalog/images/wizard-tower/wizard-tower-2.web.ts +7 -0
  148. package/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  149. package/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  150. package/catalog/images/wizard-tower/wizard-tower-night.ts +6 -0
  151. package/catalog/images/wizard-tower/wizard-tower-night.web.ts +7 -0
  152. package/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  153. package/catalog/shaders/README.md +114 -0
  154. package/catalog/shaders/_shared/composite-blit.frag +26 -0
  155. package/catalog/shaders/_shared/composite-camera.frag +17 -0
  156. package/catalog/shaders/_shared/composite-image.frag +23 -0
  157. package/catalog/shaders/_shared/composite-masked.frag +26 -0
  158. package/catalog/shaders/_shared/composite-subject.frag +27 -0
  159. package/catalog/shaders/_shared/passthrough.vert +27 -0
  160. package/catalog/shaders/_shared/transform.frag +27 -0
  161. package/catalog/shaders/_shared/types.ts +63 -0
  162. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.tsx +37 -0
  163. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.frag +123 -0
  164. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.ts +106 -0
  165. package/catalog/shaders/blur/blur.form.tsx +29 -0
  166. package/catalog/shaders/blur/blur.ts +32 -0
  167. package/catalog/shaders/blur/composite-blur.frag +42 -0
  168. package/catalog/shaders/clouds/clouds.form.tsx +39 -0
  169. package/catalog/shaders/clouds/clouds.frag +128 -0
  170. package/catalog/shaders/clouds/clouds.presets.md +37 -0
  171. package/catalog/shaders/clouds/clouds.ts +124 -0
  172. package/catalog/shaders/corporate-blobs/corporate-blobs.form.tsx +44 -0
  173. package/catalog/shaders/corporate-blobs/corporate-blobs.frag +224 -0
  174. package/catalog/shaders/corporate-blobs/corporate-blobs.ts +136 -0
  175. package/catalog/shaders/fireflies/fireflies.form.tsx +33 -0
  176. package/catalog/shaders/fireflies/fireflies.frag +68 -0
  177. package/catalog/shaders/fireflies/fireflies.ts +61 -0
  178. package/catalog/shaders/godrays/godrays.form.tsx +37 -0
  179. package/catalog/shaders/godrays/godrays.frag +85 -0
  180. package/catalog/shaders/godrays/godrays.ts +105 -0
  181. package/catalog/shaders/index.ts +78 -0
  182. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.tsx +55 -0
  183. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.frag +262 -0
  184. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.ts +137 -0
  185. package/catalog/shaders/nebula/nebula.form.tsx +34 -0
  186. package/catalog/shaders/nebula/nebula.frag +151 -0
  187. package/catalog/shaders/nebula/nebula.ts +74 -0
  188. package/catalog/shaders/plasma/plasma.form.tsx +32 -0
  189. package/catalog/shaders/plasma/plasma.frag +55 -0
  190. package/catalog/shaders/plasma/plasma.ts +44 -0
  191. package/catalog/shaders/simianlights/simianlights.form.tsx +34 -0
  192. package/catalog/shaders/simianlights/simianlights.frag +151 -0
  193. package/catalog/shaders/simianlights/simianlights.ts +73 -0
  194. package/dist/catalog/composites/clouds/clouds.controls.d.ts +3 -0
  195. package/dist/catalog/composites/clouds/clouds.controls.d.ts.map +1 -0
  196. package/dist/catalog/composites/clouds/clouds.controls.js +11 -0
  197. package/dist/catalog/composites/clouds/clouds.controls.js.map +1 -0
  198. package/dist/catalog/composites/clouds/clouds.d.ts +26 -0
  199. package/dist/catalog/composites/clouds/clouds.d.ts.map +1 -0
  200. package/dist/catalog/composites/clouds/clouds.js +33 -0
  201. package/dist/catalog/composites/clouds/clouds.js.map +1 -0
  202. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts +3 -0
  203. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts.map +1 -0
  204. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js +13 -0
  205. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js.map +1 -0
  206. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts +37 -0
  207. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  208. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js +52 -0
  209. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js.map +1 -0
  210. package/dist/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  211. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts +37 -0
  212. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts.map +1 -0
  213. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js +46 -0
  214. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js.map +1 -0
  215. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts +3 -0
  216. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts.map +1 -0
  217. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js +13 -0
  218. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js.map +1 -0
  219. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts +42 -0
  220. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts.map +1 -0
  221. package/dist/catalog/composites/fairy-cave/fairy-cave.js +54 -0
  222. package/dist/catalog/composites/fairy-cave/fairy-cave.js.map +1 -0
  223. package/dist/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  224. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts +42 -0
  225. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts.map +1 -0
  226. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js +51 -0
  227. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js.map +1 -0
  228. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts +3 -0
  229. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts.map +1 -0
  230. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js +14 -0
  231. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js.map +1 -0
  232. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts +42 -0
  233. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts.map +1 -0
  234. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js +55 -0
  235. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js.map +1 -0
  236. package/dist/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  237. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts +42 -0
  238. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts.map +1 -0
  239. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js +51 -0
  240. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js.map +1 -0
  241. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts +3 -0
  242. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts.map +1 -0
  243. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js +14 -0
  244. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js.map +1 -0
  245. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts +42 -0
  246. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts.map +1 -0
  247. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js +56 -0
  248. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js.map +1 -0
  249. package/dist/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  250. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts +42 -0
  251. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts.map +1 -0
  252. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js +51 -0
  253. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js.map +1 -0
  254. package/dist/catalog/composites/nebula/nebula.controls.d.ts +3 -0
  255. package/dist/catalog/composites/nebula/nebula.controls.d.ts.map +1 -0
  256. package/dist/catalog/composites/nebula/nebula.controls.js +11 -0
  257. package/dist/catalog/composites/nebula/nebula.controls.js.map +1 -0
  258. package/dist/catalog/composites/nebula/nebula.d.ts +22 -0
  259. package/dist/catalog/composites/nebula/nebula.d.ts.map +1 -0
  260. package/dist/catalog/composites/nebula/nebula.js +38 -0
  261. package/dist/catalog/composites/nebula/nebula.js.map +1 -0
  262. package/dist/catalog/composites/nebula/nebula.thumb.webp +0 -0
  263. package/dist/catalog/composites/nebula/nebula.web.d.ts +22 -0
  264. package/dist/catalog/composites/nebula/nebula.web.d.ts.map +1 -0
  265. package/dist/catalog/composites/nebula/nebula.web.js +34 -0
  266. package/dist/catalog/composites/nebula/nebula.web.js.map +1 -0
  267. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts +3 -0
  268. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts.map +1 -0
  269. package/dist/catalog/composites/observation-deck/observation-deck.controls.js +13 -0
  270. package/dist/catalog/composites/observation-deck/observation-deck.controls.js.map +1 -0
  271. package/dist/catalog/composites/observation-deck/observation-deck.d.ts +41 -0
  272. package/dist/catalog/composites/observation-deck/observation-deck.d.ts.map +1 -0
  273. package/dist/catalog/composites/observation-deck/observation-deck.js +60 -0
  274. package/dist/catalog/composites/observation-deck/observation-deck.js.map +1 -0
  275. package/dist/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  276. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts +41 -0
  277. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts.map +1 -0
  278. package/dist/catalog/composites/observation-deck/observation-deck.web.js +54 -0
  279. package/dist/catalog/composites/observation-deck/observation-deck.web.js.map +1 -0
  280. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts +3 -0
  281. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts.map +1 -0
  282. package/dist/catalog/composites/simianlights/simianlights.controls.js +11 -0
  283. package/dist/catalog/composites/simianlights/simianlights.controls.js.map +1 -0
  284. package/dist/catalog/composites/simianlights/simianlights.d.ts +22 -0
  285. package/dist/catalog/composites/simianlights/simianlights.d.ts.map +1 -0
  286. package/dist/catalog/composites/simianlights/simianlights.js +30 -0
  287. package/dist/catalog/composites/simianlights/simianlights.js.map +1 -0
  288. package/dist/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  289. package/dist/catalog/composites/simianlights/simianlights.web.d.ts +22 -0
  290. package/dist/catalog/composites/simianlights/simianlights.web.d.ts.map +1 -0
  291. package/dist/catalog/composites/simianlights/simianlights.web.js +33 -0
  292. package/dist/catalog/composites/simianlights/simianlights.web.js.map +1 -0
  293. package/dist/catalog/composites/underwater/underwater.controls.d.ts +3 -0
  294. package/dist/catalog/composites/underwater/underwater.controls.d.ts.map +1 -0
  295. package/dist/catalog/composites/underwater/underwater.controls.js +11 -0
  296. package/dist/catalog/composites/underwater/underwater.controls.js.map +1 -0
  297. package/dist/catalog/composites/underwater/underwater.d.ts +30 -0
  298. package/dist/catalog/composites/underwater/underwater.d.ts.map +1 -0
  299. package/dist/catalog/composites/underwater/underwater.js +43 -0
  300. package/dist/catalog/composites/underwater/underwater.js.map +1 -0
  301. package/dist/catalog/composites/underwater/underwater.thumb.webp +0 -0
  302. package/dist/catalog/composites/underwater/underwater.web.d.ts +30 -0
  303. package/dist/catalog/composites/underwater/underwater.web.d.ts.map +1 -0
  304. package/dist/catalog/composites/underwater/underwater.web.js +40 -0
  305. package/dist/catalog/composites/underwater/underwater.web.js.map +1 -0
  306. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts +3 -0
  307. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts.map +1 -0
  308. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js +15 -0
  309. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js.map +1 -0
  310. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts +31 -0
  311. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts.map +1 -0
  312. package/dist/catalog/composites/wizard-tower/wizard-tower.js +45 -0
  313. package/dist/catalog/composites/wizard-tower/wizard-tower.js.map +1 -0
  314. package/dist/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  315. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts +31 -0
  316. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts.map +1 -0
  317. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js +39 -0
  318. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js.map +1 -0
  319. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts +3 -0
  320. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts.map +1 -0
  321. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js +14 -0
  322. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js.map +1 -0
  323. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts +31 -0
  324. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts.map +1 -0
  325. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js +44 -0
  326. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js.map +1 -0
  327. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  328. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts +31 -0
  329. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts.map +1 -0
  330. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js +39 -0
  331. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js.map +1 -0
  332. package/dist/catalog/images/corporate/corporate-logo.d.ts +3 -0
  333. package/dist/catalog/images/corporate/corporate-logo.d.ts.map +1 -0
  334. package/dist/catalog/images/corporate/corporate-logo.js +8 -0
  335. package/dist/catalog/images/corporate/corporate-logo.js.map +1 -0
  336. package/dist/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  337. package/dist/catalog/images/corporate/corporate-logo.web.d.ts +3 -0
  338. package/dist/catalog/images/corporate/corporate-logo.web.d.ts.map +1 -0
  339. package/dist/catalog/images/corporate/corporate-logo.web.js +12 -0
  340. package/dist/catalog/images/corporate/corporate-logo.web.js.map +1 -0
  341. package/dist/catalog/images/corporate/corporate-logo.webp +0 -0
  342. package/dist/catalog/images/debug/debug-resolutions.d.ts +3 -0
  343. package/dist/catalog/images/debug/debug-resolutions.d.ts.map +1 -0
  344. package/dist/catalog/images/debug/debug-resolutions.js +8 -0
  345. package/dist/catalog/images/debug/debug-resolutions.js.map +1 -0
  346. package/dist/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  347. package/dist/catalog/images/debug/debug-resolutions.web.d.ts +3 -0
  348. package/dist/catalog/images/debug/debug-resolutions.web.d.ts.map +1 -0
  349. package/dist/catalog/images/debug/debug-resolutions.web.js +12 -0
  350. package/dist/catalog/images/debug/debug-resolutions.web.js.map +1 -0
  351. package/dist/catalog/images/fairy-caves/grotto.d.ts +3 -0
  352. package/dist/catalog/images/fairy-caves/grotto.d.ts.map +1 -0
  353. package/dist/catalog/images/fairy-caves/grotto.js +8 -0
  354. package/dist/catalog/images/fairy-caves/grotto.js.map +1 -0
  355. package/dist/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  356. package/dist/catalog/images/fairy-caves/grotto.web.d.ts +3 -0
  357. package/dist/catalog/images/fairy-caves/grotto.web.d.ts.map +1 -0
  358. package/dist/catalog/images/fairy-caves/grotto.web.js +12 -0
  359. package/dist/catalog/images/fairy-caves/grotto.web.js.map +1 -0
  360. package/dist/catalog/images/fairy-caves/grotto.webp +0 -0
  361. package/dist/catalog/images/fairy-caves/hollow.d.ts +3 -0
  362. package/dist/catalog/images/fairy-caves/hollow.d.ts.map +1 -0
  363. package/dist/catalog/images/fairy-caves/hollow.js +8 -0
  364. package/dist/catalog/images/fairy-caves/hollow.js.map +1 -0
  365. package/dist/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  366. package/dist/catalog/images/fairy-caves/hollow.web.d.ts +3 -0
  367. package/dist/catalog/images/fairy-caves/hollow.web.d.ts.map +1 -0
  368. package/dist/catalog/images/fairy-caves/hollow.web.js +12 -0
  369. package/dist/catalog/images/fairy-caves/hollow.web.js.map +1 -0
  370. package/dist/catalog/images/fairy-caves/hollow.webp +0 -0
  371. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts +3 -0
  372. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts.map +1 -0
  373. package/dist/catalog/images/fairy-caves/treehouse-2.js +8 -0
  374. package/dist/catalog/images/fairy-caves/treehouse-2.js.map +1 -0
  375. package/dist/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  376. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts +3 -0
  377. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts.map +1 -0
  378. package/dist/catalog/images/fairy-caves/treehouse-2.web.js +12 -0
  379. package/dist/catalog/images/fairy-caves/treehouse-2.web.js.map +1 -0
  380. package/dist/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  381. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts +3 -0
  382. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts.map +1 -0
  383. package/dist/catalog/images/fairy-caves/treehouse-3.js +8 -0
  384. package/dist/catalog/images/fairy-caves/treehouse-3.js.map +1 -0
  385. package/dist/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  386. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts +3 -0
  387. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts.map +1 -0
  388. package/dist/catalog/images/fairy-caves/treehouse-3.web.js +12 -0
  389. package/dist/catalog/images/fairy-caves/treehouse-3.web.js.map +1 -0
  390. package/dist/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  391. package/dist/catalog/images/fairy-caves/treehouse.d.ts +3 -0
  392. package/dist/catalog/images/fairy-caves/treehouse.d.ts.map +1 -0
  393. package/dist/catalog/images/fairy-caves/treehouse.js +8 -0
  394. package/dist/catalog/images/fairy-caves/treehouse.js.map +1 -0
  395. package/dist/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  396. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts +3 -0
  397. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts.map +1 -0
  398. package/dist/catalog/images/fairy-caves/treehouse.web.js +12 -0
  399. package/dist/catalog/images/fairy-caves/treehouse.web.js.map +1 -0
  400. package/dist/catalog/images/fairy-caves/treehouse.webp +0 -0
  401. package/dist/catalog/images/home/home-dark.d.ts +3 -0
  402. package/dist/catalog/images/home/home-dark.d.ts.map +1 -0
  403. package/dist/catalog/images/home/home-dark.js +8 -0
  404. package/dist/catalog/images/home/home-dark.js.map +1 -0
  405. package/dist/catalog/images/home/home-dark.thumb.webp +0 -0
  406. package/dist/catalog/images/home/home-dark.web.d.ts +3 -0
  407. package/dist/catalog/images/home/home-dark.web.d.ts.map +1 -0
  408. package/dist/catalog/images/home/home-dark.web.js +12 -0
  409. package/dist/catalog/images/home/home-dark.web.js.map +1 -0
  410. package/dist/catalog/images/home/home-light.d.ts +3 -0
  411. package/dist/catalog/images/home/home-light.d.ts.map +1 -0
  412. package/dist/catalog/images/home/home-light.js +8 -0
  413. package/dist/catalog/images/home/home-light.js.map +1 -0
  414. package/dist/catalog/images/home/home-light.thumb.webp +0 -0
  415. package/dist/catalog/images/home/home-light.web.d.ts +3 -0
  416. package/dist/catalog/images/home/home-light.web.d.ts.map +1 -0
  417. package/dist/catalog/images/home/home-light.web.js +12 -0
  418. package/dist/catalog/images/home/home-light.web.js.map +1 -0
  419. package/dist/catalog/images/image-ids.d.ts +3 -0
  420. package/dist/catalog/images/image-ids.d.ts.map +1 -0
  421. package/dist/catalog/images/image-ids.js +43 -0
  422. package/dist/catalog/images/image-ids.js.map +1 -0
  423. package/dist/catalog/images/image.types.d.ts +2 -0
  424. package/dist/catalog/images/image.types.d.ts.map +1 -0
  425. package/dist/catalog/images/image.types.js +3 -0
  426. package/dist/catalog/images/image.types.js.map +1 -0
  427. package/dist/catalog/images/index.d.ts +3 -0
  428. package/dist/catalog/images/index.d.ts.map +1 -0
  429. package/dist/catalog/images/index.js +10 -0
  430. package/dist/catalog/images/index.js.map +1 -0
  431. package/dist/catalog/images/nature/landscape-dark.d.ts +3 -0
  432. package/dist/catalog/images/nature/landscape-dark.d.ts.map +1 -0
  433. package/dist/catalog/images/nature/landscape-dark.js +8 -0
  434. package/dist/catalog/images/nature/landscape-dark.js.map +1 -0
  435. package/dist/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  436. package/dist/catalog/images/nature/landscape-dark.web.d.ts +3 -0
  437. package/dist/catalog/images/nature/landscape-dark.web.d.ts.map +1 -0
  438. package/dist/catalog/images/nature/landscape-dark.web.js +12 -0
  439. package/dist/catalog/images/nature/landscape-dark.web.js.map +1 -0
  440. package/dist/catalog/images/nature/landscape-light.d.ts +3 -0
  441. package/dist/catalog/images/nature/landscape-light.d.ts.map +1 -0
  442. package/dist/catalog/images/nature/landscape-light.js +8 -0
  443. package/dist/catalog/images/nature/landscape-light.js.map +1 -0
  444. package/dist/catalog/images/nature/landscape-light.thumb.webp +0 -0
  445. package/dist/catalog/images/nature/landscape-light.web.d.ts +3 -0
  446. package/dist/catalog/images/nature/landscape-light.web.d.ts.map +1 -0
  447. package/dist/catalog/images/nature/landscape-light.web.js +12 -0
  448. package/dist/catalog/images/nature/landscape-light.web.js.map +1 -0
  449. package/dist/catalog/images/office/office-dark.d.ts +3 -0
  450. package/dist/catalog/images/office/office-dark.d.ts.map +1 -0
  451. package/dist/catalog/images/office/office-dark.js +8 -0
  452. package/dist/catalog/images/office/office-dark.js.map +1 -0
  453. package/dist/catalog/images/office/office-dark.thumb.webp +0 -0
  454. package/dist/catalog/images/office/office-dark.web.d.ts +3 -0
  455. package/dist/catalog/images/office/office-dark.web.d.ts.map +1 -0
  456. package/dist/catalog/images/office/office-dark.web.js +12 -0
  457. package/dist/catalog/images/office/office-dark.web.js.map +1 -0
  458. package/dist/catalog/images/office/office-light.d.ts +3 -0
  459. package/dist/catalog/images/office/office-light.d.ts.map +1 -0
  460. package/dist/catalog/images/office/office-light.js +8 -0
  461. package/dist/catalog/images/office/office-light.js.map +1 -0
  462. package/dist/catalog/images/office/office-light.thumb.webp +0 -0
  463. package/dist/catalog/images/office/office-light.web.d.ts +3 -0
  464. package/dist/catalog/images/office/office-light.web.d.ts.map +1 -0
  465. package/dist/catalog/images/office/office-light.web.js +12 -0
  466. package/dist/catalog/images/office/office-light.web.js.map +1 -0
  467. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts +3 -0
  468. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts.map +1 -0
  469. package/dist/catalog/images/sci-fi/sci-fi-light.js +8 -0
  470. package/dist/catalog/images/sci-fi/sci-fi-light.js.map +1 -0
  471. package/dist/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  472. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts +3 -0
  473. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts.map +1 -0
  474. package/dist/catalog/images/sci-fi/sci-fi-light.web.js +12 -0
  475. package/dist/catalog/images/sci-fi/sci-fi-light.web.js.map +1 -0
  476. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts +3 -0
  477. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts.map +1 -0
  478. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js +8 -0
  479. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js.map +1 -0
  480. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  481. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts +3 -0
  482. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts.map +1 -0
  483. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js +12 -0
  484. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js.map +1 -0
  485. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  486. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts +3 -0
  487. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts.map +1 -0
  488. package/dist/catalog/images/simiancraft/simiancraft-dark.js +8 -0
  489. package/dist/catalog/images/simiancraft/simiancraft-dark.js.map +1 -0
  490. package/dist/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  491. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts +3 -0
  492. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts.map +1 -0
  493. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js +12 -0
  494. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js.map +1 -0
  495. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts +3 -0
  496. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts.map +1 -0
  497. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js +8 -0
  498. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js.map +1 -0
  499. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  500. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts +3 -0
  501. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts.map +1 -0
  502. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js +12 -0
  503. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js.map +1 -0
  504. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  505. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts +3 -0
  506. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts.map +1 -0
  507. package/dist/catalog/images/simiancraft/simiancraft-light.js +8 -0
  508. package/dist/catalog/images/simiancraft/simiancraft-light.js.map +1 -0
  509. package/dist/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  510. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts +3 -0
  511. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts.map +1 -0
  512. package/dist/catalog/images/simiancraft/simiancraft-light.web.js +12 -0
  513. package/dist/catalog/images/simiancraft/simiancraft-light.web.js.map +1 -0
  514. package/dist/catalog/images/spaceship/observation-deck.d.ts +3 -0
  515. package/dist/catalog/images/spaceship/observation-deck.d.ts.map +1 -0
  516. package/dist/catalog/images/spaceship/observation-deck.js +8 -0
  517. package/dist/catalog/images/spaceship/observation-deck.js.map +1 -0
  518. package/dist/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  519. package/dist/catalog/images/spaceship/observation-deck.web.d.ts +3 -0
  520. package/dist/catalog/images/spaceship/observation-deck.web.d.ts.map +1 -0
  521. package/dist/catalog/images/spaceship/observation-deck.web.js +12 -0
  522. package/dist/catalog/images/spaceship/observation-deck.web.js.map +1 -0
  523. package/dist/catalog/images/spaceship/observation-deck.webp +0 -0
  524. package/dist/catalog/images/underwater/oceanscape-dark.d.ts +3 -0
  525. package/dist/catalog/images/underwater/oceanscape-dark.d.ts.map +1 -0
  526. package/dist/catalog/images/underwater/oceanscape-dark.js +8 -0
  527. package/dist/catalog/images/underwater/oceanscape-dark.js.map +1 -0
  528. package/dist/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  529. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts +3 -0
  530. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts.map +1 -0
  531. package/dist/catalog/images/underwater/oceanscape-dark.web.js +12 -0
  532. package/dist/catalog/images/underwater/oceanscape-dark.web.js.map +1 -0
  533. package/dist/catalog/images/underwater/oceanscape-dark.webp +0 -0
  534. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts +3 -0
  535. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts.map +1 -0
  536. package/dist/catalog/images/wizard-tower/wizard-tower-1.js +8 -0
  537. package/dist/catalog/images/wizard-tower/wizard-tower-1.js.map +1 -0
  538. package/dist/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  539. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts +3 -0
  540. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts.map +1 -0
  541. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js +12 -0
  542. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js.map +1 -0
  543. package/dist/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  544. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts +3 -0
  545. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts.map +1 -0
  546. package/dist/catalog/images/wizard-tower/wizard-tower-2.js +8 -0
  547. package/dist/catalog/images/wizard-tower/wizard-tower-2.js.map +1 -0
  548. package/dist/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  549. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts +3 -0
  550. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts.map +1 -0
  551. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js +12 -0
  552. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js.map +1 -0
  553. package/dist/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  554. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts +3 -0
  555. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts.map +1 -0
  556. package/dist/catalog/images/wizard-tower/wizard-tower-night.js +8 -0
  557. package/dist/catalog/images/wizard-tower/wizard-tower-night.js.map +1 -0
  558. package/dist/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  559. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts +3 -0
  560. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts.map +1 -0
  561. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js +12 -0
  562. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js.map +1 -0
  563. package/dist/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  564. package/dist/catalog/shaders/_shared/types.d.ts +38 -0
  565. package/dist/catalog/shaders/_shared/types.d.ts.map +1 -0
  566. package/dist/catalog/shaders/_shared/types.js +15 -0
  567. package/dist/catalog/shaders/_shared/types.js.map +1 -0
  568. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts +26 -0
  569. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts.map +1 -0
  570. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts +3 -0
  571. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts.map +1 -0
  572. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js +15 -0
  573. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js.map +1 -0
  574. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js +84 -0
  575. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js.map +1 -0
  576. package/dist/catalog/shaders/blur/blur.d.ts +15 -0
  577. package/dist/catalog/shaders/blur/blur.d.ts.map +1 -0
  578. package/dist/catalog/shaders/blur/blur.form.d.ts +3 -0
  579. package/dist/catalog/shaders/blur/blur.form.d.ts.map +1 -0
  580. package/dist/catalog/shaders/blur/blur.form.js +15 -0
  581. package/dist/catalog/shaders/blur/blur.form.js.map +1 -0
  582. package/dist/catalog/shaders/blur/blur.js +27 -0
  583. package/dist/catalog/shaders/blur/blur.js.map +1 -0
  584. package/dist/catalog/shaders/clouds/clouds.d.ts +34 -0
  585. package/dist/catalog/shaders/clouds/clouds.d.ts.map +1 -0
  586. package/dist/catalog/shaders/clouds/clouds.form.d.ts +3 -0
  587. package/dist/catalog/shaders/clouds/clouds.form.d.ts.map +1 -0
  588. package/dist/catalog/shaders/clouds/clouds.form.js +15 -0
  589. package/dist/catalog/shaders/clouds/clouds.form.js.map +1 -0
  590. package/dist/catalog/shaders/clouds/clouds.js +98 -0
  591. package/dist/catalog/shaders/clouds/clouds.js.map +1 -0
  592. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts +40 -0
  593. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  594. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts +3 -0
  595. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts.map +1 -0
  596. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js +15 -0
  597. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js.map +1 -0
  598. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js +100 -0
  599. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js.map +1 -0
  600. package/dist/catalog/shaders/fireflies/fireflies.d.ts +18 -0
  601. package/dist/catalog/shaders/fireflies/fireflies.d.ts.map +1 -0
  602. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts +3 -0
  603. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts.map +1 -0
  604. package/dist/catalog/shaders/fireflies/fireflies.form.js +15 -0
  605. package/dist/catalog/shaders/fireflies/fireflies.form.js.map +1 -0
  606. package/dist/catalog/shaders/fireflies/fireflies.js +47 -0
  607. package/dist/catalog/shaders/fireflies/fireflies.js.map +1 -0
  608. package/dist/catalog/shaders/godrays/godrays.d.ts +26 -0
  609. package/dist/catalog/shaders/godrays/godrays.d.ts.map +1 -0
  610. package/dist/catalog/shaders/godrays/godrays.form.d.ts +3 -0
  611. package/dist/catalog/shaders/godrays/godrays.form.d.ts.map +1 -0
  612. package/dist/catalog/shaders/godrays/godrays.form.js +15 -0
  613. package/dist/catalog/shaders/godrays/godrays.form.js.map +1 -0
  614. package/dist/catalog/shaders/godrays/godrays.js +83 -0
  615. package/dist/catalog/shaders/godrays/godrays.js.map +1 -0
  616. package/dist/catalog/shaders/index.d.ts +73 -0
  617. package/dist/catalog/shaders/index.d.ts.map +1 -0
  618. package/dist/catalog/shaders/index.js +30 -0
  619. package/dist/catalog/shaders/index.js.map +1 -0
  620. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts +44 -0
  621. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts.map +1 -0
  622. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts +3 -0
  623. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts.map +1 -0
  624. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js +16 -0
  625. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js.map +1 -0
  626. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js +91 -0
  627. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js.map +1 -0
  628. package/dist/catalog/shaders/nebula/nebula.d.ts +20 -0
  629. package/dist/catalog/shaders/nebula/nebula.d.ts.map +1 -0
  630. package/dist/catalog/shaders/nebula/nebula.form.d.ts +3 -0
  631. package/dist/catalog/shaders/nebula/nebula.form.d.ts.map +1 -0
  632. package/dist/catalog/shaders/nebula/nebula.form.js +15 -0
  633. package/dist/catalog/shaders/nebula/nebula.form.js.map +1 -0
  634. package/dist/catalog/shaders/nebula/nebula.js +58 -0
  635. package/dist/catalog/shaders/nebula/nebula.js.map +1 -0
  636. package/dist/catalog/shaders/plasma/plasma.d.ts +16 -0
  637. package/dist/catalog/shaders/plasma/plasma.d.ts.map +1 -0
  638. package/dist/catalog/shaders/plasma/plasma.form.d.ts +3 -0
  639. package/dist/catalog/shaders/plasma/plasma.form.d.ts.map +1 -0
  640. package/dist/catalog/shaders/plasma/plasma.form.js +15 -0
  641. package/dist/catalog/shaders/plasma/plasma.form.js.map +1 -0
  642. package/dist/catalog/shaders/plasma/plasma.js +32 -0
  643. package/dist/catalog/shaders/plasma/plasma.js.map +1 -0
  644. package/dist/catalog/shaders/simianlights/simianlights.d.ts +20 -0
  645. package/dist/catalog/shaders/simianlights/simianlights.d.ts.map +1 -0
  646. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts +3 -0
  647. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts.map +1 -0
  648. package/dist/catalog/shaders/simianlights/simianlights.form.js +15 -0
  649. package/dist/catalog/shaders/simianlights/simianlights.form.js.map +1 -0
  650. package/dist/catalog/shaders/simianlights/simianlights.js +57 -0
  651. package/dist/catalog/shaders/simianlights/simianlights.js.map +1 -0
  652. package/dist/src/components/form/control-form.d.ts +37 -0
  653. package/dist/src/components/form/control-form.d.ts.map +1 -0
  654. package/dist/src/components/form/control-form.js +55 -0
  655. package/dist/src/components/form/control-form.js.map +1 -0
  656. package/dist/src/components/form/make-controls.d.ts +22 -0
  657. package/dist/src/components/form/make-controls.d.ts.map +1 -0
  658. package/dist/src/components/form/make-controls.js +19 -0
  659. package/dist/src/components/form/make-controls.js.map +1 -0
  660. package/dist/src/components/form/scope.d.ts +2 -0
  661. package/dist/src/components/form/scope.d.ts.map +1 -0
  662. package/dist/src/components/form/scope.js +11 -0
  663. package/dist/src/components/form/scope.js.map +1 -0
  664. package/dist/src/components/form/use-field.d.ts +10 -0
  665. package/dist/src/components/form/use-field.d.ts.map +1 -0
  666. package/dist/src/components/form/use-field.js +27 -0
  667. package/dist/src/components/form/use-field.js.map +1 -0
  668. package/dist/src/components/preset-book-menu/index.d.ts +52 -0
  669. package/dist/src/components/preset-book-menu/index.d.ts.map +1 -0
  670. package/dist/src/components/preset-book-menu/index.js +152 -0
  671. package/dist/src/components/preset-book-menu/index.js.map +1 -0
  672. package/dist/src/components/preset-book-menu/layout.d.ts +25 -0
  673. package/dist/src/components/preset-book-menu/layout.d.ts.map +1 -0
  674. package/dist/src/components/preset-book-menu/layout.js +19 -0
  675. package/dist/src/components/preset-book-menu/layout.js.map +1 -0
  676. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts +88 -0
  677. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts.map +1 -0
  678. package/dist/src/components/preset-book-menu/preset-book-menu.types.js +14 -0
  679. package/dist/src/components/preset-book-menu/preset-book-menu.types.js.map +1 -0
  680. package/dist/src/components/preset-book-menu/preset-grid.d.ts +16 -0
  681. package/dist/src/components/preset-book-menu/preset-grid.d.ts.map +1 -0
  682. package/dist/src/components/preset-book-menu/preset-grid.js +49 -0
  683. package/dist/src/components/preset-book-menu/preset-grid.js.map +1 -0
  684. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts +3 -0
  685. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts.map +1 -0
  686. package/dist/src/components/preset-book-menu/resolve-image-uri.js +28 -0
  687. package/dist/src/components/preset-book-menu/resolve-image-uri.js.map +1 -0
  688. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts +13 -0
  689. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts.map +1 -0
  690. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js +5 -0
  691. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js.map +1 -0
  692. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts +3 -0
  693. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts.map +1 -0
  694. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js +17 -0
  695. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js.map +1 -0
  696. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts +14 -0
  697. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts.map +1 -0
  698. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js +36 -0
  699. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js.map +1 -0
  700. package/dist/src/components/preset-control-panel/control-section.d.ts +9 -0
  701. package/dist/src/components/preset-control-panel/control-section.d.ts.map +1 -0
  702. package/dist/src/components/preset-control-panel/control-section.js +47 -0
  703. package/dist/src/components/preset-control-panel/control-section.js.map +1 -0
  704. package/dist/src/components/preset-control-panel/control.d.ts +10 -0
  705. package/dist/src/components/preset-control-panel/control.d.ts.map +1 -0
  706. package/dist/src/components/preset-control-panel/control.js +35 -0
  707. package/dist/src/components/preset-control-panel/control.js.map +1 -0
  708. package/dist/src/components/preset-control-panel/index.d.ts +14 -0
  709. package/dist/src/components/preset-control-panel/index.d.ts.map +1 -0
  710. package/dist/src/components/preset-control-panel/index.js +49 -0
  711. package/dist/src/components/preset-control-panel/index.js.map +1 -0
  712. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts +11 -0
  713. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts.map +1 -0
  714. package/dist/src/components/preset-control-panel/mask-control-panel.js +34 -0
  715. package/dist/src/components/preset-control-panel/mask-control-panel.js.map +1 -0
  716. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts +12 -0
  717. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts.map +1 -0
  718. package/dist/src/components/preset-control-panel/preset-control-panel.js +23 -0
  719. package/dist/src/components/preset-control-panel/preset-control-panel.js.map +1 -0
  720. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts +14 -0
  721. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts.map +1 -0
  722. package/dist/src/components/preset-control-panel/transform-control-panel.js +58 -0
  723. package/dist/src/components/preset-control-panel/transform-control-panel.js.map +1 -0
  724. package/dist/src/components/preset-tile/index.d.ts +24 -0
  725. package/dist/src/components/preset-tile/index.d.ts.map +1 -0
  726. package/dist/src/components/preset-tile/index.js +98 -0
  727. package/dist/src/components/preset-tile/index.js.map +1 -0
  728. package/dist/src/components/theme/provider.d.ts +18 -0
  729. package/dist/src/components/theme/provider.d.ts.map +1 -0
  730. package/dist/src/components/theme/provider.js +29 -0
  731. package/dist/src/components/theme/provider.js.map +1 -0
  732. package/dist/src/components/theme/slots.d.ts +17 -0
  733. package/dist/src/components/theme/slots.d.ts.map +1 -0
  734. package/dist/src/components/theme/slots.js +9 -0
  735. package/dist/src/components/theme/slots.js.map +1 -0
  736. package/dist/src/components/ui/button.d.ts +14 -0
  737. package/dist/src/components/ui/button.d.ts.map +1 -0
  738. package/dist/src/components/ui/button.js +29 -0
  739. package/dist/src/components/ui/button.js.map +1 -0
  740. package/dist/src/components/ui/color-picker.d.ts +12 -0
  741. package/dist/src/components/ui/color-picker.d.ts.map +1 -0
  742. package/dist/src/components/ui/color-picker.js +43 -0
  743. package/dist/src/components/ui/color-picker.js.map +1 -0
  744. package/dist/src/components/ui/index.d.ts +6 -0
  745. package/dist/src/components/ui/index.d.ts.map +1 -0
  746. package/dist/src/components/ui/index.js +18 -0
  747. package/dist/src/components/ui/index.js.map +1 -0
  748. package/dist/src/components/ui/label.d.ts +10 -0
  749. package/dist/src/components/ui/label.d.ts.map +1 -0
  750. package/dist/src/components/ui/label.js +14 -0
  751. package/dist/src/components/ui/label.js.map +1 -0
  752. package/dist/src/components/ui/point.d.ts +19 -0
  753. package/dist/src/components/ui/point.d.ts.map +1 -0
  754. package/dist/src/components/ui/point.js +52 -0
  755. package/dist/src/components/ui/point.js.map +1 -0
  756. package/dist/src/components/ui/polygon-field.d.ts +10 -0
  757. package/dist/src/components/ui/polygon-field.d.ts.map +1 -0
  758. package/dist/src/components/ui/polygon-field.js +50 -0
  759. package/dist/src/components/ui/polygon-field.js.map +1 -0
  760. package/dist/src/components/ui/readout.d.ts +10 -0
  761. package/dist/src/components/ui/readout.d.ts.map +1 -0
  762. package/dist/src/components/ui/readout.js +14 -0
  763. package/dist/src/components/ui/readout.js.map +1 -0
  764. package/dist/src/components/ui/slider-value.d.ts +8 -0
  765. package/dist/src/components/ui/slider-value.d.ts.map +1 -0
  766. package/dist/src/components/ui/slider-value.js +17 -0
  767. package/dist/src/components/ui/slider-value.js.map +1 -0
  768. package/dist/src/components/ui/slider.d.ts +15 -0
  769. package/dist/src/components/ui/slider.d.ts.map +1 -0
  770. package/dist/src/components/ui/slider.js +58 -0
  771. package/dist/src/components/ui/slider.js.map +1 -0
  772. package/dist/src/components/ui/switch.d.ts +8 -0
  773. package/dist/src/components/ui/switch.d.ts.map +1 -0
  774. package/dist/src/components/ui/switch.js +24 -0
  775. package/dist/src/components/ui/switch.js.map +1 -0
  776. package/dist/src/index.d.ts +18 -0
  777. package/dist/src/index.d.ts.map +1 -0
  778. package/dist/src/index.js +187 -0
  779. package/dist/src/index.js.map +1 -0
  780. package/dist/src/index.web.d.ts +32 -0
  781. package/dist/src/index.web.d.ts.map +1 -0
  782. package/dist/src/index.web.js +119 -0
  783. package/dist/src/index.web.js.map +1 -0
  784. package/dist/src/kaleidoscope/controls.d.ts +24 -0
  785. package/dist/src/kaleidoscope/controls.d.ts.map +1 -0
  786. package/dist/src/kaleidoscope/controls.js +92 -0
  787. package/dist/src/kaleidoscope/controls.js.map +1 -0
  788. package/dist/src/kaleidoscope/effect.d.ts +4 -0
  789. package/dist/src/kaleidoscope/effect.d.ts.map +1 -0
  790. package/dist/src/kaleidoscope/effect.js +7 -0
  791. package/dist/src/kaleidoscope/effect.js.map +1 -0
  792. package/dist/src/kaleidoscope/effect.types.d.ts +47 -0
  793. package/dist/src/kaleidoscope/effect.types.d.ts.map +1 -0
  794. package/dist/src/kaleidoscope/effect.types.js +9 -0
  795. package/dist/src/kaleidoscope/effect.types.js.map +1 -0
  796. package/dist/src/kaleidoscope/shader-to-spec.d.ts +4 -0
  797. package/dist/src/kaleidoscope/shader-to-spec.d.ts.map +1 -0
  798. package/dist/src/kaleidoscope/shader-to-spec.js +17 -0
  799. package/dist/src/kaleidoscope/shader-to-spec.js.map +1 -0
  800. package/dist/src/kaleidoscope/types.d.ts +79 -0
  801. package/dist/src/kaleidoscope/types.d.ts.map +1 -0
  802. package/dist/src/kaleidoscope/types.js +18 -0
  803. package/dist/src/kaleidoscope/types.js.map +1 -0
  804. package/dist/src/kaleidoscope.preset-book.types.d.ts +86 -0
  805. package/dist/src/kaleidoscope.preset-book.types.d.ts.map +1 -0
  806. package/dist/src/kaleidoscope.preset-book.types.js +16 -0
  807. package/dist/src/kaleidoscope.preset-book.types.js.map +1 -0
  808. package/dist/src/lib/primitives.types.d.ts +3 -0
  809. package/dist/src/lib/primitives.types.d.ts.map +1 -0
  810. package/dist/src/lib/primitives.types.js +5 -0
  811. package/dist/src/lib/primitives.types.js.map +1 -0
  812. package/dist/src/lib/test-id.d.ts +30 -0
  813. package/dist/src/lib/test-id.d.ts.map +1 -0
  814. package/dist/src/lib/test-id.js +81 -0
  815. package/dist/src/lib/test-id.js.map +1 -0
  816. package/dist/src/livekit.d.ts +24 -0
  817. package/dist/src/livekit.d.ts.map +1 -0
  818. package/dist/src/livekit.js +63 -0
  819. package/dist/src/livekit.js.map +1 -0
  820. package/dist/src/nativewind.d.ts +7 -0
  821. package/dist/src/nativewind.d.ts.map +1 -0
  822. package/dist/src/nativewind.js +43 -0
  823. package/dist/src/nativewind.js.map +1 -0
  824. package/dist/web-driver/effects/composite.d.ts +14 -0
  825. package/dist/web-driver/effects/composite.d.ts.map +1 -0
  826. package/dist/web-driver/effects/composite.js +576 -0
  827. package/dist/web-driver/effects/composite.js.map +1 -0
  828. package/dist/web-driver/effects/layer-shaders.d.ts +2 -0
  829. package/dist/web-driver/effects/layer-shaders.d.ts.map +1 -0
  830. package/dist/web-driver/effects/layer-shaders.js +11 -0
  831. package/dist/web-driver/effects/layer-shaders.js.map +1 -0
  832. package/dist/web-driver/effects/transform.d.ts +4 -0
  833. package/dist/web-driver/effects/transform.d.ts.map +1 -0
  834. package/dist/web-driver/effects/transform.js +66 -0
  835. package/dist/web-driver/effects/transform.js.map +1 -0
  836. package/dist/web-driver/index.d.ts +6 -0
  837. package/dist/web-driver/index.d.ts.map +1 -0
  838. package/dist/web-driver/index.js +21 -0
  839. package/dist/web-driver/index.js.map +1 -0
  840. package/dist/web-driver/insertable-streams.d.ts.map +1 -0
  841. package/dist/web-driver/insertable-streams.js +68 -0
  842. package/dist/web-driver/insertable-streams.js.map +1 -0
  843. package/dist/web-driver/segmenter.d.ts.map +1 -0
  844. package/dist/web-driver/segmenter.js +89 -0
  845. package/dist/web-driver/segmenter.js.map +1 -0
  846. package/dist/web-driver/shaders.d.ts +2 -0
  847. package/dist/web-driver/shaders.d.ts.map +1 -0
  848. package/dist/web-driver/shaders.generated.d.ts +17 -0
  849. package/dist/web-driver/shaders.generated.d.ts.map +1 -0
  850. package/dist/web-driver/shaders.generated.js +1180 -0
  851. package/dist/web-driver/shaders.generated.js.map +1 -0
  852. package/dist/web-driver/shaders.js +28 -0
  853. package/dist/web-driver/shaders.js.map +1 -0
  854. package/dist/web-driver/tuning.d.ts.map +1 -0
  855. package/dist/web-driver/tuning.js +61 -0
  856. package/dist/web-driver/tuning.js.map +1 -0
  857. package/ios/Kaleidoscope.podspec +22 -15
  858. package/ios/KaleidoscopeModule/BundledImage.swift +39 -0
  859. package/ios/KaleidoscopeModule/CompositeLayers.swift +142 -0
  860. package/ios/KaleidoscopeModule/EffectTuning.swift +86 -86
  861. package/ios/KaleidoscopeModule/KaleidoscopeModule.swift +55 -27
  862. package/ios/KaleidoscopeModule/Registration.swift +36 -57
  863. package/ios/KaleidoscopeModule/effects/CompositeProcessor.swift +906 -0
  864. package/ios/KaleidoscopeModule/effects/FrameBridge.swift +25 -25
  865. package/ios/KaleidoscopeModule/effects/TransformProcessor.swift +127 -126
  866. package/ios/KaleidoscopeModule/gpu/CompositeRendering.swift +352 -0
  867. package/ios/KaleidoscopeModule/gpu/Ingest.swift +104 -102
  868. package/ios/KaleidoscopeModule/gpu/MetalRenderer.swift +473 -544
  869. package/ios/KaleidoscopeModule/gpu/Orientation.swift +41 -41
  870. package/ios/KaleidoscopeModule/gpu/ShaderLibrary.swift +100 -54
  871. package/ios/KaleidoscopeModule/gpu/TextureBridge.swift +245 -244
  872. package/ios/KaleidoscopeModule/segmentation/MaskTuning.swift +11 -11
  873. package/ios/KaleidoscopeModule/segmentation/Segmenter.swift +360 -359
  874. package/ios/KaleidoscopeModule/shaders/GENERATIVE.txt +9 -0
  875. package/ios/KaleidoscopeModule/shaders/SHADERS.txt +13 -2
  876. package/ios/KaleidoscopeModule/shaders/anamorphic-lensflare.metalsrc +47 -0
  877. package/ios/KaleidoscopeModule/shaders/clouds.metalsrc +185 -0
  878. package/ios/KaleidoscopeModule/shaders/composite-blit.metalsrc +22 -0
  879. package/ios/KaleidoscopeModule/shaders/composite-blur.metalsrc +93 -0
  880. package/ios/KaleidoscopeModule/shaders/composite-camera.metalsrc +22 -0
  881. package/ios/KaleidoscopeModule/shaders/composite-image.metalsrc +24 -0
  882. package/ios/KaleidoscopeModule/shaders/composite-masked.metalsrc +22 -0
  883. package/ios/KaleidoscopeModule/shaders/composite-subject.metalsrc +23 -0
  884. package/ios/KaleidoscopeModule/shaders/corporate-blobs.metalsrc +221 -0
  885. package/ios/KaleidoscopeModule/shaders/fireflies.metalsrc +44 -0
  886. package/ios/KaleidoscopeModule/shaders/godrays.metalsrc +46 -0
  887. package/ios/KaleidoscopeModule/shaders/light-beams-and-motes.metalsrc +316 -0
  888. package/ios/KaleidoscopeModule/shaders/nebula.metalsrc +45 -45
  889. package/ios/KaleidoscopeModule/shaders/plasma.metalsrc +26 -0
  890. package/ios/KaleidoscopeModule/shaders/simianlights.metalsrc +45 -45
  891. package/package.json +485 -115
  892. package/plugin/build/android/assets.js +45 -0
  893. package/plugin/build/android/index.js +34 -0
  894. package/plugin/build/index.js +39 -0
  895. package/plugin/build/ios/assets.js +110 -0
  896. package/plugin/build/ios/deployment-target.js +105 -0
  897. package/plugin/build/ios/index.js +63 -0
  898. package/plugin/build/ios/pods.js +73 -0
  899. package/plugin/build/lib/constants.js +15 -0
  900. package/plugin/build/lib/file-manipulation.js +57 -0
  901. package/plugin/build/lib/mods.js +36 -0
  902. package/plugin/build/lib/preset-book.js +215 -0
  903. package/plugin/build/lib/types.js +16 -0
  904. package/src/components/form/control-form.tsx +112 -0
  905. package/src/components/form/make-controls.ts +33 -0
  906. package/src/components/form/scope.ts +9 -0
  907. package/src/components/form/use-field.ts +35 -0
  908. package/src/components/preset-book-menu/index.tsx +286 -0
  909. package/src/components/preset-book-menu/layout.tsx +63 -0
  910. package/src/components/preset-book-menu/preset-book-menu.types.ts +112 -0
  911. package/src/components/preset-book-menu/preset-grid.tsx +80 -0
  912. package/src/components/preset-book-menu/resolve-image-uri.ts +31 -0
  913. package/src/components/preset-book-menu/resolve-image-uri.types.ts +18 -0
  914. package/src/components/preset-book-menu/resolve-image-uri.web.ts +15 -0
  915. package/src/components/preset-control-panel/composite-layer-control-panel.tsx +56 -0
  916. package/src/components/preset-control-panel/control-section.tsx +84 -0
  917. package/src/components/preset-control-panel/control.tsx +50 -0
  918. package/src/components/preset-control-panel/index.ts +31 -0
  919. package/src/components/preset-control-panel/mask-control-panel.tsx +93 -0
  920. package/src/components/preset-control-panel/preset-control-panel.tsx +48 -0
  921. package/src/components/preset-control-panel/transform-control-panel.tsx +146 -0
  922. package/src/components/preset-tile/index.tsx +160 -0
  923. package/src/components/theme/provider.tsx +50 -0
  924. package/src/components/theme/slots.ts +37 -0
  925. package/src/components/ui/button.tsx +54 -0
  926. package/src/components/ui/color-picker.tsx +74 -0
  927. package/src/components/ui/index.ts +10 -0
  928. package/src/components/ui/label.tsx +24 -0
  929. package/src/components/ui/point.tsx +116 -0
  930. package/src/components/ui/polygon-field.tsx +84 -0
  931. package/src/components/ui/readout.tsx +25 -0
  932. package/src/components/ui/slider-value.ts +15 -0
  933. package/src/components/ui/slider.tsx +98 -0
  934. package/src/components/ui/switch.tsx +40 -0
  935. package/src/index.ts +176 -95
  936. package/src/index.web.ts +126 -74
  937. package/src/kaleidoscope/controls.ts +127 -0
  938. package/src/kaleidoscope/effect.ts +5 -0
  939. package/src/kaleidoscope/effect.types.ts +63 -0
  940. package/src/kaleidoscope/shader-to-spec.ts +16 -0
  941. package/src/kaleidoscope/types.ts +101 -0
  942. package/src/kaleidoscope.preset-book.types.ts +105 -0
  943. package/src/lib/primitives.types.ts +5 -0
  944. package/src/lib/test-id.ts +81 -0
  945. package/src/livekit.ts +6 -4
  946. package/src/nativewind.ts +41 -0
  947. package/android/src/main/assets/backgrounds/stylized-dark.webp +0 -0
  948. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BackgroundImageFactory.kt +0 -365
  949. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BlurFactory.kt +0 -400
  950. package/dist/backgrounds/dark-office.d.ts +0 -3
  951. package/dist/backgrounds/dark-office.d.ts.map +0 -1
  952. package/dist/backgrounds/dark-office.js +0 -5
  953. package/dist/backgrounds/dark-office.js.map +0 -1
  954. package/dist/backgrounds/dark-office.web.d.ts +0 -3
  955. package/dist/backgrounds/dark-office.web.d.ts.map +0 -1
  956. package/dist/backgrounds/dark-office.web.js +0 -8
  957. package/dist/backgrounds/dark-office.web.js.map +0 -1
  958. package/dist/backgrounds/debug-resolutions.d.ts +0 -3
  959. package/dist/backgrounds/debug-resolutions.d.ts.map +0 -1
  960. package/dist/backgrounds/debug-resolutions.js +0 -6
  961. package/dist/backgrounds/debug-resolutions.js.map +0 -1
  962. package/dist/backgrounds/debug-resolutions.web.d.ts +0 -3
  963. package/dist/backgrounds/debug-resolutions.web.d.ts.map +0 -1
  964. package/dist/backgrounds/debug-resolutions.web.js +0 -8
  965. package/dist/backgrounds/debug-resolutions.web.js.map +0 -1
  966. package/dist/backgrounds/home-dark.d.ts +0 -3
  967. package/dist/backgrounds/home-dark.d.ts.map +0 -1
  968. package/dist/backgrounds/home-dark.js +0 -5
  969. package/dist/backgrounds/home-dark.js.map +0 -1
  970. package/dist/backgrounds/home-dark.web.d.ts +0 -3
  971. package/dist/backgrounds/home-dark.web.d.ts.map +0 -1
  972. package/dist/backgrounds/home-dark.web.js +0 -6
  973. package/dist/backgrounds/home-dark.web.js.map +0 -1
  974. package/dist/backgrounds/home-light.d.ts +0 -3
  975. package/dist/backgrounds/home-light.d.ts.map +0 -1
  976. package/dist/backgrounds/home-light.js +0 -5
  977. package/dist/backgrounds/home-light.js.map +0 -1
  978. package/dist/backgrounds/home-light.web.d.ts +0 -3
  979. package/dist/backgrounds/home-light.web.d.ts.map +0 -1
  980. package/dist/backgrounds/home-light.web.js +0 -6
  981. package/dist/backgrounds/home-light.web.js.map +0 -1
  982. package/dist/backgrounds/index.d.ts +0 -3
  983. package/dist/backgrounds/index.d.ts.map +0 -1
  984. package/dist/backgrounds/index.js +0 -6
  985. package/dist/backgrounds/index.js.map +0 -1
  986. package/dist/backgrounds/light-office.d.ts +0 -3
  987. package/dist/backgrounds/light-office.d.ts.map +0 -1
  988. package/dist/backgrounds/light-office.js +0 -5
  989. package/dist/backgrounds/light-office.js.map +0 -1
  990. package/dist/backgrounds/light-office.web.d.ts +0 -3
  991. package/dist/backgrounds/light-office.web.d.ts.map +0 -1
  992. package/dist/backgrounds/light-office.web.js +0 -8
  993. package/dist/backgrounds/light-office.web.js.map +0 -1
  994. package/dist/backgrounds/nature-dark.d.ts +0 -3
  995. package/dist/backgrounds/nature-dark.d.ts.map +0 -1
  996. package/dist/backgrounds/nature-dark.js +0 -5
  997. package/dist/backgrounds/nature-dark.js.map +0 -1
  998. package/dist/backgrounds/nature-dark.web.d.ts +0 -3
  999. package/dist/backgrounds/nature-dark.web.d.ts.map +0 -1
  1000. package/dist/backgrounds/nature-dark.web.js +0 -6
  1001. package/dist/backgrounds/nature-dark.web.js.map +0 -1
  1002. package/dist/backgrounds/nature-light.d.ts +0 -3
  1003. package/dist/backgrounds/nature-light.d.ts.map +0 -1
  1004. package/dist/backgrounds/nature-light.js +0 -5
  1005. package/dist/backgrounds/nature-light.js.map +0 -1
  1006. package/dist/backgrounds/nature-light.web.d.ts +0 -3
  1007. package/dist/backgrounds/nature-light.web.d.ts.map +0 -1
  1008. package/dist/backgrounds/nature-light.web.js +0 -6
  1009. package/dist/backgrounds/nature-light.web.js.map +0 -1
  1010. package/dist/backgrounds/preset-source.types.d.ts +0 -2
  1011. package/dist/backgrounds/preset-source.types.d.ts.map +0 -1
  1012. package/dist/backgrounds/preset-source.types.js +0 -2
  1013. package/dist/backgrounds/preset-source.types.js.map +0 -1
  1014. package/dist/backgrounds/presets.d.ts +0 -3
  1015. package/dist/backgrounds/presets.d.ts.map +0 -1
  1016. package/dist/backgrounds/presets.js +0 -34
  1017. package/dist/backgrounds/presets.js.map +0 -1
  1018. package/dist/backgrounds/simiancraft-dark.d.ts +0 -3
  1019. package/dist/backgrounds/simiancraft-dark.d.ts.map +0 -1
  1020. package/dist/backgrounds/simiancraft-dark.js +0 -5
  1021. package/dist/backgrounds/simiancraft-dark.js.map +0 -1
  1022. package/dist/backgrounds/simiancraft-dark.web.d.ts +0 -3
  1023. package/dist/backgrounds/simiancraft-dark.web.d.ts.map +0 -1
  1024. package/dist/backgrounds/simiancraft-dark.web.js +0 -6
  1025. package/dist/backgrounds/simiancraft-dark.web.js.map +0 -1
  1026. package/dist/backgrounds/simiancraft-light.d.ts +0 -3
  1027. package/dist/backgrounds/simiancraft-light.d.ts.map +0 -1
  1028. package/dist/backgrounds/simiancraft-light.js +0 -5
  1029. package/dist/backgrounds/simiancraft-light.js.map +0 -1
  1030. package/dist/backgrounds/simiancraft-light.web.d.ts +0 -3
  1031. package/dist/backgrounds/simiancraft-light.web.d.ts.map +0 -1
  1032. package/dist/backgrounds/simiancraft-light.web.js +0 -6
  1033. package/dist/backgrounds/simiancraft-light.web.js.map +0 -1
  1034. package/dist/backgrounds/stylized-dark.d.ts +0 -3
  1035. package/dist/backgrounds/stylized-dark.d.ts.map +0 -1
  1036. package/dist/backgrounds/stylized-dark.js +0 -5
  1037. package/dist/backgrounds/stylized-dark.js.map +0 -1
  1038. package/dist/backgrounds/stylized-dark.web.d.ts +0 -3
  1039. package/dist/backgrounds/stylized-dark.web.d.ts.map +0 -1
  1040. package/dist/backgrounds/stylized-dark.web.js +0 -6
  1041. package/dist/backgrounds/stylized-dark.web.js.map +0 -1
  1042. package/dist/backgrounds/stylized-dark.webp +0 -0
  1043. package/dist/backgrounds/stylized-light.d.ts +0 -3
  1044. package/dist/backgrounds/stylized-light.d.ts.map +0 -1
  1045. package/dist/backgrounds/stylized-light.js +0 -5
  1046. package/dist/backgrounds/stylized-light.js.map +0 -1
  1047. package/dist/backgrounds/stylized-light.web.d.ts +0 -3
  1048. package/dist/backgrounds/stylized-light.web.d.ts.map +0 -1
  1049. package/dist/backgrounds/stylized-light.web.js +0 -6
  1050. package/dist/backgrounds/stylized-light.web.js.map +0 -1
  1051. package/dist/index.d.ts +0 -42
  1052. package/dist/index.d.ts.map +0 -1
  1053. package/dist/index.js +0 -155
  1054. package/dist/index.js.map +0 -1
  1055. package/dist/index.web.d.ts +0 -49
  1056. package/dist/index.web.d.ts.map +0 -1
  1057. package/dist/index.web.js +0 -113
  1058. package/dist/index.web.js.map +0 -1
  1059. package/dist/livekit.d.ts +0 -24
  1060. package/dist/livekit.d.ts.map +0 -1
  1061. package/dist/livekit.js +0 -57
  1062. package/dist/livekit.js.map +0 -1
  1063. package/dist/types.d.ts +0 -74
  1064. package/dist/types.d.ts.map +0 -1
  1065. package/dist/types.js +0 -10
  1066. package/dist/types.js.map +0 -1
  1067. package/dist/web/blur-kernel.d.ts +0 -6
  1068. package/dist/web/blur-kernel.d.ts.map +0 -1
  1069. package/dist/web/blur-kernel.js +0 -41
  1070. package/dist/web/blur-kernel.js.map +0 -1
  1071. package/dist/web/effects/background-image.d.ts +0 -3
  1072. package/dist/web/effects/background-image.d.ts.map +0 -1
  1073. package/dist/web/effects/background-image.js +0 -284
  1074. package/dist/web/effects/background-image.js.map +0 -1
  1075. package/dist/web/effects/blur.d.ts +0 -3
  1076. package/dist/web/effects/blur.d.ts.map +0 -1
  1077. package/dist/web/effects/blur.js +0 -339
  1078. package/dist/web/effects/blur.js.map +0 -1
  1079. package/dist/web/effects/transform.d.ts +0 -4
  1080. package/dist/web/effects/transform.d.ts.map +0 -1
  1081. package/dist/web/effects/transform.js +0 -62
  1082. package/dist/web/effects/transform.js.map +0 -1
  1083. package/dist/web/insertable-streams.d.ts.map +0 -1
  1084. package/dist/web/insertable-streams.js +0 -64
  1085. package/dist/web/insertable-streams.js.map +0 -1
  1086. package/dist/web/segmenter.d.ts.map +0 -1
  1087. package/dist/web/segmenter.js +0 -83
  1088. package/dist/web/segmenter.js.map +0 -1
  1089. package/dist/web/shaders.d.ts +0 -2
  1090. package/dist/web/shaders.d.ts.map +0 -1
  1091. package/dist/web/shaders.generated.d.ts +0 -4
  1092. package/dist/web/shaders.generated.d.ts.map +0 -1
  1093. package/dist/web/shaders.generated.js +0 -54
  1094. package/dist/web/shaders.generated.js.map +0 -1
  1095. package/dist/web/shaders.js +0 -32
  1096. package/dist/web/shaders.js.map +0 -1
  1097. package/dist/web/tuning.d.ts.map +0 -1
  1098. package/dist/web/tuning.js +0 -55
  1099. package/dist/web/tuning.js.map +0 -1
  1100. package/ios/KaleidoscopeModule/effects/BackgroundImageProcessor.swift +0 -293
  1101. package/ios/KaleidoscopeModule/effects/BlurProcessor.swift +0 -238
  1102. package/ios/KaleidoscopeModule/resources/backgrounds/dark-office.webp +0 -0
  1103. package/ios/KaleidoscopeModule/resources/backgrounds/debug-resolutions.webp +0 -0
  1104. package/ios/KaleidoscopeModule/resources/backgrounds/home-dark.webp +0 -0
  1105. package/ios/KaleidoscopeModule/resources/backgrounds/home-light.webp +0 -0
  1106. package/ios/KaleidoscopeModule/resources/backgrounds/light-office.webp +0 -0
  1107. package/ios/KaleidoscopeModule/resources/backgrounds/nature-dark.webp +0 -0
  1108. package/ios/KaleidoscopeModule/resources/backgrounds/nature-light.webp +0 -0
  1109. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-dark.webp +0 -0
  1110. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-light.webp +0 -0
  1111. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-dark.webp +0 -0
  1112. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-light.webp +0 -0
  1113. package/ios/KaleidoscopeModule/shaders/blur.metalsrc +0 -72
  1114. package/ios/KaleidoscopeModule/shaders/composite.metalsrc +0 -22
  1115. package/src/backgrounds/README.md +0 -83
  1116. package/src/backgrounds/dark-office.ts +0 -6
  1117. package/src/backgrounds/dark-office.web.ts +0 -9
  1118. package/src/backgrounds/dark-office.webp +0 -0
  1119. package/src/backgrounds/debug-resolutions.ts +0 -7
  1120. package/src/backgrounds/debug-resolutions.web.ts +0 -9
  1121. package/src/backgrounds/debug-resolutions.webp +0 -0
  1122. package/src/backgrounds/home-dark.ts +0 -6
  1123. package/src/backgrounds/home-dark.web.ts +0 -7
  1124. package/src/backgrounds/home-dark.webp +0 -0
  1125. package/src/backgrounds/home-light.ts +0 -6
  1126. package/src/backgrounds/home-light.web.ts +0 -7
  1127. package/src/backgrounds/home-light.webp +0 -0
  1128. package/src/backgrounds/index.ts +0 -7
  1129. package/src/backgrounds/light-office.ts +0 -6
  1130. package/src/backgrounds/light-office.web.ts +0 -9
  1131. package/src/backgrounds/light-office.webp +0 -0
  1132. package/src/backgrounds/nature-dark.ts +0 -6
  1133. package/src/backgrounds/nature-dark.web.ts +0 -7
  1134. package/src/backgrounds/nature-dark.webp +0 -0
  1135. package/src/backgrounds/nature-light.ts +0 -6
  1136. package/src/backgrounds/nature-light.web.ts +0 -7
  1137. package/src/backgrounds/nature-light.webp +0 -0
  1138. package/src/backgrounds/preset-source.types.ts +0 -5
  1139. package/src/backgrounds/presets.ts +0 -36
  1140. package/src/backgrounds/simiancraft-dark.ts +0 -6
  1141. package/src/backgrounds/simiancraft-dark.web.ts +0 -7
  1142. package/src/backgrounds/simiancraft-dark.webp +0 -0
  1143. package/src/backgrounds/simiancraft-light.ts +0 -6
  1144. package/src/backgrounds/simiancraft-light.web.ts +0 -7
  1145. package/src/backgrounds/simiancraft-light.webp +0 -0
  1146. package/src/backgrounds/stylized-dark.ts +0 -6
  1147. package/src/backgrounds/stylized-dark.web.ts +0 -7
  1148. package/src/backgrounds/stylized-dark.webp +0 -0
  1149. package/src/backgrounds/stylized-light.ts +0 -6
  1150. package/src/backgrounds/stylized-light.web.ts +0 -7
  1151. package/src/backgrounds/stylized-light.webp +0 -0
  1152. package/src/types.ts +0 -89
  1153. package/src/web/blur-kernel.ts +0 -44
  1154. package/src/web/effects/background-image.ts +0 -364
  1155. package/src/web/effects/blur.ts +0 -430
  1156. package/src/web/effects/transform.ts +0 -69
  1157. package/src/web/insertable-streams.ts +0 -112
  1158. package/src/web/segmenter.ts +0 -107
  1159. package/src/web/shaders.generated.ts +0 -56
  1160. package/src/web/shaders.ts +0 -31
  1161. package/src/web/tuning.ts +0 -67
  1162. /package/{src/backgrounds → catalog/images}/assets.d.ts +0 -0
  1163. /package/{android/src/main/assets/backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1164. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1165. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-light.webp +0 -0
  1166. /package/{android/src/main/assets/backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1167. /package/{android/src/main/assets/backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1168. /package/{android/src/main/assets/backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1169. /package/{android/src/main/assets/backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1170. /package/{android/src/main/assets/backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1171. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1172. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1173. /package/dist/{backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1174. /package/dist/{backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1175. /package/dist/{backgrounds → catalog/images/home}/home-light.webp +0 -0
  1176. /package/dist/{backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1177. /package/dist/{backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1178. /package/dist/{backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1179. /package/dist/{backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1180. /package/dist/{backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1181. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1182. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1183. /package/dist/{web → web-driver}/insertable-streams.d.ts +0 -0
  1184. /package/dist/{web → web-driver}/segmenter.d.ts +0 -0
  1185. /package/dist/{web → web-driver}/tuning.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon-field.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/polygon-field.tsx"],"names":[],"mappings":"AAiBA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,iBAAiB,2CAmDzE","sourcesContent":["// PolygonField: editor for a `kind: 'polygon'` uniform (a vec2 array, stored flat\n// as [x0,y0, x1,y1, ...]). It is COMPOSED OF POINTS: one <Point> editor per vertex,\n// laid out in a SPATIAL GRID rather than a flat row, so the editors sit where their\n// corners are. With the row-major corner convention (p0=TL, p1=TR, p2=BL, p3=BR), a\n// 2-column grid puts each editor in its quad position: top-left edits the top-left\n// corner. The grid is √-shaped (cols = ceil(√points)), so a 4-point polygon is 2x2.\n// Self-wires the flat array via `useField`; each Point writes back its (x, y) slice.\n\nimport { StyleSheet, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { Label } from './label';\nimport { Point } from './point';\n\n/** Editing range for both axes; shaft anchors sit slightly off-screen (-0.2..1.2). */\nconst RANGE_MIN = -0.2;\nconst RANGE_MAX = 1.2;\n\nexport type PolygonFieldProps = {\n /** The uniform key this field drives: a vec2 array, flat [x0,y0, x1,y1, ...]. */\n readonly uniform: string;\n /** Number of polygon vertices; laid out in a ceil(√points)-column grid. */\n readonly points: number;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n};\n\nexport function PolygonField({ uniform, points, label }: PolygonFieldProps) {\n const field = useField(uniform);\n const flat = Array.isArray(field.value) ? field.value : [];\n const name = label ?? uniform;\n\n const setPoint = (p: number, x: number, y: number) => {\n const next = flat.slice();\n while (next.length < points * 2) next.push(0);\n next[p * 2] = x;\n next[p * 2 + 1] = y;\n field.onChange(next);\n };\n\n // Spatial grid: cols = ceil(√points) (2 for a quad), filled row-major so vertex\n // order maps to grid position. Array.from callbacks (not mutated for-counters)\n // keep the per-Point onChange closures off the React Compiler's bail list.\n const cols = Math.max(1, Math.ceil(Math.sqrt(points)));\n const rowCount = Math.ceil(points / cols);\n\n return (\n <View style={styles.wrap}>\n <Label>{name}</Label>\n <View style={styles.grid}>\n {Array.from({ length: rowCount }, (_, r) => (\n <View\n // biome-ignore lint/suspicious/noArrayIndexKey: grid rows are positional and fixed in count.\n key={r}\n style={styles.gridRow}\n >\n {Array.from({ length: cols }, (_, ci) => {\n const p = r * cols + ci;\n if (p >= points) return null;\n return (\n <Point\n key={p}\n x={flat[p * 2] ?? 0}\n y={flat[p * 2 + 1] ?? 0}\n min={RANGE_MIN}\n max={RANGE_MAX}\n label={`p${p}`}\n disabled={field.disabled}\n testID={`${field.testID}.${p}`}\n onChange={(x, y) => setPoint(p, x, y)}\n />\n );\n })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { gap: 4 },\n grid: { gap: 8, alignSelf: 'flex-start' },\n gridRow: { flexDirection: 'row', gap: 8 },\n});\n"]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PolygonField = PolygonField;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // PolygonField: editor for a `kind: 'polygon'` uniform (a vec2 array, stored flat
6
+ // as [x0,y0, x1,y1, ...]). It is COMPOSED OF POINTS: one <Point> editor per vertex,
7
+ // laid out in a SPATIAL GRID rather than a flat row, so the editors sit where their
8
+ // corners are. With the row-major corner convention (p0=TL, p1=TR, p2=BL, p3=BR), a
9
+ // 2-column grid puts each editor in its quad position: top-left edits the top-left
10
+ // corner. The grid is √-shaped (cols = ceil(√points)), so a 4-point polygon is 2x2.
11
+ // Self-wires the flat array via `useField`; each Point writes back its (x, y) slice.
12
+ const react_native_1 = require("react-native");
13
+ const use_field_1 = require("../form/use-field");
14
+ const label_1 = require("./label");
15
+ const point_1 = require("./point");
16
+ /** Editing range for both axes; shaft anchors sit slightly off-screen (-0.2..1.2). */
17
+ const RANGE_MIN = -0.2;
18
+ const RANGE_MAX = 1.2;
19
+ function PolygonField({ uniform, points, label }) {
20
+ const field = (0, use_field_1.useField)(uniform);
21
+ const flat = Array.isArray(field.value) ? field.value : [];
22
+ const name = label ?? uniform;
23
+ const setPoint = (p, x, y) => {
24
+ const next = flat.slice();
25
+ while (next.length < points * 2)
26
+ next.push(0);
27
+ next[p * 2] = x;
28
+ next[p * 2 + 1] = y;
29
+ field.onChange(next);
30
+ };
31
+ // Spatial grid: cols = ceil(√points) (2 for a quad), filled row-major so vertex
32
+ // order maps to grid position. Array.from callbacks (not mutated for-counters)
33
+ // keep the per-Point onChange closures off the React Compiler's bail list.
34
+ const cols = Math.max(1, Math.ceil(Math.sqrt(points)));
35
+ const rowCount = Math.ceil(points / cols);
36
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.wrap, children: [(0, jsx_runtime_1.jsx)(label_1.Label, { children: name }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.grid, children: Array.from({ length: rowCount }, (_, r) => ((0, jsx_runtime_1.jsx)(react_native_1.View
37
+ // biome-ignore lint/suspicious/noArrayIndexKey: grid rows are positional and fixed in count.
38
+ , { style: styles.gridRow, children: Array.from({ length: cols }, (_, ci) => {
39
+ const p = r * cols + ci;
40
+ if (p >= points)
41
+ return null;
42
+ return ((0, jsx_runtime_1.jsx)(point_1.Point, { x: flat[p * 2] ?? 0, y: flat[p * 2 + 1] ?? 0, min: RANGE_MIN, max: RANGE_MAX, label: `p${p}`, disabled: field.disabled, testID: `${field.testID}.${p}`, onChange: (x, y) => setPoint(p, x, y) }, p));
43
+ }) }, r))) })] }));
44
+ }
45
+ const styles = react_native_1.StyleSheet.create({
46
+ wrap: { gap: 4 },
47
+ grid: { gap: 8, alignSelf: 'flex-start' },
48
+ gridRow: { flexDirection: 'row', gap: 8 },
49
+ });
50
+ //# sourceMappingURL=polygon-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon-field.js","sourceRoot":"","sources":["../../../../src/components/ui/polygon-field.tsx"],"names":[],"mappings":"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","sourcesContent":["// PolygonField: editor for a `kind: 'polygon'` uniform (a vec2 array, stored flat\n// as [x0,y0, x1,y1, ...]). It is COMPOSED OF POINTS: one <Point> editor per vertex,\n// laid out in a SPATIAL GRID rather than a flat row, so the editors sit where their\n// corners are. With the row-major corner convention (p0=TL, p1=TR, p2=BL, p3=BR), a\n// 2-column grid puts each editor in its quad position: top-left edits the top-left\n// corner. The grid is √-shaped (cols = ceil(√points)), so a 4-point polygon is 2x2.\n// Self-wires the flat array via `useField`; each Point writes back its (x, y) slice.\n\nimport { StyleSheet, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { Label } from './label';\nimport { Point } from './point';\n\n/** Editing range for both axes; shaft anchors sit slightly off-screen (-0.2..1.2). */\nconst RANGE_MIN = -0.2;\nconst RANGE_MAX = 1.2;\n\nexport type PolygonFieldProps = {\n /** The uniform key this field drives: a vec2 array, flat [x0,y0, x1,y1, ...]. */\n readonly uniform: string;\n /** Number of polygon vertices; laid out in a ceil(√points)-column grid. */\n readonly points: number;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n};\n\nexport function PolygonField({ uniform, points, label }: PolygonFieldProps) {\n const field = useField(uniform);\n const flat = Array.isArray(field.value) ? field.value : [];\n const name = label ?? uniform;\n\n const setPoint = (p: number, x: number, y: number) => {\n const next = flat.slice();\n while (next.length < points * 2) next.push(0);\n next[p * 2] = x;\n next[p * 2 + 1] = y;\n field.onChange(next);\n };\n\n // Spatial grid: cols = ceil(√points) (2 for a quad), filled row-major so vertex\n // order maps to grid position. Array.from callbacks (not mutated for-counters)\n // keep the per-Point onChange closures off the React Compiler's bail list.\n const cols = Math.max(1, Math.ceil(Math.sqrt(points)));\n const rowCount = Math.ceil(points / cols);\n\n return (\n <View style={styles.wrap}>\n <Label>{name}</Label>\n <View style={styles.grid}>\n {Array.from({ length: rowCount }, (_, r) => (\n <View\n // biome-ignore lint/suspicious/noArrayIndexKey: grid rows are positional and fixed in count.\n key={r}\n style={styles.gridRow}\n >\n {Array.from({ length: cols }, (_, ci) => {\n const p = r * cols + ci;\n if (p >= points) return null;\n return (\n <Point\n key={p}\n x={flat[p * 2] ?? 0}\n y={flat[p * 2 + 1] ?? 0}\n min={RANGE_MIN}\n max={RANGE_MAX}\n label={`p${p}`}\n disabled={field.disabled}\n testID={`${field.testID}.${p}`}\n onChange={(x, y) => setPoint(p, x, y)}\n />\n );\n })}\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { gap: 4 },\n grid: { gap: 8, alignSelf: 'flex-start' },\n gridRow: { flexDirection: 'row', gap: 8 },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { StyleProp, TextStyle } from 'react-native';
3
+ export type ReadoutProps = {
4
+ readonly children: ReactNode;
5
+ /** NativeWind class; resolved via the `./nativewind` interop. */
6
+ readonly className?: string;
7
+ readonly style?: StyleProp<TextStyle>;
8
+ };
9
+ export declare function Readout({ children, style }: ReadoutProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=readout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readout.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/readout.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,YAAY,2CAKxD","sourcesContent":["// Readout: a themed Text for a control's current value (distinct slot from the\n// label, and named `readout` to avoid colliding with a control's mutating value).\n\nimport type { ReactNode } from 'react';\nimport type { StyleProp, TextStyle } from 'react-native';\nimport { StyleSheet, Text } from 'react-native';\nimport { useThemeSlot } from '../theme/provider';\n\nexport type ReadoutProps = {\n readonly children: ReactNode;\n /** NativeWind class; resolved via the `./nativewind` interop. */\n readonly className?: string;\n readonly style?: StyleProp<TextStyle>;\n};\n\nexport function Readout({ children, style }: ReadoutProps) {\n const { style: themeStyle } = useThemeSlot('readout');\n return (\n <Text style={[styles.readout, themeStyle as StyleProp<TextStyle>, style]}>{children}</Text>\n );\n}\n\nconst styles = StyleSheet.create({\n readout: { color: '#8888ff', fontSize: 12, fontVariant: ['tabular-nums'] },\n});\n"]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Readout = Readout;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const provider_1 = require("../theme/provider");
7
+ function Readout({ children, style }) {
8
+ const { style: themeStyle } = (0, provider_1.useThemeSlot)('readout');
9
+ return ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.readout, themeStyle, style], children: children }));
10
+ }
11
+ const styles = react_native_1.StyleSheet.create({
12
+ readout: { color: '#8888ff', fontSize: 12, fontVariant: ['tabular-nums'] },
13
+ });
14
+ //# sourceMappingURL=readout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readout.js","sourceRoot":"","sources":["../../../../src/components/ui/readout.tsx"],"names":[],"mappings":";;;;AAKA,+CAAgD;AAChD,gDAAiD;AASjD,iBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAgB;IACvD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAY,EAAC,SAAS,CAAC,CAAC;IACtD,OAAO,CACL,uBAAC,mBAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,UAAkC,EAAE,KAAK,CAAC,YAAG,QAAQ,GAAQ,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE;CAC3E,CAAC,CAAC","sourcesContent":["// Readout: a themed Text for a control's current value (distinct slot from the\n// label, and named `readout` to avoid colliding with a control's mutating value).\n\nimport type { ReactNode } from 'react';\nimport type { StyleProp, TextStyle } from 'react-native';\nimport { StyleSheet, Text } from 'react-native';\nimport { useThemeSlot } from '../theme/provider';\n\nexport type ReadoutProps = {\n readonly children: ReactNode;\n /** NativeWind class; resolved via the `./nativewind` interop. */\n readonly className?: string;\n readonly style?: StyleProp<TextStyle>;\n};\n\nexport function Readout({ children, style }: ReadoutProps) {\n const { style: themeStyle } = useThemeSlot('readout');\n return (\n <Text style={[styles.readout, themeStyle as StyleProp<TextStyle>, style]}>{children}</Text>\n );\n}\n\nconst styles = StyleSheet.create({\n readout: { color: '#8888ff', fontSize: 12, fontVariant: ['tabular-nums'] },\n});\n"]}
@@ -0,0 +1,8 @@
1
+ export declare const safeSliderValue: (v: number) => number;
2
+ /** Shared track/thumb tints so every slider in the kit reads the same. */
3
+ export declare const SLIDER_TINTS: {
4
+ readonly minimumTrackTintColor: '#8888ff';
5
+ readonly maximumTrackTintColor: '#444';
6
+ readonly thumbTintColor: '#eeeeff';
7
+ };
8
+ //# sourceMappingURL=slider-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-value.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/slider-value.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,MAAO,MAAM,KAAG,MACQ,CAAC;AAErD,0EAA0E;AAC1E,eAAO,MAAM,YAAY;aACvB,qBAAqB,EAAE,SAAS;aAChC,qBAAqB,EAAE,MAAM;aAC7B,cAAc,EAAE,SAAS;CACjB,CAAC","sourcesContent":["// The web slider wrapper maps an exact 0 (and NaN/undefined) to `undefined`,\n// then crashes calling `.toFixed()` on it. A hair above zero is visually\n// identical and keeps the control alive; the real (possibly 0) value still\n// flows through onChange and the readout, so this is presentation-only.\nconst SLIDER_EPSILON = 1e-4;\n\nexport const safeSliderValue = (v: number): number =>\n Number.isFinite(v) && v !== 0 ? v : SLIDER_EPSILON;\n\n/** Shared track/thumb tints so every slider in the kit reads the same. */\nexport const SLIDER_TINTS = {\n minimumTrackTintColor: '#8888ff',\n maximumTrackTintColor: '#444',\n thumbTintColor: '#eeeeff',\n} as const;\n"]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SLIDER_TINTS = exports.safeSliderValue = void 0;
4
+ // The web slider wrapper maps an exact 0 (and NaN/undefined) to `undefined`,
5
+ // then crashes calling `.toFixed()` on it. A hair above zero is visually
6
+ // identical and keeps the control alive; the real (possibly 0) value still
7
+ // flows through onChange and the readout, so this is presentation-only.
8
+ const SLIDER_EPSILON = 1e-4;
9
+ const safeSliderValue = (v) => Number.isFinite(v) && v !== 0 ? v : SLIDER_EPSILON;
10
+ exports.safeSliderValue = safeSliderValue;
11
+ /** Shared track/thumb tints so every slider in the kit reads the same. */
12
+ exports.SLIDER_TINTS = {
13
+ minimumTrackTintColor: '#8888ff',
14
+ maximumTrackTintColor: '#444',
15
+ thumbTintColor: '#eeeeff',
16
+ };
17
+ //# sourceMappingURL=slider-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-value.js","sourceRoot":"","sources":["../../../../src/components/ui/slider-value.ts"],"names":[],"mappings":";;;AAAA,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,MAAM,cAAc,GAAG,IAAI,CAAC;AAErB,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE,CACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AADxC,QAAA,eAAe,GAAf,eAAe,CACyB;AAErD,0EAA0E;AAC7D,QAAA,YAAY,GAAG;IAC1B,qBAAqB,EAAE,SAAS;IAChC,qBAAqB,EAAE,MAAM;IAC7B,cAAc,EAAE,SAAS;CACjB,CAAC","sourcesContent":["// The web slider wrapper maps an exact 0 (and NaN/undefined) to `undefined`,\n// then crashes calling `.toFixed()` on it. A hair above zero is visually\n// identical and keeps the control alive; the real (possibly 0) value still\n// flows through onChange and the readout, so this is presentation-only.\nconst SLIDER_EPSILON = 1e-4;\n\nexport const safeSliderValue = (v: number): number =>\n Number.isFinite(v) && v !== 0 ? v : SLIDER_EPSILON;\n\n/** Shared track/thumb tints so every slider in the kit reads the same. */\nexport const SLIDER_TINTS = {\n minimumTrackTintColor: '#8888ff',\n maximumTrackTintColor: '#444',\n thumbTintColor: '#eeeeff',\n} as const;\n"]}
@@ -0,0 +1,15 @@
1
+ import type { StyleProp, ViewStyle } from 'react-native';
2
+ export type SliderProps = {
3
+ /** The uniform key this slider drives (a scalar). */
4
+ readonly uniform: string;
5
+ readonly min: number;
6
+ readonly max: number;
7
+ readonly step?: number;
8
+ /** Display name; defaults to the uniform key. */
9
+ readonly label?: string;
10
+ /** NativeWind class for the container; resolved via the `./nativewind` interop. */
11
+ readonly className?: string;
12
+ readonly style?: StyleProp<ViewStyle>;
13
+ };
14
+ export declare function Slider({ uniform, min, max, step, label, style }: SliderProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/slider.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD,MAAM,MAAM,WAAW,GAAG;IACxB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,2CAkDnF","sourcesContent":["// Slider: a self-wiring scalar field. Reads/writes its uniform via `useField`\n// (so the thumb tracks the drag synchronously; only the ControlForm's emit\n// debounces), and pairs the slider with a typed number input so you can drag OR\n// type/paste an exact value. Renders its own label, themes via the `slider` slot.\n\nimport RNSlider from '@react-native-community/slider';\nimport { useState } from 'react';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { StyleSheet, TextInput, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { useThemeSlot } from '../theme/provider';\nimport { Label } from './label';\nimport { SLIDER_TINTS, safeSliderValue } from './slider-value';\n\nconst fmt = (v: number) => (Number.isFinite(v) ? String(Math.round(v * 1000) / 1000) : '0');\n\nexport type SliderProps = {\n /** The uniform key this slider drives (a scalar). */\n readonly uniform: string;\n readonly min: number;\n readonly max: number;\n readonly step?: number;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n /** NativeWind class for the container; resolved via the `./nativewind` interop. */\n readonly className?: string;\n readonly style?: StyleProp<ViewStyle>;\n};\n\nexport function Slider({ uniform, min, max, step = 0.01, label, style }: SliderProps) {\n const field = useField(uniform);\n const { style: themeStyle } = useThemeSlot('slider');\n const value = typeof field.value === 'number' ? field.value : 0;\n const name = label ?? uniform;\n\n // The number input holds its own draft text so partial entries (\"0.\", \"-\") and\n // pastes survive; the slider writes the draft too, so dragging keeps it in sync.\n // A preset switch remounts the form, so the draft re-seeds from the new value.\n const [draft, setDraft] = useState(() => fmt(value));\n\n const fromSlider = (v: number) => {\n setDraft(fmt(v));\n field.onChange(v);\n };\n const fromText = (t: string) => {\n setDraft(t);\n const v = Number.parseFloat(t);\n if (Number.isFinite(v)) field.onChange(Math.min(max, Math.max(min, v)));\n };\n\n return (\n <View style={[styles.row, themeStyle as StyleProp<ViewStyle>, style]}>\n <View style={styles.line}>\n <Label>{name}</Label>\n <TextInput\n style={styles.num}\n testID={field.testID ? `${field.testID}.num` : undefined}\n accessibilityLabel={`${name} value`}\n value={draft}\n keyboardType=\"numeric\"\n editable={!field.disabled}\n selectTextOnFocus\n onChangeText={fromText}\n />\n </View>\n <RNSlider\n style={styles.slider}\n testID={field.testID}\n accessibilityLabel={name}\n minimumValue={min}\n maximumValue={max}\n step={step}\n value={safeSliderValue(value)}\n disabled={field.disabled}\n onValueChange={fromSlider}\n {...SLIDER_TINTS}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: { gap: 2 },\n line: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },\n num: {\n minWidth: 56,\n color: '#8888ff',\n fontSize: 12,\n fontVariant: ['tabular-nums'],\n textAlign: 'right',\n paddingVertical: 0,\n paddingHorizontal: 4,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(136,136,255,0.4)',\n borderRadius: 3,\n },\n slider: { width: '100%', height: 32 },\n});\n"]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Slider = Slider;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ // Slider: a self-wiring scalar field. Reads/writes its uniform via `useField`
9
+ // (so the thumb tracks the drag synchronously; only the ControlForm's emit
10
+ // debounces), and pairs the slider with a typed number input so you can drag OR
11
+ // type/paste an exact value. Renders its own label, themes via the `slider` slot.
12
+ const slider_1 = __importDefault(require("@react-native-community/slider"));
13
+ const react_1 = require("react");
14
+ const react_native_1 = require("react-native");
15
+ const use_field_1 = require("../form/use-field");
16
+ const provider_1 = require("../theme/provider");
17
+ const label_1 = require("./label");
18
+ const slider_value_1 = require("./slider-value");
19
+ const fmt = (v) => (Number.isFinite(v) ? String(Math.round(v * 1000) / 1000) : '0');
20
+ function Slider({ uniform, min, max, step = 0.01, label, style }) {
21
+ const field = (0, use_field_1.useField)(uniform);
22
+ const { style: themeStyle } = (0, provider_1.useThemeSlot)('slider');
23
+ const value = typeof field.value === 'number' ? field.value : 0;
24
+ const name = label ?? uniform;
25
+ // The number input holds its own draft text so partial entries ("0.", "-") and
26
+ // pastes survive; the slider writes the draft too, so dragging keeps it in sync.
27
+ // A preset switch remounts the form, so the draft re-seeds from the new value.
28
+ const [draft, setDraft] = (0, react_1.useState)(() => fmt(value));
29
+ const fromSlider = (v) => {
30
+ setDraft(fmt(v));
31
+ field.onChange(v);
32
+ };
33
+ const fromText = (t) => {
34
+ setDraft(t);
35
+ const v = Number.parseFloat(t);
36
+ if (Number.isFinite(v))
37
+ field.onChange(Math.min(max, Math.max(min, v)));
38
+ };
39
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.row, themeStyle, style], children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.line, children: [(0, jsx_runtime_1.jsx)(label_1.Label, { children: name }), (0, jsx_runtime_1.jsx)(react_native_1.TextInput, { style: styles.num, testID: field.testID ? `${field.testID}.num` : undefined, accessibilityLabel: `${name} value`, value: draft, keyboardType: "numeric", editable: !field.disabled, selectTextOnFocus: true, onChangeText: fromText })] }), (0, jsx_runtime_1.jsx)(slider_1.default, { style: styles.slider, testID: field.testID, accessibilityLabel: name, minimumValue: min, maximumValue: max, step: step, value: (0, slider_value_1.safeSliderValue)(value), disabled: field.disabled, onValueChange: fromSlider, ...slider_value_1.SLIDER_TINTS })] }));
40
+ }
41
+ const styles = react_native_1.StyleSheet.create({
42
+ row: { gap: 2 },
43
+ line: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
44
+ num: {
45
+ minWidth: 56,
46
+ color: '#8888ff',
47
+ fontSize: 12,
48
+ fontVariant: ['tabular-nums'],
49
+ textAlign: 'right',
50
+ paddingVertical: 0,
51
+ paddingHorizontal: 4,
52
+ borderWidth: react_native_1.StyleSheet.hairlineWidth,
53
+ borderColor: 'rgba(136,136,255,0.4)',
54
+ borderRadius: 3,
55
+ },
56
+ slider: { width: '100%', height: 32 },
57
+ });
58
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../../../src/components/ui/slider.tsx"],"names":[],"mappings":"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","sourcesContent":["// Slider: a self-wiring scalar field. Reads/writes its uniform via `useField`\n// (so the thumb tracks the drag synchronously; only the ControlForm's emit\n// debounces), and pairs the slider with a typed number input so you can drag OR\n// type/paste an exact value. Renders its own label, themes via the `slider` slot.\n\nimport RNSlider from '@react-native-community/slider';\nimport { useState } from 'react';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { StyleSheet, TextInput, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { useThemeSlot } from '../theme/provider';\nimport { Label } from './label';\nimport { SLIDER_TINTS, safeSliderValue } from './slider-value';\n\nconst fmt = (v: number) => (Number.isFinite(v) ? String(Math.round(v * 1000) / 1000) : '0');\n\nexport type SliderProps = {\n /** The uniform key this slider drives (a scalar). */\n readonly uniform: string;\n readonly min: number;\n readonly max: number;\n readonly step?: number;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n /** NativeWind class for the container; resolved via the `./nativewind` interop. */\n readonly className?: string;\n readonly style?: StyleProp<ViewStyle>;\n};\n\nexport function Slider({ uniform, min, max, step = 0.01, label, style }: SliderProps) {\n const field = useField(uniform);\n const { style: themeStyle } = useThemeSlot('slider');\n const value = typeof field.value === 'number' ? field.value : 0;\n const name = label ?? uniform;\n\n // The number input holds its own draft text so partial entries (\"0.\", \"-\") and\n // pastes survive; the slider writes the draft too, so dragging keeps it in sync.\n // A preset switch remounts the form, so the draft re-seeds from the new value.\n const [draft, setDraft] = useState(() => fmt(value));\n\n const fromSlider = (v: number) => {\n setDraft(fmt(v));\n field.onChange(v);\n };\n const fromText = (t: string) => {\n setDraft(t);\n const v = Number.parseFloat(t);\n if (Number.isFinite(v)) field.onChange(Math.min(max, Math.max(min, v)));\n };\n\n return (\n <View style={[styles.row, themeStyle as StyleProp<ViewStyle>, style]}>\n <View style={styles.line}>\n <Label>{name}</Label>\n <TextInput\n style={styles.num}\n testID={field.testID ? `${field.testID}.num` : undefined}\n accessibilityLabel={`${name} value`}\n value={draft}\n keyboardType=\"numeric\"\n editable={!field.disabled}\n selectTextOnFocus\n onChangeText={fromText}\n />\n </View>\n <RNSlider\n style={styles.slider}\n testID={field.testID}\n accessibilityLabel={name}\n minimumValue={min}\n maximumValue={max}\n step={step}\n value={safeSliderValue(value)}\n disabled={field.disabled}\n onValueChange={fromSlider}\n {...SLIDER_TINTS}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: { gap: 2 },\n line: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },\n num: {\n minWidth: 56,\n color: '#8888ff',\n fontSize: 12,\n fontVariant: ['tabular-nums'],\n textAlign: 'right',\n paddingVertical: 0,\n paddingHorizontal: 4,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(136,136,255,0.4)',\n borderRadius: 3,\n },\n slider: { width: '100%', height: 32 },\n});\n"]}
@@ -0,0 +1,8 @@
1
+ export type SwitchProps = {
2
+ /** The uniform key this switch drives (0 = off, 1 = on). */
3
+ readonly uniform: string;
4
+ /** Display name; defaults to the uniform key. */
5
+ readonly label?: string;
6
+ };
7
+ export declare function Switch({ uniform, label }: SwitchProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/switch.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,2CAgBrD","sourcesContent":["// Switch: a self-wiring boolean field for `kind: 'switch'` uniforms (0/1). Reads\n// and writes its uniform via `useField`, the same contract as Slider/ColorPicker.\n\nimport { Switch as RNSwitch, StyleSheet, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { Label } from './label';\n\nexport type SwitchProps = {\n /** The uniform key this switch drives (0 = off, 1 = on). */\n readonly uniform: string;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n};\n\nexport function Switch({ uniform, label }: SwitchProps) {\n const field = useField(uniform);\n const on = (typeof field.value === 'number' ? field.value : 0) > 0.5;\n const name = label ?? uniform;\n return (\n <View style={styles.row}>\n <Label>{name}</Label>\n <RNSwitch\n testID={field.testID}\n accessibilityLabel={name}\n value={on}\n disabled={field.disabled}\n onValueChange={(v) => field.onChange(v ? 1 : 0)}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingVertical: 2,\n },\n});\n"]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Switch = Switch;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // Switch: a self-wiring boolean field for `kind: 'switch'` uniforms (0/1). Reads
6
+ // and writes its uniform via `useField`, the same contract as Slider/ColorPicker.
7
+ const react_native_1 = require("react-native");
8
+ const use_field_1 = require("../form/use-field");
9
+ const label_1 = require("./label");
10
+ function Switch({ uniform, label }) {
11
+ const field = (0, use_field_1.useField)(uniform);
12
+ const on = (typeof field.value === 'number' ? field.value : 0) > 0.5;
13
+ const name = label ?? uniform;
14
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.row, children: [(0, jsx_runtime_1.jsx)(label_1.Label, { children: name }), (0, jsx_runtime_1.jsx)(react_native_1.Switch, { testID: field.testID, accessibilityLabel: name, value: on, disabled: field.disabled, onValueChange: (v) => field.onChange(v ? 1 : 0) })] }));
15
+ }
16
+ const styles = react_native_1.StyleSheet.create({
17
+ row: {
18
+ flexDirection: 'row',
19
+ justifyContent: 'space-between',
20
+ alignItems: 'center',
21
+ paddingVertical: 2,
22
+ },
23
+ });
24
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../../src/components/ui/switch.tsx"],"names":[],"mappings":";;;;AAAA,iFAAiF;AACjF,kFAAkF;AAElF,+CAAoE;AACpE,iDAA6C;AAC7C,mCAAgC;AAShC,gBAAuB,EAAE,OAAO,EAAE,KAAK,EAAe;IACpD,MAAM,KAAK,GAAG,IAAA,oBAAQ,EAAC,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,CAAC;IAC9B,OAAO,CACL,wBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,GAAG,aACrB,uBAAC,aAAK,cAAE,IAAI,GAAS,EACrB,uBAAC,qBAAQ,IACP,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,kBAAkB,EAAE,IAAI,EACxB,KAAK,EAAE,EAAE,EACT,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC/C,IACG,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE;QACH,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,CAAC;KACnB;CACF,CAAC,CAAC","sourcesContent":["// Switch: a self-wiring boolean field for `kind: 'switch'` uniforms (0/1). Reads\n// and writes its uniform via `useField`, the same contract as Slider/ColorPicker.\n\nimport { Switch as RNSwitch, StyleSheet, View } from 'react-native';\nimport { useField } from '../form/use-field';\nimport { Label } from './label';\n\nexport type SwitchProps = {\n /** The uniform key this switch drives (0 = off, 1 = on). */\n readonly uniform: string;\n /** Display name; defaults to the uniform key. */\n readonly label?: string;\n};\n\nexport function Switch({ uniform, label }: SwitchProps) {\n const field = useField(uniform);\n const on = (typeof field.value === 'number' ? field.value : 0) > 0.5;\n const name = label ?? uniform;\n return (\n <View style={styles.row}>\n <Label>{name}</Label>\n <RNSwitch\n testID={field.testID}\n accessibilityLabel={name}\n value={on}\n disabled={field.disabled}\n onValueChange={(v) => field.onChange(v ? 1 : 0)}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingVertical: 2,\n },\n});\n"]}
@@ -0,0 +1,18 @@
1
+ import type { KaleidoscopeBinding, KaleidoscopeBindOptions } from './kaleidoscope/types';
2
+ import type { KaleidoscopePresetBook } from './kaleidoscope.preset-book.types';
3
+ export type { CatalogImageId } from '../catalog/images';
4
+ export type { AnamorphicLensFlareUniforms, BlurUniforms, CloudsUniforms, CorporateBlobsUniforms, FirefliesUniforms, GodraysUniforms, LayerShaderName, LayerShaderOptions, LightBeamsAndMotesUniforms, NebulaUniforms, PatchableShaderName, PlasmaUniforms, ShaderUniformsMap, SimianlightsUniforms, UniformControl, } from '../catalog/shaders';
5
+ export { ANAMORPHIC_LENSFLARE_CONTROLS, BLUR_CONTROLS, CLOUDS_CONTROLS, CORPORATE_BLOBS_CONTROLS, defaultUniforms, FIREFLIES_CONTROLS, GODRAYS_CONTROLS, LIGHT_BEAMS_AND_MOTES_CONTROLS, NEBULA_CONTROLS, PLASMA_CONTROLS, SIMIANLIGHTS_CONTROLS, } from '../catalog/shaders';
6
+ export type { CompositeSpec, EffectInput, EffectName, EffectSpec, TransformName, TransformSpec, } from './kaleidoscope/effect.types';
7
+ export type { KaleidoscopeBinding, KaleidoscopeBindOptions, MaskInput, PatchesFor, PatchFor, TransformInput, } from './kaleidoscope/types';
8
+ export type { KaleidoscopeBlendMode, KaleidoscopeControls, KaleidoscopeLayer, KaleidoscopeLayerTarget, KaleidoscopePreset, KaleidoscopePresetBook, KaleidoscopePresetEntry, KaleidoscopeTaxonomy, } from './kaleidoscope.preset-book.types';
9
+ export type { RGB } from './lib/primitives.types';
10
+ /**
11
+ * Bind a track and a preset book; get the three verbs back
12
+ * (`{ kaleidoscope, transform, mask }`). On native the track is mutated in
13
+ * place, so `controls.track` is the bound track and `onTrack` fires with it
14
+ * after each `kaleidoscope` preset switch and `transform` command. `mask`
15
+ * updates the segmentation edge the per-frame processors read.
16
+ */
17
+ export declare const bindKaleidoscope: <P extends KaleidoscopePresetBook>(track: MediaStreamTrack, options: KaleidoscopeBindOptions<P>) => KaleidoscopeBinding<P>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAqB,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AA6BlG,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EACV,2BAA2B,EAC3B,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,6BAA6B,EAC7B,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,8BAA8B,EAC9B,eAAe,EACf,eAAe,EACf,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AA6JlD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,sBAAsB,SACxD,gBAAgB,WACd,uBAAuB,CAAC,CAAC,CAAC,KAClC,mBAAmB,CAAC,CAAC,CAmBvB,CAAC","sourcesContent":["// Native entry point. Metro picks this up via package.json \"react-native\"\n// and the \".\" subpath export's \"react-native\" condition.\n//\n// Thin facade over `track._setVideoEffects(names)` from react-native-webrtc.\n// Native frame processors are registered at app boot by the Expo Module's\n// OnCreate hook (see android/.../KaleidoscopeModule.kt and ios/.../KaleidoscopeModule.swift);\n// this facade just dispatches into the existing upstream registry.\n\nimport { requireNativeModule } from 'expo-modules-core';\nimport { Platform } from 'react-native';\nimport {\n createControls,\n type Reconcile,\n type ResetLayerUniforms,\n type SetLayerUniforms,\n type SetMask,\n} from './kaleidoscope/controls';\nimport { toEffectSpec } from './kaleidoscope/effect';\nimport type { ApplyVideoEffects, CompositeSpec } from './kaleidoscope/effect.types';\nimport type { KaleidoscopeBinding, KaleidoscopeBindOptions } from './kaleidoscope/types';\nimport type { KaleidoscopeLayer, KaleidoscopePresetBook } from './kaleidoscope.preset-book.types';\n\n// The native module's tuning functions. Only the three the JS layer drives are\n// declared: blur sigma (from a blur preset's options) and the mask edge (from\n// the mask() verb). The native module also exposes segmentation/debug/reset\n// functions, but nothing in JS calls them anymore, so they're not declared here.\ninterface KaleidoscopeNativeModule {\n setMaskHardness: (value: number) => void;\n setMaskThreshold: (value: number) => void;\n // KaleidoscopePreset layer-stack channel. Optional: a native build predating the\n // compositor won't expose it, so callers guard with `?.`. JS sends the active\n // composite's ordered layer stack as a JSON string; native parses + composites\n // it. Blur sigma and generative uniforms now ride inside each layer's\n // `uniforms`, so there is no separate setBlurSigma/setShaderUniforms channel.\n setCompositeLayers?: (json: string) => void;\n}\n\n// Lazy because the module is not available during pure-JS tests; the\n// getter throws if you call a setter outside a real native runtime, which\n// is the right failure mode.\nconst nativeModule = (): KaleidoscopeNativeModule =>\n requireNativeModule<KaleidoscopeNativeModule>('RnWebrtcKaleidoscope');\n\n// The native tuning functions (setMaskHardness / setMaskThreshold) remain on the\n// native module and are called internally: the mask edge flows from the mask()\n// verb (see bindKaleidoscope). The composite layer stack flows through\n// setCompositeLayers. The old global set* JS exports are gone; effects are driven by\n// kaleidoscope / transform / mask, not loose setters.\n\nexport type { CatalogImageId } from '../catalog/images';\nexport type {\n AnamorphicLensFlareUniforms,\n BlurUniforms,\n CloudsUniforms,\n CorporateBlobsUniforms,\n FirefliesUniforms,\n GodraysUniforms,\n LayerShaderName,\n LayerShaderOptions,\n LightBeamsAndMotesUniforms,\n NebulaUniforms,\n PatchableShaderName,\n PlasmaUniforms,\n ShaderUniformsMap,\n SimianlightsUniforms,\n UniformControl,\n} from '../catalog/shaders';\n// Per-shader control descriptors (platform-agnostic data). Imported individually\n// per the shader a preset's layer uses; there is no all-shaders aggregate.\nexport {\n ANAMORPHIC_LENSFLARE_CONTROLS,\n BLUR_CONTROLS,\n CLOUDS_CONTROLS,\n CORPORATE_BLOBS_CONTROLS,\n defaultUniforms,\n FIREFLIES_CONTROLS,\n GODRAYS_CONTROLS,\n LIGHT_BEAMS_AND_MOTES_CONTROLS,\n NEBULA_CONTROLS,\n PLASMA_CONTROLS,\n SIMIANLIGHTS_CONTROLS,\n} from '../catalog/shaders';\nexport type {\n CompositeSpec,\n EffectInput,\n EffectName,\n EffectSpec,\n TransformName,\n TransformSpec,\n} from './kaleidoscope/effect.types';\nexport type {\n KaleidoscopeBinding,\n KaleidoscopeBindOptions,\n MaskInput,\n PatchesFor,\n PatchFor,\n TransformInput,\n} from './kaleidoscope/types';\nexport type {\n KaleidoscopeBlendMode,\n KaleidoscopeControls,\n KaleidoscopeLayer,\n KaleidoscopeLayerTarget,\n KaleidoscopePreset,\n KaleidoscopePresetBook,\n KaleidoscopePresetEntry,\n KaleidoscopeTaxonomy,\n} from './kaleidoscope.preset-book.types';\nexport type { RGB } from './lib/primitives.types';\n\ninterface WebRTCTrackExtensions {\n remote?: boolean;\n // Upstream's typed signature is `string[]`, but the platforms diverge on\n // how to clear effects:\n // - Android: passing `null` takes the\n // `videoSource.setVideoProcessor(null)` branch (the only correct clear\n // path); passing `[]` crashes EglRenderer.\n // - iOS: the Obj-C method declares `names` as `nonnull NSArray<NSString *>`,\n // so `null` violates the bridge contract; `[]` is the supported clear\n // value (iOS's `VideoEffectProcessor` with no processors is a\n // passthrough).\n // We type the parameter as the union so the facade can platform-split at\n // the call site. See `applyVideoEffects` below.\n _setVideoEffects?: (names: ReadonlyArray<string> | null) => void;\n}\n\n// Effect names registered native-side in Registration.kt / Registration.swift.\n// Anything not in this list gets filtered out before reaching upstream,\n// because rn-webrtc's setVideoEffects calls ProcessorProvider.getProcessor()\n// and filters nulls into an empty list, which then hits the\n// VideoEffectProcessor empty-processors-list bug (refcount goes negative,\n// EglRenderer crashes one frame later). Dropping an unregistered name here is\n// the safe behavior.\n//\n// The art axis is now one registered \"composite\" compositor: blur, images, and\n// generative shaders are all layers inside it, delivered out-of-band via\n// setCompositeLayers. The four geometric transform ops share one native processor\n// per platform (TransformFactory on Android, TransformProcessor on iOS); each is\n// a flat name. iOS registers the same set via ios/.../Registration.swift.\nconst TRANSFORM_EFFECTS: readonly string[] = ['flip-x', 'flip-y', 'rotate-cw', 'rotate-ccw'];\n\n// Android (Registration.kt) and iOS (Registration.swift) install an identical\n// effect set, so one list covers both natives. If the platforms ever diverge,\n// split this back into per-platform lists keyed off Platform.OS.\nconst NATIVE_REGISTERED_EFFECTS_LIST: readonly string[] = [...TRANSFORM_EFFECTS, 'composite'];\n\nconst registeredForPlatform = (): readonly string[] =>\n Platform.OS === 'android' || Platform.OS === 'ios' ? NATIVE_REGISTERED_EFFECTS_LIST : [];\n\nconst NATIVE_REGISTERED_EFFECTS: ReadonlySet<string> = new Set(registeredForPlatform());\n\n// Serialize a composite's layer stack to the JSON shape the native CompositeLayers\n// channel parses: an array of { id, shader, target, blend?, source?, uniforms? }.\n// Every layer carries its `id`. An `image` layer's native `source` IS its `id`\n// (the bundled WebP basename the prebuild plugin copied under that name); all\n// other layers carry their uniforms.\nconst serializeCompositeLayers = (layers: ReadonlyArray<KaleidoscopeLayer>): string => {\n const wire = layers.map((layer) => {\n const base: Record<string, unknown> = {\n id: layer.id,\n shader: layer.shader,\n target: layer.target ?? 'background',\n };\n if (layer.blend != null) base.blend = layer.blend;\n if (layer.shader === 'image') {\n // The layer id is the image id (the bundled WebP basename); the native\n // compositor resolves assets/images/<id>.webp from it.\n base.source = layer.id;\n } else if ('uniforms' in layer) {\n base.uniforms = layer.uniforms;\n }\n return base;\n });\n return JSON.stringify(wire);\n};\n\nconst specToNativeName = (spec: ReturnType<typeof toEffectSpec>): string => {\n // The composite runs through the single registered \"composite\" compositor; its\n // layer stack is delivered out-of-band via setCompositeLayers (see applyVideoEffects).\n if (spec.name === 'composite') {\n return 'composite';\n }\n return spec.name;\n};\n\n// Last effect set applied to each track, as a stable signature. Used to skip\n// redundant native calls: rn-webrtc rebuilds the native frame processors on\n// EVERY _setVideoEffects call (Android constructs a fresh processor per call),\n// so re-issuing an unchanged set (a React re-render, an idempotent effect\n// hook) churns GL + segmentation resources for no reason. The WeakMap lets the\n// entry be collected when the track is.\nconst lastAppliedSignatureByTrack = new WeakMap<object, string>();\n\n// The lower-level native primitive: route a spec array through the upstream\n// `_setVideoEffects`. Internal now (the public surface is the three verbs);\n// `bindKaleidoscope`'s reconcile drives it.\nconst applyVideoEffects: ApplyVideoEffects = (track, effects) => {\n const t = track as MediaStreamTrack & WebRTCTrackExtensions;\n if (t.remote) {\n throw new Error('kaleidoscope: cannot apply effects to remote tracks');\n }\n if (typeof t._setVideoEffects !== 'function') {\n throw new Error(\n 'kaleidoscope: track has no _setVideoEffects method (is react-native-webrtc >=124 installed?)',\n );\n }\n const specs = effects.map(toEffectSpec);\n // Deliver the composite's layer stack out-of-band before the \"composite\" name\n // is dispatched. Blur sigma and generative uniforms ride inside each layer's\n // `uniforms`. Guarded: a native build without the compositor lacks the function\n // (and drops the \"composite\" name below if not registered).\n for (const spec of specs) {\n if (spec.name === 'composite') {\n nativeModule().setCompositeLayers?.(serializeCompositeLayers((spec as CompositeSpec).layers));\n }\n }\n // The composite name is book-driven: the prebuild copied the images and native\n // registration installed the one \"composite\" compositor, so it passes the\n // crash-guard. Transforms must be in the static set (always are).\n const mapped = specs.map((spec) => ({\n name: specToNativeName(spec),\n trusted: spec.name === 'composite',\n }));\n const names = mapped\n .filter((m) => m.trusted || NATIVE_REGISTERED_EFFECTS.has(m.name))\n .map((m) => m.name);\n\n // Dedup against the last set applied to this track. Order is significant\n // (effects chain in array order), so the signature preserves it. Skip the\n // native call when nothing changed; the first call for any given set always\n // proceeds (no prior entry).\n const signature = names.join('\\n');\n if (lastAppliedSignatureByTrack.get(track) === signature) {\n return track;\n }\n lastAppliedSignatureByTrack.set(track, signature);\n\n const dropped = mapped\n .filter((m) => !m.trusted && !NATIVE_REGISTERED_EFFECTS.has(m.name))\n .map((m) => m.name);\n if (dropped.length > 0) {\n console.warn(\n `kaleidoscope: dropping effects not registered on this native platform: ${dropped.join(', ')}. ` +\n 'Web has its own registry; this is a native-only filter.',\n );\n }\n // Platforms diverge on how to clear effects:\n // - Android: rn-webrtc 124 has a bug where passing `[]` installs a\n // VideoEffectProcessor with an empty processors list, whose\n // onFrameCaptured then double-releases the input frame (retain once,\n // release twice) and crashes EglRenderer one frame later. The only\n // correct clear is `null`, which takes the upstream else-branch that\n // resets the processor via `videoSource.setVideoProcessor(null)`.\n // - iOS: the upstream Obj-C `_setVideoEffects` method declares\n // `names` as `(nonnull NSArray<NSString *> *)`, so passing `null`\n // violates the React Native bridge's nonnull contract. The supported\n // clear value is `[]`, which iOS's VideoEffectProcessor treats as a\n // passthrough (no double-release bug on this platform).\n // The explicit type annotation is required; without it TS widens the\n // empty-array literal to `never[] | null`.\n const clearValue: ReadonlyArray<string> | null = Platform.OS === 'ios' ? [] : null;\n t._setVideoEffects(names.length === 0 ? clearValue : names);\n return track;\n};\n\n/**\n * Bind a track and a preset book; get the three verbs back\n * (`{ kaleidoscope, transform, mask }`). On native the track is mutated in\n * place, so `controls.track` is the bound track and `onTrack` fires with it\n * after each `kaleidoscope` preset switch and `transform` command. `mask`\n * updates the segmentation edge the per-frame processors read.\n */\nexport const bindKaleidoscope = <P extends KaleidoscopePresetBook>(\n track: MediaStreamTrack,\n options: KaleidoscopeBindOptions<P>,\n): KaleidoscopeBinding<P> => {\n const reconcile: Reconcile = {\n apply: (specs) => applyVideoEffects(track, specs),\n dispose: () => {},\n };\n const setMask: SetMask = (hardness, threshold) => {\n nativeModule().setMaskHardness(hardness);\n nativeModule().setMaskThreshold(threshold);\n };\n // Native has no live per-layer uniform channel yet (Phase B): a patch of the\n // active preset is a no-op here, so the verb's patch path is inert on native\n // until the compositor reads layer-id-keyed overrides. The verb still drives\n // preset switches through reconcile.\n const setLayerUniforms: SetLayerUniforms = () => {};\n // Native re-sends the full layer stack (with baked uniforms) on every preset\n // switch via setCompositeLayers, so there is no stale override to clear; no-op for\n // parity with the inert setLayerUniforms above.\n const resetLayerUniforms: ResetLayerUniforms = () => {};\n return createControls(track, options, reconcile, setMask, setLayerUniforms, resetLayerUniforms);\n};\n"]}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ // Native entry point. Metro picks this up via package.json "react-native"
3
+ // and the "." subpath export's "react-native" condition.
4
+ //
5
+ // Thin facade over `track._setVideoEffects(names)` from react-native-webrtc.
6
+ // Native frame processors are registered at app boot by the Expo Module's
7
+ // OnCreate hook (see android/.../KaleidoscopeModule.kt and ios/.../KaleidoscopeModule.swift);
8
+ // this facade just dispatches into the existing upstream registry.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.bindKaleidoscope = exports.SIMIANLIGHTS_CONTROLS = exports.PLASMA_CONTROLS = exports.NEBULA_CONTROLS = exports.LIGHT_BEAMS_AND_MOTES_CONTROLS = exports.GODRAYS_CONTROLS = exports.FIREFLIES_CONTROLS = exports.defaultUniforms = exports.CORPORATE_BLOBS_CONTROLS = exports.CLOUDS_CONTROLS = exports.BLUR_CONTROLS = exports.ANAMORPHIC_LENSFLARE_CONTROLS = void 0;
11
+ const expo_modules_core_1 = require("expo-modules-core");
12
+ const react_native_1 = require("react-native");
13
+ const controls_1 = require("./kaleidoscope/controls");
14
+ const effect_1 = require("./kaleidoscope/effect");
15
+ // Lazy because the module is not available during pure-JS tests; the
16
+ // getter throws if you call a setter outside a real native runtime, which
17
+ // is the right failure mode.
18
+ const nativeModule = () => (0, expo_modules_core_1.requireNativeModule)('RnWebrtcKaleidoscope');
19
+ // Per-shader control descriptors (platform-agnostic data). Imported individually
20
+ // per the shader a preset's layer uses; there is no all-shaders aggregate.
21
+ var shaders_1 = require("../catalog/shaders");
22
+ Object.defineProperty(exports, "ANAMORPHIC_LENSFLARE_CONTROLS", { enumerable: true, get: function () { return shaders_1.ANAMORPHIC_LENSFLARE_CONTROLS; } });
23
+ Object.defineProperty(exports, "BLUR_CONTROLS", { enumerable: true, get: function () { return shaders_1.BLUR_CONTROLS; } });
24
+ Object.defineProperty(exports, "CLOUDS_CONTROLS", { enumerable: true, get: function () { return shaders_1.CLOUDS_CONTROLS; } });
25
+ Object.defineProperty(exports, "CORPORATE_BLOBS_CONTROLS", { enumerable: true, get: function () { return shaders_1.CORPORATE_BLOBS_CONTROLS; } });
26
+ Object.defineProperty(exports, "defaultUniforms", { enumerable: true, get: function () { return shaders_1.defaultUniforms; } });
27
+ Object.defineProperty(exports, "FIREFLIES_CONTROLS", { enumerable: true, get: function () { return shaders_1.FIREFLIES_CONTROLS; } });
28
+ Object.defineProperty(exports, "GODRAYS_CONTROLS", { enumerable: true, get: function () { return shaders_1.GODRAYS_CONTROLS; } });
29
+ Object.defineProperty(exports, "LIGHT_BEAMS_AND_MOTES_CONTROLS", { enumerable: true, get: function () { return shaders_1.LIGHT_BEAMS_AND_MOTES_CONTROLS; } });
30
+ Object.defineProperty(exports, "NEBULA_CONTROLS", { enumerable: true, get: function () { return shaders_1.NEBULA_CONTROLS; } });
31
+ Object.defineProperty(exports, "PLASMA_CONTROLS", { enumerable: true, get: function () { return shaders_1.PLASMA_CONTROLS; } });
32
+ Object.defineProperty(exports, "SIMIANLIGHTS_CONTROLS", { enumerable: true, get: function () { return shaders_1.SIMIANLIGHTS_CONTROLS; } });
33
+ // Effect names registered native-side in Registration.kt / Registration.swift.
34
+ // Anything not in this list gets filtered out before reaching upstream,
35
+ // because rn-webrtc's setVideoEffects calls ProcessorProvider.getProcessor()
36
+ // and filters nulls into an empty list, which then hits the
37
+ // VideoEffectProcessor empty-processors-list bug (refcount goes negative,
38
+ // EglRenderer crashes one frame later). Dropping an unregistered name here is
39
+ // the safe behavior.
40
+ //
41
+ // The art axis is now one registered "composite" compositor: blur, images, and
42
+ // generative shaders are all layers inside it, delivered out-of-band via
43
+ // setCompositeLayers. The four geometric transform ops share one native processor
44
+ // per platform (TransformFactory on Android, TransformProcessor on iOS); each is
45
+ // a flat name. iOS registers the same set via ios/.../Registration.swift.
46
+ const TRANSFORM_EFFECTS = ['flip-x', 'flip-y', 'rotate-cw', 'rotate-ccw'];
47
+ // Android (Registration.kt) and iOS (Registration.swift) install an identical
48
+ // effect set, so one list covers both natives. If the platforms ever diverge,
49
+ // split this back into per-platform lists keyed off Platform.OS.
50
+ const NATIVE_REGISTERED_EFFECTS_LIST = [...TRANSFORM_EFFECTS, 'composite'];
51
+ const registeredForPlatform = () => react_native_1.Platform.OS === 'android' || react_native_1.Platform.OS === 'ios' ? NATIVE_REGISTERED_EFFECTS_LIST : [];
52
+ const NATIVE_REGISTERED_EFFECTS = new Set(registeredForPlatform());
53
+ // Serialize a composite's layer stack to the JSON shape the native CompositeLayers
54
+ // channel parses: an array of { id, shader, target, blend?, source?, uniforms? }.
55
+ // Every layer carries its `id`. An `image` layer's native `source` IS its `id`
56
+ // (the bundled WebP basename the prebuild plugin copied under that name); all
57
+ // other layers carry their uniforms.
58
+ const serializeCompositeLayers = (layers) => {
59
+ const wire = layers.map((layer) => {
60
+ const base = {
61
+ id: layer.id,
62
+ shader: layer.shader,
63
+ target: layer.target ?? 'background',
64
+ };
65
+ if (layer.blend != null)
66
+ base.blend = layer.blend;
67
+ if (layer.shader === 'image') {
68
+ // The layer id is the image id (the bundled WebP basename); the native
69
+ // compositor resolves assets/images/<id>.webp from it.
70
+ base.source = layer.id;
71
+ }
72
+ else if ('uniforms' in layer) {
73
+ base.uniforms = layer.uniforms;
74
+ }
75
+ return base;
76
+ });
77
+ return JSON.stringify(wire);
78
+ };
79
+ const specToNativeName = (spec) => {
80
+ // The composite runs through the single registered "composite" compositor; its
81
+ // layer stack is delivered out-of-band via setCompositeLayers (see applyVideoEffects).
82
+ if (spec.name === 'composite') {
83
+ return 'composite';
84
+ }
85
+ return spec.name;
86
+ };
87
+ // Last effect set applied to each track, as a stable signature. Used to skip
88
+ // redundant native calls: rn-webrtc rebuilds the native frame processors on
89
+ // EVERY _setVideoEffects call (Android constructs a fresh processor per call),
90
+ // so re-issuing an unchanged set (a React re-render, an idempotent effect
91
+ // hook) churns GL + segmentation resources for no reason. The WeakMap lets the
92
+ // entry be collected when the track is.
93
+ const lastAppliedSignatureByTrack = new WeakMap();
94
+ // The lower-level native primitive: route a spec array through the upstream
95
+ // `_setVideoEffects`. Internal now (the public surface is the three verbs);
96
+ // `bindKaleidoscope`'s reconcile drives it.
97
+ const applyVideoEffects = (track, effects) => {
98
+ const t = track;
99
+ if (t.remote) {
100
+ throw new Error('kaleidoscope: cannot apply effects to remote tracks');
101
+ }
102
+ if (typeof t._setVideoEffects !== 'function') {
103
+ throw new Error('kaleidoscope: track has no _setVideoEffects method (is react-native-webrtc >=124 installed?)');
104
+ }
105
+ const specs = effects.map(effect_1.toEffectSpec);
106
+ // Deliver the composite's layer stack out-of-band before the "composite" name
107
+ // is dispatched. Blur sigma and generative uniforms ride inside each layer's
108
+ // `uniforms`. Guarded: a native build without the compositor lacks the function
109
+ // (and drops the "composite" name below if not registered).
110
+ for (const spec of specs) {
111
+ if (spec.name === 'composite') {
112
+ nativeModule().setCompositeLayers?.(serializeCompositeLayers(spec.layers));
113
+ }
114
+ }
115
+ // The composite name is book-driven: the prebuild copied the images and native
116
+ // registration installed the one "composite" compositor, so it passes the
117
+ // crash-guard. Transforms must be in the static set (always are).
118
+ const mapped = specs.map((spec) => ({
119
+ name: specToNativeName(spec),
120
+ trusted: spec.name === 'composite',
121
+ }));
122
+ const names = mapped
123
+ .filter((m) => m.trusted || NATIVE_REGISTERED_EFFECTS.has(m.name))
124
+ .map((m) => m.name);
125
+ // Dedup against the last set applied to this track. Order is significant
126
+ // (effects chain in array order), so the signature preserves it. Skip the
127
+ // native call when nothing changed; the first call for any given set always
128
+ // proceeds (no prior entry).
129
+ const signature = names.join('\n');
130
+ if (lastAppliedSignatureByTrack.get(track) === signature) {
131
+ return track;
132
+ }
133
+ lastAppliedSignatureByTrack.set(track, signature);
134
+ const dropped = mapped
135
+ .filter((m) => !m.trusted && !NATIVE_REGISTERED_EFFECTS.has(m.name))
136
+ .map((m) => m.name);
137
+ if (dropped.length > 0) {
138
+ console.warn(`kaleidoscope: dropping effects not registered on this native platform: ${dropped.join(', ')}. ` +
139
+ 'Web has its own registry; this is a native-only filter.');
140
+ }
141
+ // Platforms diverge on how to clear effects:
142
+ // - Android: rn-webrtc 124 has a bug where passing `[]` installs a
143
+ // VideoEffectProcessor with an empty processors list, whose
144
+ // onFrameCaptured then double-releases the input frame (retain once,
145
+ // release twice) and crashes EglRenderer one frame later. The only
146
+ // correct clear is `null`, which takes the upstream else-branch that
147
+ // resets the processor via `videoSource.setVideoProcessor(null)`.
148
+ // - iOS: the upstream Obj-C `_setVideoEffects` method declares
149
+ // `names` as `(nonnull NSArray<NSString *> *)`, so passing `null`
150
+ // violates the React Native bridge's nonnull contract. The supported
151
+ // clear value is `[]`, which iOS's VideoEffectProcessor treats as a
152
+ // passthrough (no double-release bug on this platform).
153
+ // The explicit type annotation is required; without it TS widens the
154
+ // empty-array literal to `never[] | null`.
155
+ const clearValue = react_native_1.Platform.OS === 'ios' ? [] : null;
156
+ t._setVideoEffects(names.length === 0 ? clearValue : names);
157
+ return track;
158
+ };
159
+ /**
160
+ * Bind a track and a preset book; get the three verbs back
161
+ * (`{ kaleidoscope, transform, mask }`). On native the track is mutated in
162
+ * place, so `controls.track` is the bound track and `onTrack` fires with it
163
+ * after each `kaleidoscope` preset switch and `transform` command. `mask`
164
+ * updates the segmentation edge the per-frame processors read.
165
+ */
166
+ const bindKaleidoscope = (track, options) => {
167
+ const reconcile = {
168
+ apply: (specs) => applyVideoEffects(track, specs),
169
+ dispose: () => { },
170
+ };
171
+ const setMask = (hardness, threshold) => {
172
+ nativeModule().setMaskHardness(hardness);
173
+ nativeModule().setMaskThreshold(threshold);
174
+ };
175
+ // Native has no live per-layer uniform channel yet (Phase B): a patch of the
176
+ // active preset is a no-op here, so the verb's patch path is inert on native
177
+ // until the compositor reads layer-id-keyed overrides. The verb still drives
178
+ // preset switches through reconcile.
179
+ const setLayerUniforms = () => { };
180
+ // Native re-sends the full layer stack (with baked uniforms) on every preset
181
+ // switch via setCompositeLayers, so there is no stale override to clear; no-op for
182
+ // parity with the inert setLayerUniforms above.
183
+ const resetLayerUniforms = () => { };
184
+ return (0, controls_1.createControls)(track, options, reconcile, setMask, setLayerUniforms, resetLayerUniforms);
185
+ };
186
+ exports.bindKaleidoscope = bindKaleidoscope;
187
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Native entry point. Metro picks this up via package.json \"react-native\"\n// and the \".\" subpath export's \"react-native\" condition.\n//\n// Thin facade over `track._setVideoEffects(names)` from react-native-webrtc.\n// Native frame processors are registered at app boot by the Expo Module's\n// OnCreate hook (see android/.../KaleidoscopeModule.kt and ios/.../KaleidoscopeModule.swift);\n// this facade just dispatches into the existing upstream registry.\n\nimport { requireNativeModule } from 'expo-modules-core';\nimport { Platform } from 'react-native';\nimport {\n createControls,\n type Reconcile,\n type ResetLayerUniforms,\n type SetLayerUniforms,\n type SetMask,\n} from './kaleidoscope/controls';\nimport { toEffectSpec } from './kaleidoscope/effect';\nimport type { ApplyVideoEffects, CompositeSpec } from './kaleidoscope/effect.types';\nimport type { KaleidoscopeBinding, KaleidoscopeBindOptions } from './kaleidoscope/types';\nimport type { KaleidoscopeLayer, KaleidoscopePresetBook } from './kaleidoscope.preset-book.types';\n\n// The native module's tuning functions. Only the three the JS layer drives are\n// declared: blur sigma (from a blur preset's options) and the mask edge (from\n// the mask() verb). The native module also exposes segmentation/debug/reset\n// functions, but nothing in JS calls them anymore, so they're not declared here.\ninterface KaleidoscopeNativeModule {\n setMaskHardness: (value: number) => void;\n setMaskThreshold: (value: number) => void;\n // KaleidoscopePreset layer-stack channel. Optional: a native build predating the\n // compositor won't expose it, so callers guard with `?.`. JS sends the active\n // composite's ordered layer stack as a JSON string; native parses + composites\n // it. Blur sigma and generative uniforms now ride inside each layer's\n // `uniforms`, so there is no separate setBlurSigma/setShaderUniforms channel.\n setCompositeLayers?: (json: string) => void;\n}\n\n// Lazy because the module is not available during pure-JS tests; the\n// getter throws if you call a setter outside a real native runtime, which\n// is the right failure mode.\nconst nativeModule = (): KaleidoscopeNativeModule =>\n requireNativeModule<KaleidoscopeNativeModule>('RnWebrtcKaleidoscope');\n\n// The native tuning functions (setMaskHardness / setMaskThreshold) remain on the\n// native module and are called internally: the mask edge flows from the mask()\n// verb (see bindKaleidoscope). The composite layer stack flows through\n// setCompositeLayers. The old global set* JS exports are gone; effects are driven by\n// kaleidoscope / transform / mask, not loose setters.\n\nexport type { CatalogImageId } from '../catalog/images';\nexport type {\n AnamorphicLensFlareUniforms,\n BlurUniforms,\n CloudsUniforms,\n CorporateBlobsUniforms,\n FirefliesUniforms,\n GodraysUniforms,\n LayerShaderName,\n LayerShaderOptions,\n LightBeamsAndMotesUniforms,\n NebulaUniforms,\n PatchableShaderName,\n PlasmaUniforms,\n ShaderUniformsMap,\n SimianlightsUniforms,\n UniformControl,\n} from '../catalog/shaders';\n// Per-shader control descriptors (platform-agnostic data). Imported individually\n// per the shader a preset's layer uses; there is no all-shaders aggregate.\nexport {\n ANAMORPHIC_LENSFLARE_CONTROLS,\n BLUR_CONTROLS,\n CLOUDS_CONTROLS,\n CORPORATE_BLOBS_CONTROLS,\n defaultUniforms,\n FIREFLIES_CONTROLS,\n GODRAYS_CONTROLS,\n LIGHT_BEAMS_AND_MOTES_CONTROLS,\n NEBULA_CONTROLS,\n PLASMA_CONTROLS,\n SIMIANLIGHTS_CONTROLS,\n} from '../catalog/shaders';\nexport type {\n CompositeSpec,\n EffectInput,\n EffectName,\n EffectSpec,\n TransformName,\n TransformSpec,\n} from './kaleidoscope/effect.types';\nexport type {\n KaleidoscopeBinding,\n KaleidoscopeBindOptions,\n MaskInput,\n PatchesFor,\n PatchFor,\n TransformInput,\n} from './kaleidoscope/types';\nexport type {\n KaleidoscopeBlendMode,\n KaleidoscopeControls,\n KaleidoscopeLayer,\n KaleidoscopeLayerTarget,\n KaleidoscopePreset,\n KaleidoscopePresetBook,\n KaleidoscopePresetEntry,\n KaleidoscopeTaxonomy,\n} from './kaleidoscope.preset-book.types';\nexport type { RGB } from './lib/primitives.types';\n\ninterface WebRTCTrackExtensions {\n remote?: boolean;\n // Upstream's typed signature is `string[]`, but the platforms diverge on\n // how to clear effects:\n // - Android: passing `null` takes the\n // `videoSource.setVideoProcessor(null)` branch (the only correct clear\n // path); passing `[]` crashes EglRenderer.\n // - iOS: the Obj-C method declares `names` as `nonnull NSArray<NSString *>`,\n // so `null` violates the bridge contract; `[]` is the supported clear\n // value (iOS's `VideoEffectProcessor` with no processors is a\n // passthrough).\n // We type the parameter as the union so the facade can platform-split at\n // the call site. See `applyVideoEffects` below.\n _setVideoEffects?: (names: ReadonlyArray<string> | null) => void;\n}\n\n// Effect names registered native-side in Registration.kt / Registration.swift.\n// Anything not in this list gets filtered out before reaching upstream,\n// because rn-webrtc's setVideoEffects calls ProcessorProvider.getProcessor()\n// and filters nulls into an empty list, which then hits the\n// VideoEffectProcessor empty-processors-list bug (refcount goes negative,\n// EglRenderer crashes one frame later). Dropping an unregistered name here is\n// the safe behavior.\n//\n// The art axis is now one registered \"composite\" compositor: blur, images, and\n// generative shaders are all layers inside it, delivered out-of-band via\n// setCompositeLayers. The four geometric transform ops share one native processor\n// per platform (TransformFactory on Android, TransformProcessor on iOS); each is\n// a flat name. iOS registers the same set via ios/.../Registration.swift.\nconst TRANSFORM_EFFECTS: readonly string[] = ['flip-x', 'flip-y', 'rotate-cw', 'rotate-ccw'];\n\n// Android (Registration.kt) and iOS (Registration.swift) install an identical\n// effect set, so one list covers both natives. If the platforms ever diverge,\n// split this back into per-platform lists keyed off Platform.OS.\nconst NATIVE_REGISTERED_EFFECTS_LIST: readonly string[] = [...TRANSFORM_EFFECTS, 'composite'];\n\nconst registeredForPlatform = (): readonly string[] =>\n Platform.OS === 'android' || Platform.OS === 'ios' ? NATIVE_REGISTERED_EFFECTS_LIST : [];\n\nconst NATIVE_REGISTERED_EFFECTS: ReadonlySet<string> = new Set(registeredForPlatform());\n\n// Serialize a composite's layer stack to the JSON shape the native CompositeLayers\n// channel parses: an array of { id, shader, target, blend?, source?, uniforms? }.\n// Every layer carries its `id`. An `image` layer's native `source` IS its `id`\n// (the bundled WebP basename the prebuild plugin copied under that name); all\n// other layers carry their uniforms.\nconst serializeCompositeLayers = (layers: ReadonlyArray<KaleidoscopeLayer>): string => {\n const wire = layers.map((layer) => {\n const base: Record<string, unknown> = {\n id: layer.id,\n shader: layer.shader,\n target: layer.target ?? 'background',\n };\n if (layer.blend != null) base.blend = layer.blend;\n if (layer.shader === 'image') {\n // The layer id is the image id (the bundled WebP basename); the native\n // compositor resolves assets/images/<id>.webp from it.\n base.source = layer.id;\n } else if ('uniforms' in layer) {\n base.uniforms = layer.uniforms;\n }\n return base;\n });\n return JSON.stringify(wire);\n};\n\nconst specToNativeName = (spec: ReturnType<typeof toEffectSpec>): string => {\n // The composite runs through the single registered \"composite\" compositor; its\n // layer stack is delivered out-of-band via setCompositeLayers (see applyVideoEffects).\n if (spec.name === 'composite') {\n return 'composite';\n }\n return spec.name;\n};\n\n// Last effect set applied to each track, as a stable signature. Used to skip\n// redundant native calls: rn-webrtc rebuilds the native frame processors on\n// EVERY _setVideoEffects call (Android constructs a fresh processor per call),\n// so re-issuing an unchanged set (a React re-render, an idempotent effect\n// hook) churns GL + segmentation resources for no reason. The WeakMap lets the\n// entry be collected when the track is.\nconst lastAppliedSignatureByTrack = new WeakMap<object, string>();\n\n// The lower-level native primitive: route a spec array through the upstream\n// `_setVideoEffects`. Internal now (the public surface is the three verbs);\n// `bindKaleidoscope`'s reconcile drives it.\nconst applyVideoEffects: ApplyVideoEffects = (track, effects) => {\n const t = track as MediaStreamTrack & WebRTCTrackExtensions;\n if (t.remote) {\n throw new Error('kaleidoscope: cannot apply effects to remote tracks');\n }\n if (typeof t._setVideoEffects !== 'function') {\n throw new Error(\n 'kaleidoscope: track has no _setVideoEffects method (is react-native-webrtc >=124 installed?)',\n );\n }\n const specs = effects.map(toEffectSpec);\n // Deliver the composite's layer stack out-of-band before the \"composite\" name\n // is dispatched. Blur sigma and generative uniforms ride inside each layer's\n // `uniforms`. Guarded: a native build without the compositor lacks the function\n // (and drops the \"composite\" name below if not registered).\n for (const spec of specs) {\n if (spec.name === 'composite') {\n nativeModule().setCompositeLayers?.(serializeCompositeLayers((spec as CompositeSpec).layers));\n }\n }\n // The composite name is book-driven: the prebuild copied the images and native\n // registration installed the one \"composite\" compositor, so it passes the\n // crash-guard. Transforms must be in the static set (always are).\n const mapped = specs.map((spec) => ({\n name: specToNativeName(spec),\n trusted: spec.name === 'composite',\n }));\n const names = mapped\n .filter((m) => m.trusted || NATIVE_REGISTERED_EFFECTS.has(m.name))\n .map((m) => m.name);\n\n // Dedup against the last set applied to this track. Order is significant\n // (effects chain in array order), so the signature preserves it. Skip the\n // native call when nothing changed; the first call for any given set always\n // proceeds (no prior entry).\n const signature = names.join('\\n');\n if (lastAppliedSignatureByTrack.get(track) === signature) {\n return track;\n }\n lastAppliedSignatureByTrack.set(track, signature);\n\n const dropped = mapped\n .filter((m) => !m.trusted && !NATIVE_REGISTERED_EFFECTS.has(m.name))\n .map((m) => m.name);\n if (dropped.length > 0) {\n console.warn(\n `kaleidoscope: dropping effects not registered on this native platform: ${dropped.join(', ')}. ` +\n 'Web has its own registry; this is a native-only filter.',\n );\n }\n // Platforms diverge on how to clear effects:\n // - Android: rn-webrtc 124 has a bug where passing `[]` installs a\n // VideoEffectProcessor with an empty processors list, whose\n // onFrameCaptured then double-releases the input frame (retain once,\n // release twice) and crashes EglRenderer one frame later. The only\n // correct clear is `null`, which takes the upstream else-branch that\n // resets the processor via `videoSource.setVideoProcessor(null)`.\n // - iOS: the upstream Obj-C `_setVideoEffects` method declares\n // `names` as `(nonnull NSArray<NSString *> *)`, so passing `null`\n // violates the React Native bridge's nonnull contract. The supported\n // clear value is `[]`, which iOS's VideoEffectProcessor treats as a\n // passthrough (no double-release bug on this platform).\n // The explicit type annotation is required; without it TS widens the\n // empty-array literal to `never[] | null`.\n const clearValue: ReadonlyArray<string> | null = Platform.OS === 'ios' ? [] : null;\n t._setVideoEffects(names.length === 0 ? clearValue : names);\n return track;\n};\n\n/**\n * Bind a track and a preset book; get the three verbs back\n * (`{ kaleidoscope, transform, mask }`). On native the track is mutated in\n * place, so `controls.track` is the bound track and `onTrack` fires with it\n * after each `kaleidoscope` preset switch and `transform` command. `mask`\n * updates the segmentation edge the per-frame processors read.\n */\nexport const bindKaleidoscope = <P extends KaleidoscopePresetBook>(\n track: MediaStreamTrack,\n options: KaleidoscopeBindOptions<P>,\n): KaleidoscopeBinding<P> => {\n const reconcile: Reconcile = {\n apply: (specs) => applyVideoEffects(track, specs),\n dispose: () => {},\n };\n const setMask: SetMask = (hardness, threshold) => {\n nativeModule().setMaskHardness(hardness);\n nativeModule().setMaskThreshold(threshold);\n };\n // Native has no live per-layer uniform channel yet (Phase B): a patch of the\n // active preset is a no-op here, so the verb's patch path is inert on native\n // until the compositor reads layer-id-keyed overrides. The verb still drives\n // preset switches through reconcile.\n const setLayerUniforms: SetLayerUniforms = () => {};\n // Native re-sends the full layer stack (with baked uniforms) on every preset\n // switch via setCompositeLayers, so there is no stale override to clear; no-op for\n // parity with the inert setLayerUniforms above.\n const resetLayerUniforms: ResetLayerUniforms = () => {};\n return createControls(track, options, reconcile, setMask, setLayerUniforms, resetLayerUniforms);\n};\n"]}