react-native-webrtc-kaleidoscope 2.0.0 → 2.1.1

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,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresetGrid = exports.PresetBookMenuLayout = exports.PresetTile = void 0;
4
+ exports.PresetBookMenu = PresetBookMenu;
5
+ exports.usePresetBookMenu = usePresetBookMenu;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ // The drop-in composite picker (#28): tabs over the consumer's preset families,
8
+ // a left-hand category menu under the tabs, and a uniform tile grid filtered by
9
+ // the active family and category. Controlled selection; emit the chosen id, the
10
+ // host applies it. `usePresetBookMenu` is the orchestration (group the book by
11
+ // family/category, own the active tab and category) and is exported for BYO
12
+ // layouts.
13
+ const react_1 = require("react");
14
+ const react_native_1 = require("react-native");
15
+ const test_id_1 = require("../../lib/test-id");
16
+ const layout_1 = require("./layout");
17
+ const preset_grid_1 = require("./preset-grid");
18
+ /**
19
+ * Tabbed, preset-book-driven picker. Controlled selection; emits the chosen id
20
+ * and the host applies it.
21
+ *
22
+ * @example
23
+ * <PresetBookMenu
24
+ * presets={presets}
25
+ * value={art}
26
+ * onSelect={setArt}
27
+ * />
28
+ */
29
+ function PresetBookMenu(props) {
30
+ // `className` (declared on PresetBookMenuProps) is intentionally not destructured: the
31
+ // ./nativewind cssInterop registration consumes it at the JSX boundary and
32
+ // merges the resolved classes into `style` before this body runs.
33
+ const { presets, value, onSelect, disabled = false, renderTile, labelFor, tabLabelFor, categoryLabelFor, style, } = props;
34
+ const { families, activeTab, setActiveTab, categories, activeCategory, setActiveCategory, views, } = usePresetBookMenu(presets, labelFor);
35
+ if (!activeTab)
36
+ return null;
37
+ // The renderers speak string ids (PresetView.id); the public onSelect is
38
+ // narrowed to keyof P. Adapt once here so consumers need no cast (every id
39
+ // came from Object.keys(presets), so it is a real key).
40
+ const handleSelect = (id) => onSelect(id);
41
+ return ((0, jsx_runtime_1.jsx)(layout_1.PresetBookMenuLayout, { style: style, tabsZone: families.map((family) => ((0, jsx_runtime_1.jsx)(Tab, { label: tabLabelFor?.(family) ?? titleCase(family), active: family === activeTab, disabled: disabled, onPress: () => setActiveTab(family), testID: (0, test_id_1.familyTestId)(family) }, family))), sidebarZone: categories.length > 0
42
+ ? categories.map((category) => ((0, jsx_runtime_1.jsx)(CategoryItem, { label: categoryLabelFor?.(category) ?? category, active: category === activeCategory, disabled: disabled, onPress: () => setActiveCategory(category), testID: (0, test_id_1.categoryTestId)(activeTab, category) }, category)))
43
+ : undefined, bodyZone: (0, jsx_runtime_1.jsx)(preset_grid_1.PresetGrid, { presets: views, value: value, onSelect: handleSelect, disabled: disabled, renderTile: renderTile }) }));
44
+ }
45
+ /**
46
+ * Group a preset book by family and category, and own the active tab and
47
+ * category. The grouping is plain; no hand-rolled memo: React Compiler memoizes
48
+ * it when the library is compiled, and it is cheap to recompute otherwise. The
49
+ * active tab and category are reconciled every render: each survives as long as
50
+ * it is still in the book, else it falls back to the first; so swapping
51
+ * `presets`, or switching to a family that lacks the prior category, can't strand
52
+ * a dead selection.
53
+ */
54
+ function usePresetBookMenu(presets, labelFor) {
55
+ const families = [];
56
+ const viewsByFamily = new Map();
57
+ const categoriesByFamily = new Map();
58
+ const viewsByFamilyCategory = new Map();
59
+ for (const id of Object.keys(presets)) {
60
+ const preset = presets[id];
61
+ if (!preset)
62
+ continue;
63
+ // taxonomy[0] is the family (tab); taxonomy[1], when present, is the
64
+ // category (left-hand menu). A depth-1 preset has no category.
65
+ const family = preset.taxonomy[0];
66
+ const category = preset.taxonomy[1];
67
+ const view = {
68
+ id,
69
+ label: labelFor?.(id) ?? preset.name,
70
+ family,
71
+ category,
72
+ source: typeof preset.thumbnail === 'string' || typeof preset.thumbnail === 'number'
73
+ ? preset.thumbnail
74
+ : undefined,
75
+ };
76
+ if (!viewsByFamily.has(family)) {
77
+ families.push(family);
78
+ viewsByFamily.set(family, []);
79
+ categoriesByFamily.set(family, []);
80
+ viewsByFamilyCategory.set(family, new Map());
81
+ }
82
+ viewsByFamily.get(family)?.push(view);
83
+ if (category !== undefined) {
84
+ const cats = categoriesByFamily.get(family);
85
+ const catViews = viewsByFamilyCategory.get(family);
86
+ if (cats && catViews && !catViews.has(category)) {
87
+ cats.push(category);
88
+ catViews.set(category, []);
89
+ }
90
+ catViews?.get(category)?.push(view);
91
+ }
92
+ }
93
+ const [activeTab, setActiveTab] = (0, react_1.useState)(undefined);
94
+ const family = activeTab && families.includes(activeTab) ? activeTab : families[0];
95
+ const categories = (family && categoriesByFamily.get(family)) || [];
96
+ const [activeCategory, setActiveCategory] = (0, react_1.useState)(undefined);
97
+ const category = activeCategory && categories.includes(activeCategory) ? activeCategory : categories[0];
98
+ const views = category
99
+ ? (family && viewsByFamilyCategory.get(family)?.get(category)) || []
100
+ : (family && viewsByFamily.get(family)) || [];
101
+ return {
102
+ families,
103
+ activeTab: family,
104
+ setActiveTab,
105
+ categories,
106
+ activeCategory: category,
107
+ setActiveCategory,
108
+ views,
109
+ };
110
+ }
111
+ function Tab({ label, active, disabled, onPress, testID }) {
112
+ return ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: "tab", accessibilityState: { selected: active, disabled }, testID: testID, disabled: disabled, onPress: onPress, style: [styles.tab, active && styles.tabActive, disabled && styles.tabDisabled], children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.tabLabel, active && styles.tabLabelActive], children: label }) }));
113
+ }
114
+ function CategoryItem({ label, active, disabled, onPress, testID }) {
115
+ return ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: "menuitem", accessibilityState: { selected: active, disabled }, testID: testID, disabled: disabled, onPress: onPress, style: [
116
+ styles.category,
117
+ active && styles.categoryActive,
118
+ disabled && styles.categoryDisabled,
119
+ ], children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.categoryLabel, active && styles.categoryLabelActive], children: label }) }));
120
+ }
121
+ function titleCase(s) {
122
+ return s
123
+ .split('-')
124
+ .map((w) => (w ? w.charAt(0).toUpperCase() + w.slice(1) : w))
125
+ .join(' ');
126
+ }
127
+ const styles = react_native_1.StyleSheet.create({
128
+ tab: { paddingVertical: 6, paddingHorizontal: 12, borderRadius: 999, backgroundColor: '#1f1f1f' },
129
+ tabActive: { backgroundColor: '#333' },
130
+ tabDisabled: { opacity: 0.5 },
131
+ tabLabel: { color: '#999', fontSize: 12, fontWeight: '600' },
132
+ tabLabelActive: { color: '#fff' },
133
+ category: {
134
+ paddingVertical: 6,
135
+ paddingHorizontal: 10,
136
+ borderRadius: 8,
137
+ backgroundColor: '#1a1a1a',
138
+ },
139
+ categoryActive: { backgroundColor: '#2c2c2c' },
140
+ categoryDisabled: { opacity: 0.5 },
141
+ categoryLabel: { color: '#9a9a9a', fontSize: 12, fontWeight: '500' },
142
+ categoryLabelActive: { color: '#fff' },
143
+ });
144
+ var preset_tile_1 = require("../preset-tile");
145
+ Object.defineProperty(exports, "PresetTile", { enumerable: true, get: function () { return preset_tile_1.PresetTile; } });
146
+ // The `./picker` subpath barrel: the chassis above plus the composable parts and
147
+ // types a consumer can use to build a BYO layout.
148
+ var layout_2 = require("./layout");
149
+ Object.defineProperty(exports, "PresetBookMenuLayout", { enumerable: true, get: function () { return layout_2.PresetBookMenuLayout; } });
150
+ var preset_grid_2 = require("./preset-grid");
151
+ Object.defineProperty(exports, "PresetGrid", { enumerable: true, get: function () { return preset_grid_2.PresetGrid; } });
152
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/index.tsx"],"names":[],"mappings":";;;;;;AAAA,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,WAAW;AAEX,iCAAiC;AACjC,+CAA2D;AAE3D,+CAAiE;AACjE,qCAAgD;AAEhD,+CAA2C;AA0B3C;;;;;;;;;;GAUG;AACH,wBAAiE,KAA6B;IAC5F,uFAAuF;IACvF,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,UAAU,EACV,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,KAAK,GACN,GAAG,KAAK,CAAC;IACV,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,KAAK,GACN,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,yEAAyE;IACzE,2EAA2E;IAC3E,wDAAwD;IACxD,MAAM,YAAY,GAAG,CAAC,EAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAA+B,CAAC,CAAC;IAEtF,OAAO,CACL,uBAAC,6BAAoB,IACnB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACjC,uBAAC,GAAG,IAEF,KAAK,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EACjD,MAAM,EAAE,MAAM,KAAK,SAAS,EAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EACnC,MAAM,EAAE,IAAA,sBAAY,EAAC,MAAM,CAAC,IALvB,MAAM,CAMX,CACH,CAAC,EACF,WAAW,EACT,UAAU,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,uBAAC,YAAY,IAEX,KAAK,EAAE,gBAAgB,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAC/C,MAAM,EAAE,QAAQ,KAAK,cAAc,EACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAC1C,MAAM,EAAE,IAAA,wBAAc,EAAC,SAAS,EAAE,QAAQ,CAAC,IALtC,QAAQ,CAMb,CACH,CAAC;YACJ,CAAC,CAAC,SAAS,EAEf,QAAQ,EACN,uBAAC,wBAAU,IACT,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,GACtB,GAEJ,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,2BACE,OAAU,EACV,QAA2C;IAE3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAuC,CAAC;IAC7E,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,qEAAqE;QACrE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAe;YACvB,EAAE;YACF,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAsB,CAAC,IAAI,MAAM,CAAC,IAAI;YACxD,MAAM;YACN,QAAQ;YACR,MAAM,EACJ,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;gBAC1E,CAAC,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,SAAS;SAChB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACnC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpB,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAqB,SAAS,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,IAAA,gBAAQ,EAAuB,SAAS,CAAC,CAAC;IACtF,MAAM,QAAQ,GACZ,cAAc,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEzF,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,CAAC,MAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;QACpE,CAAC,CAAC,CAAC,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhD,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,MAAM;QACjB,YAAY;QACZ,UAAU;QACV,cAAc,EAAE,QAAQ;QACxB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC;AAUD,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAY;IACjE,OAAO,CACL,uBAAC,wBAAS,IACR,iBAAiB,EAAC,KAAK,EACvB,kBAAkB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAClD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,YAE/E,uBAAC,mBAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,YAAG,KAAK,GAAQ,GACrE,CACb,CAAC;AACJ,CAAC;AAUD,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAqB;IACnF,OAAO,CACL,uBAAC,wBAAS,IACR,iBAAiB,EAAC,UAAU,EAC5B,kBAAkB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAClD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;YACL,MAAM,CAAC,QAAQ;YACf,MAAM,IAAI,MAAM,CAAC,cAAc;YAC/B,QAAQ,IAAI,MAAM,CAAC,gBAAgB;SACpC,YAED,uBAAC,mBAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,IAAI,MAAM,CAAC,mBAAmB,CAAC,YAAG,KAAK,GAAQ,GAC/E,CACb,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE;IACjG,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE;IACtC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IAC7B,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IAC5D,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IACjC,QAAQ,EAAE;QACR,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,SAAS;KAC3B;IACD,cAAc,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;IAC9C,gBAAgB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IAClC,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IACpE,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;CACvC,CAAC,CAAC;AAEH,8CAA4C;AAAnC,yGAAA,UAAU,OAAA;AACnB,iFAAiF;AACjF,kDAAkD;AAClD,mCAAgD;AAAvC,8GAAA,oBAAoB,OAAA;AAW7B,6CAA2C;AAAlC,yGAAA,UAAU,OAAA","sourcesContent":["// The drop-in composite picker (#28): tabs over the consumer's preset families,\n// a left-hand category menu under the tabs, and a uniform tile grid filtered by\n// the active family and category. Controlled selection; emit the chosen id, the\n// host applies it. `usePresetBookMenu` is the orchestration (group the book by\n// family/category, own the active tab and category) and is exported for BYO\n// layouts.\n\nimport { useState } from 'react';\nimport { Pressable, StyleSheet, Text } from 'react-native';\nimport type { KaleidoscopePresetBook } from '../../kaleidoscope.preset-book.types';\nimport { categoryTestId, familyTestId } from '../../lib/test-id';\nimport { PresetBookMenuLayout } from './layout';\nimport type { Category, Family, PresetBookMenuProps, PresetView } from './preset-book-menu.types';\nimport { PresetGrid } from './preset-grid';\n\n/** The grouping usePresetBookMenu returns; named so BYO-layout consumers can type it. */\nexport interface PresetBookMenuModel {\n /** Distinct families present in the book, in first-appearance order. */\n readonly families: ReadonlyArray<Family>;\n /** The reconciled active family (survives a changed book; falls back to the first). */\n readonly activeTab: Family | undefined;\n /** Set the active family tab. */\n readonly setActiveTab: (family: Family) => void;\n /**\n * Categories (taxonomy[1]) within the active family, first-appearance order.\n * Empty when the family is flat (every preset is depth-1).\n */\n readonly categories: ReadonlyArray<Category>;\n /** The reconciled active category, or undefined when the family is flat. */\n readonly activeCategory: Category | undefined;\n /** Set the active category. */\n readonly setActiveCategory: (category: Category) => void;\n /**\n * Presets to display: the active family narrowed to the active category, or\n * every preset in the family when it is flat.\n */\n readonly views: ReadonlyArray<PresetView>;\n}\n\n/**\n * Tabbed, preset-book-driven picker. Controlled selection; emits the chosen id\n * and the host applies it.\n *\n * @example\n * <PresetBookMenu\n * presets={presets}\n * value={art}\n * onSelect={setArt}\n * />\n */\nexport function PresetBookMenu<P extends KaleidoscopePresetBook>(props: PresetBookMenuProps<P>) {\n // `className` (declared on PresetBookMenuProps) is intentionally not destructured: the\n // ./nativewind cssInterop registration consumes it at the JSX boundary and\n // merges the resolved classes into `style` before this body runs.\n const {\n presets,\n value,\n onSelect,\n disabled = false,\n renderTile,\n labelFor,\n tabLabelFor,\n categoryLabelFor,\n style,\n } = props;\n const {\n families,\n activeTab,\n setActiveTab,\n categories,\n activeCategory,\n setActiveCategory,\n views,\n } = usePresetBookMenu(presets, labelFor);\n\n if (!activeTab) return null;\n // The renderers speak string ids (PresetView.id); the public onSelect is\n // narrowed to keyof P. Adapt once here so consumers need no cast (every id\n // came from Object.keys(presets), so it is a real key).\n const handleSelect = (id: string | null) => onSelect(id as (keyof P & string) | null);\n\n return (\n <PresetBookMenuLayout\n style={style}\n tabsZone={families.map((family) => (\n <Tab\n key={family}\n label={tabLabelFor?.(family) ?? titleCase(family)}\n active={family === activeTab}\n disabled={disabled}\n onPress={() => setActiveTab(family)}\n testID={familyTestId(family)}\n />\n ))}\n sidebarZone={\n categories.length > 0\n ? categories.map((category) => (\n <CategoryItem\n key={category}\n label={categoryLabelFor?.(category) ?? category}\n active={category === activeCategory}\n disabled={disabled}\n onPress={() => setActiveCategory(category)}\n testID={categoryTestId(activeTab, category)}\n />\n ))\n : undefined\n }\n bodyZone={\n <PresetGrid\n presets={views}\n value={value}\n onSelect={handleSelect}\n disabled={disabled}\n renderTile={renderTile}\n />\n }\n />\n );\n}\n\n/**\n * Group a preset book by family and category, and own the active tab and\n * category. The grouping is plain; no hand-rolled memo: React Compiler memoizes\n * it when the library is compiled, and it is cheap to recompute otherwise. The\n * active tab and category are reconciled every render: each survives as long as\n * it is still in the book, else it falls back to the first; so swapping\n * `presets`, or switching to a family that lacks the prior category, can't strand\n * a dead selection.\n */\nexport function usePresetBookMenu<P extends KaleidoscopePresetBook>(\n presets: P,\n labelFor?: (id: keyof P & string) => string,\n): PresetBookMenuModel {\n const families: Family[] = [];\n const viewsByFamily = new Map<Family, PresetView[]>();\n const categoriesByFamily = new Map<Family, Category[]>();\n const viewsByFamilyCategory = new Map<Family, Map<Category, PresetView[]>>();\n for (const id of Object.keys(presets)) {\n const preset = presets[id];\n if (!preset) continue;\n // taxonomy[0] is the family (tab); taxonomy[1], when present, is the\n // category (left-hand menu). A depth-1 preset has no category.\n const family = preset.taxonomy[0];\n const category = preset.taxonomy[1];\n const view: PresetView = {\n id,\n label: labelFor?.(id as keyof P & string) ?? preset.name,\n family,\n category,\n source:\n typeof preset.thumbnail === 'string' || typeof preset.thumbnail === 'number'\n ? preset.thumbnail\n : undefined,\n };\n if (!viewsByFamily.has(family)) {\n families.push(family);\n viewsByFamily.set(family, []);\n categoriesByFamily.set(family, []);\n viewsByFamilyCategory.set(family, new Map());\n }\n viewsByFamily.get(family)?.push(view);\n if (category !== undefined) {\n const cats = categoriesByFamily.get(family);\n const catViews = viewsByFamilyCategory.get(family);\n if (cats && catViews && !catViews.has(category)) {\n cats.push(category);\n catViews.set(category, []);\n }\n catViews?.get(category)?.push(view);\n }\n }\n\n const [activeTab, setActiveTab] = useState<Family | undefined>(undefined);\n const family = activeTab && families.includes(activeTab) ? activeTab : families[0];\n const categories = (family && categoriesByFamily.get(family)) || [];\n\n const [activeCategory, setActiveCategory] = useState<Category | undefined>(undefined);\n const category =\n activeCategory && categories.includes(activeCategory) ? activeCategory : categories[0];\n\n const views = category\n ? (family && viewsByFamilyCategory.get(family)?.get(category)) || []\n : (family && viewsByFamily.get(family)) || [];\n\n return {\n families,\n activeTab: family,\n setActiveTab,\n categories,\n activeCategory: category,\n setActiveCategory,\n views,\n };\n}\n\ninterface TabProps {\n readonly label: string;\n readonly active: boolean;\n readonly disabled: boolean;\n readonly onPress: () => void;\n readonly testID: string;\n}\n\nfunction Tab({ label, active, disabled, onPress, testID }: TabProps) {\n return (\n <Pressable\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: active, disabled }}\n testID={testID}\n disabled={disabled}\n onPress={onPress}\n style={[styles.tab, active && styles.tabActive, disabled && styles.tabDisabled]}\n >\n <Text style={[styles.tabLabel, active && styles.tabLabelActive]}>{label}</Text>\n </Pressable>\n );\n}\n\ninterface CategoryItemProps {\n readonly label: string;\n readonly active: boolean;\n readonly disabled: boolean;\n readonly onPress: () => void;\n readonly testID: string;\n}\n\nfunction CategoryItem({ label, active, disabled, onPress, testID }: CategoryItemProps) {\n return (\n <Pressable\n accessibilityRole=\"menuitem\"\n accessibilityState={{ selected: active, disabled }}\n testID={testID}\n disabled={disabled}\n onPress={onPress}\n style={[\n styles.category,\n active && styles.categoryActive,\n disabled && styles.categoryDisabled,\n ]}\n >\n <Text style={[styles.categoryLabel, active && styles.categoryLabelActive]}>{label}</Text>\n </Pressable>\n );\n}\n\nfunction titleCase(s: string): string {\n return s\n .split('-')\n .map((w) => (w ? w.charAt(0).toUpperCase() + w.slice(1) : w))\n .join(' ');\n}\n\nconst styles = StyleSheet.create({\n tab: { paddingVertical: 6, paddingHorizontal: 12, borderRadius: 999, backgroundColor: '#1f1f1f' },\n tabActive: { backgroundColor: '#333' },\n tabDisabled: { opacity: 0.5 },\n tabLabel: { color: '#999', fontSize: 12, fontWeight: '600' },\n tabLabelActive: { color: '#fff' },\n category: {\n paddingVertical: 6,\n paddingHorizontal: 10,\n borderRadius: 8,\n backgroundColor: '#1a1a1a',\n },\n categoryActive: { backgroundColor: '#2c2c2c' },\n categoryDisabled: { opacity: 0.5 },\n categoryLabel: { color: '#9a9a9a', fontSize: 12, fontWeight: '500' },\n categoryLabelActive: { color: '#fff' },\n});\n\nexport { PresetTile } from '../preset-tile';\n// The `./picker` subpath barrel: the chassis above plus the composable parts and\n// types a consumer can use to build a BYO layout.\nexport { PresetBookMenuLayout } from './layout';\nexport type {\n Category,\n Family,\n PresetBookMenuProps,\n PresetBookMenuSelection,\n PresetBookMenuStyleProps,\n PresetItemState,\n PresetView,\n RenderTile,\n} from './preset-book-menu.types';\nexport { PresetGrid } from './preset-grid';\n"]}
@@ -0,0 +1,25 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ interface PresetBookMenuLayoutProps {
4
+ /**
5
+ * The family tab bar; conventionally a row of tab buttons, one per family.
6
+ * The layout already wraps this in a `tablist`-role row with flex/gap, so the
7
+ * filler should be the bare tab elements (don't add another row wrapper).
8
+ */
9
+ readonly tabsZone: ReactNode;
10
+ /**
11
+ * The category menu for the active family (a column of buttons, one per
12
+ * category). Omit (or pass nothing) for a flat family: the body then spans
13
+ * full width with no left column. The layout wraps this in the left column;
14
+ * the filler should be the bare item elements.
15
+ */
16
+ readonly sidebarZone?: ReactNode;
17
+ /** The active family's renderer (a PresetGrid); fills the body column. */
18
+ readonly bodyZone: ReactNode;
19
+ /** NativeWind class for the container; resolved via the `./nativewind` interop. */
20
+ readonly className?: string | undefined;
21
+ readonly style?: StyleProp<ViewStyle> | undefined;
22
+ }
23
+ export declare function PresetBookMenuLayout({ tabsZone, sidebarZone, bodyZone, style, }: PresetBookMenuLayoutProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/layout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhF,UAAU,yBAAyB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CACnD;AAID,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,KAAK,GACN,EAAE,yBAAyB,2CAkB3B","sourcesContent":["// Zone container for the composite picker: a tab bar above, then (when the\n// active family has categories) a left-hand category menu beside the body.\n// Presentational only; the composite fills the zones.\n\nimport type { ReactNode } from 'react';\nimport { type StyleProp, StyleSheet, View, type ViewStyle } from 'react-native';\n\ninterface PresetBookMenuLayoutProps {\n /**\n * The family tab bar; conventionally a row of tab buttons, one per family.\n * The layout already wraps this in a `tablist`-role row with flex/gap, so the\n * filler should be the bare tab elements (don't add another row wrapper).\n */\n readonly tabsZone: ReactNode;\n /**\n * The category menu for the active family (a column of buttons, one per\n * category). Omit (or pass nothing) for a flat family: the body then spans\n * full width with no left column. The layout wraps this in the left column;\n * the filler should be the bare item elements.\n */\n readonly sidebarZone?: ReactNode;\n /** The active family's renderer (a PresetGrid); fills the body column. */\n readonly bodyZone: ReactNode;\n /** NativeWind class for the container; resolved via the `./nativewind` interop. */\n readonly className?: string | undefined;\n readonly style?: StyleProp<ViewStyle> | undefined;\n}\n\n// `className` is consumed by the ./nativewind cssInterop at the boundary and\n// arrives merged into `style`, so it is not destructured/read here.\nexport function PresetBookMenuLayout({\n tabsZone,\n sidebarZone,\n bodyZone,\n style,\n}: PresetBookMenuLayoutProps) {\n return (\n <View style={[styles.container, style]}>\n <View accessibilityRole=\"tablist\" accessibilityLabel=\"Effect families\" style={styles.tabs}>\n {tabsZone}\n </View>\n {sidebarZone ? (\n <View style={styles.split}>\n <View accessibilityRole=\"menu\" accessibilityLabel=\"Categories\" style={styles.sidebar}>\n {sidebarZone}\n </View>\n <View style={styles.bodyFlex}>{bodyZone}</View>\n </View>\n ) : (\n <View style={styles.body}>{bodyZone}</View>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { gap: 8, width: '100%' },\n tabs: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 },\n split: { flexDirection: 'row', gap: 12, width: '100%', alignItems: 'flex-start' },\n sidebar: { flexShrink: 0, gap: 4, minWidth: 96 },\n bodyFlex: { flex: 1 },\n body: { width: '100%' },\n});\n"]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresetBookMenuLayout = PresetBookMenuLayout;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ // `className` is consumed by the ./nativewind cssInterop at the boundary and
7
+ // arrives merged into `style`, so it is not destructured/read here.
8
+ function PresetBookMenuLayout({ tabsZone, sidebarZone, bodyZone, style, }) {
9
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.container, style], children: [(0, jsx_runtime_1.jsx)(react_native_1.View, { accessibilityRole: "tablist", accessibilityLabel: "Effect families", style: styles.tabs, children: tabsZone }), sidebarZone ? ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.split, children: [(0, jsx_runtime_1.jsx)(react_native_1.View, { accessibilityRole: "menu", accessibilityLabel: "Categories", style: styles.sidebar, children: sidebarZone }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.bodyFlex, children: bodyZone })] })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.body, children: bodyZone }))] }));
10
+ }
11
+ const styles = react_native_1.StyleSheet.create({
12
+ container: { gap: 8, width: '100%' },
13
+ tabs: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 },
14
+ split: { flexDirection: 'row', gap: 12, width: '100%', alignItems: 'flex-start' },
15
+ sidebar: { flexShrink: 0, gap: 4, minWidth: 96 },
16
+ bodyFlex: { flex: 1 },
17
+ body: { width: '100%' },
18
+ });
19
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/layout.tsx"],"names":[],"mappings":";;;;AAKA,+CAAgF;AAuBhF,6EAA6E;AAC7E,oEAAoE;AACpE,8BAAqC,EACnC,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,KAAK,GACqB;IAC1B,OAAO,CACL,wBAAC,mBAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,aACpC,uBAAC,mBAAI,IAAC,iBAAiB,EAAC,SAAS,EAAC,kBAAkB,EAAC,iBAAiB,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YACtF,QAAQ,GACJ,EACN,WAAW,CAAC,CAAC,CAAC,CACb,wBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,aACvB,uBAAC,mBAAI,IAAC,iBAAiB,EAAC,MAAM,EAAC,kBAAkB,EAAC,YAAY,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YACjF,WAAW,GACP,EACP,uBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,YAAG,QAAQ,GAAQ,IAC1C,CACR,CAAC,CAAC,CAAC,CACF,uBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,QAAQ,GAAQ,CAC5C,IACI,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IACpC,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;IACxD,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE;IACjF,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAChD,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACrB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;CACxB,CAAC,CAAC","sourcesContent":["// Zone container for the composite picker: a tab bar above, then (when the\n// active family has categories) a left-hand category menu beside the body.\n// Presentational only; the composite fills the zones.\n\nimport type { ReactNode } from 'react';\nimport { type StyleProp, StyleSheet, View, type ViewStyle } from 'react-native';\n\ninterface PresetBookMenuLayoutProps {\n /**\n * The family tab bar; conventionally a row of tab buttons, one per family.\n * The layout already wraps this in a `tablist`-role row with flex/gap, so the\n * filler should be the bare tab elements (don't add another row wrapper).\n */\n readonly tabsZone: ReactNode;\n /**\n * The category menu for the active family (a column of buttons, one per\n * category). Omit (or pass nothing) for a flat family: the body then spans\n * full width with no left column. The layout wraps this in the left column;\n * the filler should be the bare item elements.\n */\n readonly sidebarZone?: ReactNode;\n /** The active family's renderer (a PresetGrid); fills the body column. */\n readonly bodyZone: ReactNode;\n /** NativeWind class for the container; resolved via the `./nativewind` interop. */\n readonly className?: string | undefined;\n readonly style?: StyleProp<ViewStyle> | undefined;\n}\n\n// `className` is consumed by the ./nativewind cssInterop at the boundary and\n// arrives merged into `style`, so it is not destructured/read here.\nexport function PresetBookMenuLayout({\n tabsZone,\n sidebarZone,\n bodyZone,\n style,\n}: PresetBookMenuLayoutProps) {\n return (\n <View style={[styles.container, style]}>\n <View accessibilityRole=\"tablist\" accessibilityLabel=\"Effect families\" style={styles.tabs}>\n {tabsZone}\n </View>\n {sidebarZone ? (\n <View style={styles.split}>\n <View accessibilityRole=\"menu\" accessibilityLabel=\"Categories\" style={styles.sidebar}>\n {sidebarZone}\n </View>\n <View style={styles.bodyFlex}>{bodyZone}</View>\n </View>\n ) : (\n <View style={styles.body}>{bodyZone}</View>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { gap: 8, width: '100%' },\n tabs: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 },\n split: { flexDirection: 'row', gap: 12, width: '100%', alignItems: 'flex-start' },\n sidebar: { flexShrink: 0, gap: 4, minWidth: 96 },\n bodyFlex: { flex: 1 },\n body: { width: '100%' },\n});\n"]}
@@ -0,0 +1,88 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { StyleProp, ViewStyle } from 'react-native';
3
+ import type { KaleidoscopePresetBook } from '../../kaleidoscope.preset-book.types';
4
+ /**
5
+ * A composite's family; the grouping (tab) axis. This is the book entry's
6
+ * taxonomy root (`taxonomy[0]`, e.g. 'Worlds', 'Backgrounds').
7
+ */
8
+ export type Family = string;
9
+ /**
10
+ * A composite's category; the second grouping axis under a family (the
11
+ * left-hand menu). This is the book entry's `taxonomy[1]` (e.g. 'Wizard Tower'
12
+ * under 'Worlds', 'Office' under 'Backgrounds'). Absent for a depth-1 preset.
13
+ */
14
+ export type Category = string;
15
+ /**
16
+ * A preset flattened for display. `id` is the book key the picker emits and the
17
+ * effect dispatches by; `source` is a thumbnail source (the composite's
18
+ * `thumbnail`) when present, feeding the thumbnail tile/resolver.
19
+ */
20
+ export interface PresetView {
21
+ readonly id: string;
22
+ readonly label: string;
23
+ readonly family: Family;
24
+ /** The preset's category (`taxonomy[1]`); undefined for a depth-1 preset. */
25
+ readonly category?: Category | undefined;
26
+ /**
27
+ * Thumbnail source (web URL or native preset name as `string`, or a Metro
28
+ * asset module id as `number`); present when the book entry has one.
29
+ */
30
+ readonly source?: string | number | undefined;
31
+ }
32
+ /**
33
+ * The item's own interaction state, passed to a render-prop so a BYO tile/button
34
+ * can reflect it. This is the leaf's interaction surface (its own selected/press
35
+ * lifecycle), not a relayed parent-state flag.
36
+ */
37
+ export interface PresetItemState {
38
+ readonly selected: boolean;
39
+ readonly disabled: boolean;
40
+ readonly onPress: () => void;
41
+ }
42
+ /**
43
+ * Render-prop for one preset tile. `uri` is the resolved thumbnail source
44
+ * (undefined renders the recessed variant); `testID` is the tile's deterministic
45
+ * `accessibilityIdentifier` (`kld.preset.<id>`), which a BYO tile should apply to
46
+ * its pressable root so Maestro can address it.
47
+ */
48
+ export type RenderTile = (preset: PresetView, state: PresetItemState & {
49
+ readonly uri: string | number | undefined;
50
+ readonly testID: string;
51
+ }) => ReactNode;
52
+ /**
53
+ * Controlled single-selection contract shared by every picker surface. `K` is
54
+ * the id type: the composite narrows it to `keyof P` so `value`/`onSelect` speak
55
+ * the book's keys (no cast at the call site), matching how `kaleidoscope(cmd)`
56
+ * narrows. Standalone primitives default `K` to `string`.
57
+ */
58
+ export interface PresetBookMenuSelection<K extends string = string> {
59
+ /** The selected preset id, or null when nothing is selected. */
60
+ readonly value: K | null;
61
+ /**
62
+ * Emitted with the chosen id, or null when the selection is toggled off
63
+ * (clicking the selected item clears it, mapping to `kaleidoscope(null)`).
64
+ */
65
+ readonly onSelect: (id: K | null) => void;
66
+ }
67
+ /** Props common to the picker surfaces; styling and templating hooks. */
68
+ export interface PresetBookMenuStyleProps {
69
+ readonly disabled?: boolean | undefined;
70
+ /** Container class; resolved by NativeWind via the `./nativewind` interop. */
71
+ readonly className?: string | undefined;
72
+ /** Override the per-preset tile rendering (BYO tile). */
73
+ readonly renderTile?: RenderTile | undefined;
74
+ }
75
+ /** Props for the drop-in composite picker (the tabbed kitchen sink). */
76
+ export interface PresetBookMenuProps<P extends KaleidoscopePresetBook = KaleidoscopePresetBook> extends PresetBookMenuSelection<keyof P & string>, PresetBookMenuStyleProps {
77
+ /** The consumer's preset book. */
78
+ readonly presets: P;
79
+ /** RN style override for the container; applied after the defaults. */
80
+ readonly style?: StyleProp<ViewStyle> | undefined;
81
+ /** Map a preset id to a display label; defaults to a title-cased id. */
82
+ readonly labelFor?: ((id: keyof P & string) => string) | undefined;
83
+ /** Label a family tab; defaults to a title-cased family name. */
84
+ readonly tabLabelFor?: ((family: Family) => string) | undefined;
85
+ /** Label a category menu item; defaults to the raw category string. */
86
+ readonly categoryLabelFor?: ((category: Category) => string) | undefined;
87
+ }
88
+ //# sourceMappingURL=preset-book-menu.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-book-menu.types.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/preset-book-menu.types.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAEnF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,GAAG;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,KACE,SAAS,CAAC;AAEf;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAChE,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,yEAAyE;AACzE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC9C;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,CAC5F,SAAQ,uBAAuB,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAC/C,wBAAwB;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAClD,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACnE,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAChE,uEAAuE;IACvE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC1E","sourcesContent":["// Shared contract for the drop-in picker components (#28).\n//\n// These types are the seam between the composite picker, its family renderers,\n// and the per-item leaves. The composite reads the consumer's preset book,\n// flattens each preset to a `PresetView`, groups by `family` (the book entry's\n// taxonomy root), and dispatches to a family-appropriate control. Selection is\n// controlled: the\n// component emits the chosen preset id; the host applies it via `kaleidoscope`.\n//\n// No runtime imports from platform-specific packages live here (it is the\n// shared `.types.ts` for the platform-split resolver too); only `react` types.\n\nimport type { ReactNode } from 'react';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport type { KaleidoscopePresetBook } from '../../kaleidoscope.preset-book.types';\n\n/**\n * A composite's family; the grouping (tab) axis. This is the book entry's\n * taxonomy root (`taxonomy[0]`, e.g. 'Worlds', 'Backgrounds').\n */\nexport type Family = string;\n\n/**\n * A composite's category; the second grouping axis under a family (the\n * left-hand menu). This is the book entry's `taxonomy[1]` (e.g. 'Wizard Tower'\n * under 'Worlds', 'Office' under 'Backgrounds'). Absent for a depth-1 preset.\n */\nexport type Category = string;\n\n/**\n * A preset flattened for display. `id` is the book key the picker emits and the\n * effect dispatches by; `source` is a thumbnail source (the composite's\n * `thumbnail`) when present, feeding the thumbnail tile/resolver.\n */\nexport interface PresetView {\n readonly id: string;\n readonly label: string;\n readonly family: Family;\n /** The preset's category (`taxonomy[1]`); undefined for a depth-1 preset. */\n readonly category?: Category | undefined;\n /**\n * Thumbnail source (web URL or native preset name as `string`, or a Metro\n * asset module id as `number`); present when the book entry has one.\n */\n readonly source?: string | number | undefined;\n}\n\n/**\n * The item's own interaction state, passed to a render-prop so a BYO tile/button\n * can reflect it. This is the leaf's interaction surface (its own selected/press\n * lifecycle), not a relayed parent-state flag.\n */\nexport interface PresetItemState {\n readonly selected: boolean;\n readonly disabled: boolean;\n readonly onPress: () => void;\n}\n\n/**\n * Render-prop for one preset tile. `uri` is the resolved thumbnail source\n * (undefined renders the recessed variant); `testID` is the tile's deterministic\n * `accessibilityIdentifier` (`kld.preset.<id>`), which a BYO tile should apply to\n * its pressable root so Maestro can address it.\n */\nexport type RenderTile = (\n preset: PresetView,\n state: PresetItemState & {\n readonly uri: string | number | undefined;\n readonly testID: string;\n },\n) => ReactNode;\n\n/**\n * Controlled single-selection contract shared by every picker surface. `K` is\n * the id type: the composite narrows it to `keyof P` so `value`/`onSelect` speak\n * the book's keys (no cast at the call site), matching how `kaleidoscope(cmd)`\n * narrows. Standalone primitives default `K` to `string`.\n */\nexport interface PresetBookMenuSelection<K extends string = string> {\n /** The selected preset id, or null when nothing is selected. */\n readonly value: K | null;\n /**\n * Emitted with the chosen id, or null when the selection is toggled off\n * (clicking the selected item clears it, mapping to `kaleidoscope(null)`).\n */\n readonly onSelect: (id: K | null) => void;\n}\n\n/** Props common to the picker surfaces; styling and templating hooks. */\nexport interface PresetBookMenuStyleProps {\n readonly disabled?: boolean | undefined;\n /** Container class; resolved by NativeWind via the `./nativewind` interop. */\n readonly className?: string | undefined;\n /** Override the per-preset tile rendering (BYO tile). */\n readonly renderTile?: RenderTile | undefined;\n}\n\n/** Props for the drop-in composite picker (the tabbed kitchen sink). */\nexport interface PresetBookMenuProps<P extends KaleidoscopePresetBook = KaleidoscopePresetBook>\n extends PresetBookMenuSelection<keyof P & string>,\n PresetBookMenuStyleProps {\n /** The consumer's preset book. */\n readonly presets: P;\n /** RN style override for the container; applied after the defaults. */\n readonly style?: StyleProp<ViewStyle> | undefined;\n /** Map a preset id to a display label; defaults to a title-cased id. */\n readonly labelFor?: ((id: keyof P & string) => string) | undefined;\n /** Label a family tab; defaults to a title-cased family name. */\n readonly tabLabelFor?: ((family: Family) => string) | undefined;\n /** Label a category menu item; defaults to the raw category string. */\n readonly categoryLabelFor?: ((category: Category) => string) | undefined;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ // Shared contract for the drop-in picker components (#28).
3
+ //
4
+ // These types are the seam between the composite picker, its family renderers,
5
+ // and the per-item leaves. The composite reads the consumer's preset book,
6
+ // flattens each preset to a `PresetView`, groups by `family` (the book entry's
7
+ // taxonomy root), and dispatches to a family-appropriate control. Selection is
8
+ // controlled: the
9
+ // component emits the chosen preset id; the host applies it via `kaleidoscope`.
10
+ //
11
+ // No runtime imports from platform-specific packages live here (it is the
12
+ // shared `.types.ts` for the platform-split resolver too); only `react` types.
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ //# sourceMappingURL=preset-book-menu.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-book-menu.types.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/preset-book-menu.types.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAC/E,+EAA+E;AAC/E,kBAAkB;AAClB,gFAAgF;AAChF,EAAE;AACF,0EAA0E;AAC1E,+EAA+E","sourcesContent":["// Shared contract for the drop-in picker components (#28).\n//\n// These types are the seam between the composite picker, its family renderers,\n// and the per-item leaves. The composite reads the consumer's preset book,\n// flattens each preset to a `PresetView`, groups by `family` (the book entry's\n// taxonomy root), and dispatches to a family-appropriate control. Selection is\n// controlled: the\n// component emits the chosen preset id; the host applies it via `kaleidoscope`.\n//\n// No runtime imports from platform-specific packages live here (it is the\n// shared `.types.ts` for the platform-split resolver too); only `react` types.\n\nimport type { ReactNode } from 'react';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport type { KaleidoscopePresetBook } from '../../kaleidoscope.preset-book.types';\n\n/**\n * A composite's family; the grouping (tab) axis. This is the book entry's\n * taxonomy root (`taxonomy[0]`, e.g. 'Worlds', 'Backgrounds').\n */\nexport type Family = string;\n\n/**\n * A composite's category; the second grouping axis under a family (the\n * left-hand menu). This is the book entry's `taxonomy[1]` (e.g. 'Wizard Tower'\n * under 'Worlds', 'Office' under 'Backgrounds'). Absent for a depth-1 preset.\n */\nexport type Category = string;\n\n/**\n * A preset flattened for display. `id` is the book key the picker emits and the\n * effect dispatches by; `source` is a thumbnail source (the composite's\n * `thumbnail`) when present, feeding the thumbnail tile/resolver.\n */\nexport interface PresetView {\n readonly id: string;\n readonly label: string;\n readonly family: Family;\n /** The preset's category (`taxonomy[1]`); undefined for a depth-1 preset. */\n readonly category?: Category | undefined;\n /**\n * Thumbnail source (web URL or native preset name as `string`, or a Metro\n * asset module id as `number`); present when the book entry has one.\n */\n readonly source?: string | number | undefined;\n}\n\n/**\n * The item's own interaction state, passed to a render-prop so a BYO tile/button\n * can reflect it. This is the leaf's interaction surface (its own selected/press\n * lifecycle), not a relayed parent-state flag.\n */\nexport interface PresetItemState {\n readonly selected: boolean;\n readonly disabled: boolean;\n readonly onPress: () => void;\n}\n\n/**\n * Render-prop for one preset tile. `uri` is the resolved thumbnail source\n * (undefined renders the recessed variant); `testID` is the tile's deterministic\n * `accessibilityIdentifier` (`kld.preset.<id>`), which a BYO tile should apply to\n * its pressable root so Maestro can address it.\n */\nexport type RenderTile = (\n preset: PresetView,\n state: PresetItemState & {\n readonly uri: string | number | undefined;\n readonly testID: string;\n },\n) => ReactNode;\n\n/**\n * Controlled single-selection contract shared by every picker surface. `K` is\n * the id type: the composite narrows it to `keyof P` so `value`/`onSelect` speak\n * the book's keys (no cast at the call site), matching how `kaleidoscope(cmd)`\n * narrows. Standalone primitives default `K` to `string`.\n */\nexport interface PresetBookMenuSelection<K extends string = string> {\n /** The selected preset id, or null when nothing is selected. */\n readonly value: K | null;\n /**\n * Emitted with the chosen id, or null when the selection is toggled off\n * (clicking the selected item clears it, mapping to `kaleidoscope(null)`).\n */\n readonly onSelect: (id: K | null) => void;\n}\n\n/** Props common to the picker surfaces; styling and templating hooks. */\nexport interface PresetBookMenuStyleProps {\n readonly disabled?: boolean | undefined;\n /** Container class; resolved by NativeWind via the `./nativewind` interop. */\n readonly className?: string | undefined;\n /** Override the per-preset tile rendering (BYO tile). */\n readonly renderTile?: RenderTile | undefined;\n}\n\n/** Props for the drop-in composite picker (the tabbed kitchen sink). */\nexport interface PresetBookMenuProps<P extends KaleidoscopePresetBook = KaleidoscopePresetBook>\n extends PresetBookMenuSelection<keyof P & string>,\n PresetBookMenuStyleProps {\n /** The consumer's preset book. */\n readonly presets: P;\n /** RN style override for the container; applied after the defaults. */\n readonly style?: StyleProp<ViewStyle> | undefined;\n /** Map a preset id to a display label; defaults to a title-cased id. */\n readonly labelFor?: ((id: keyof P & string) => string) | undefined;\n /** Label a family tab; defaults to a title-cased family name. */\n readonly tabLabelFor?: ((family: Family) => string) | undefined;\n /** Label a category menu item; defaults to the raw category string. */\n readonly categoryLabelFor?: ((category: Category) => string) | undefined;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { type StyleProp, type ViewStyle } from 'react-native';
2
+ import type { PresetView, RenderTile } from './preset-book-menu.types';
3
+ interface PresetGridProps {
4
+ readonly presets: ReadonlyArray<PresetView>;
5
+ readonly value: string | null;
6
+ readonly onSelect: (id: string | null) => void;
7
+ readonly disabled?: boolean | undefined;
8
+ /** Override the tile rendering (BYO tile, e.g. to add a badge). */
9
+ readonly renderTile?: RenderTile | undefined;
10
+ /** NativeWind class for the grid container; resolved via the `./nativewind` interop. */
11
+ readonly className?: string | undefined;
12
+ readonly style?: StyleProp<ViewStyle> | undefined;
13
+ }
14
+ export declare function PresetGrid(props: PresetGridProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=preset-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-grid.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/preset-grid.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,SAAS,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGvE,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CACnD;AAaD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAmChD","sourcesContent":["// Family renderer: one family's presets as a uniform tile grid. Every family\n// renders through this; the per-preset tile decides wallpaper-vs-recessed by\n// whether it has a resolved thumbnail, so a family with no thumbnails just\n// renders recessed buttons of the same footprint. The tile renderer is the\n// `renderTile` slot or the default.\n//\n// The thumbnail URI comes from the platform-split `resolveImageUri`: the\n// source URL on web, the in-bundle file:// URI on native; undefined for a preset\n// with no thumbnail (the tile then renders its recessed variant).\n\nimport { Fragment } from 'react';\nimport { type StyleProp, StyleSheet, View, type ViewStyle } from 'react-native';\nimport { presetTileTestId } from '../../lib/test-id';\nimport { PresetTile } from '../preset-tile';\nimport type { PresetView, RenderTile } from './preset-book-menu.types';\nimport { resolveImageUri } from './resolve-image-uri';\n\ninterface PresetGridProps {\n readonly presets: ReadonlyArray<PresetView>;\n readonly value: string | null;\n readonly onSelect: (id: string | null) => void;\n readonly disabled?: boolean | undefined;\n /** Override the tile rendering (BYO tile, e.g. to add a badge). */\n readonly renderTile?: RenderTile | undefined;\n /** NativeWind class for the grid container; resolved via the `./nativewind` interop. */\n readonly className?: string | undefined;\n readonly style?: StyleProp<ViewStyle> | undefined;\n}\n\nconst defaultRenderTile: RenderTile = (preset, state) => (\n <PresetTile\n label={preset.label}\n uri={state.uri}\n selected={state.selected}\n disabled={state.disabled}\n onPress={state.onPress}\n testID={state.testID}\n />\n);\n\nexport function PresetGrid(props: PresetGridProps) {\n const { presets, value, onSelect, disabled = false, renderTile, style } = props;\n const renderItem = renderTile ?? defaultRenderTile;\n // Resolve each preset's thumbnail URI; pure in (id, source), so React Compiler\n // memoizes the map by `presets` when the library is compiled.\n // The native resolver looks the thumbnail up by id in Bundle.main. For image\n // presets the preset id and the thumbnail's bundle filename coincide (a\n // background's image id IS its preset id); for composites they differ (the\n // composite's thumb is bundled as `<composite-id>-thumb.webp`), so pass the\n // source as the lookup key when it is a string and falls back to the preset\n // id otherwise.\n const uriById = new Map(\n presets.map((p) => {\n const lookupId = typeof p.source === 'string' ? p.source : p.id;\n return [p.id, resolveImageUri(lookupId, p.source)] as const;\n }),\n );\n return (\n <View accessibilityRole=\"radiogroup\" accessibilityLabel=\"Presets\" style={[styles.grid, style]}>\n {presets.map((preset) => {\n const selected = value === preset.id;\n return (\n <Fragment key={preset.id}>\n {renderItem(preset, {\n selected,\n disabled,\n uri: uriById.get(preset.id),\n onPress: () => onSelect(selected ? null : preset.id),\n testID: presetTileTestId(preset.id),\n })}\n </Fragment>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, width: '100%' },\n});\n"]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresetGrid = PresetGrid;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // Family renderer: one family's presets as a uniform tile grid. Every family
6
+ // renders through this; the per-preset tile decides wallpaper-vs-recessed by
7
+ // whether it has a resolved thumbnail, so a family with no thumbnails just
8
+ // renders recessed buttons of the same footprint. The tile renderer is the
9
+ // `renderTile` slot or the default.
10
+ //
11
+ // The thumbnail URI comes from the platform-split `resolveImageUri`: the
12
+ // source URL on web, the in-bundle file:// URI on native; undefined for a preset
13
+ // with no thumbnail (the tile then renders its recessed variant).
14
+ const react_1 = require("react");
15
+ const react_native_1 = require("react-native");
16
+ const test_id_1 = require("../../lib/test-id");
17
+ const preset_tile_1 = require("../preset-tile");
18
+ const resolve_image_uri_1 = require("./resolve-image-uri");
19
+ const defaultRenderTile = (preset, state) => ((0, jsx_runtime_1.jsx)(preset_tile_1.PresetTile, { label: preset.label, uri: state.uri, selected: state.selected, disabled: state.disabled, onPress: state.onPress, testID: state.testID }));
20
+ function PresetGrid(props) {
21
+ const { presets, value, onSelect, disabled = false, renderTile, style } = props;
22
+ const renderItem = renderTile ?? defaultRenderTile;
23
+ // Resolve each preset's thumbnail URI; pure in (id, source), so React Compiler
24
+ // memoizes the map by `presets` when the library is compiled.
25
+ // The native resolver looks the thumbnail up by id in Bundle.main. For image
26
+ // presets the preset id and the thumbnail's bundle filename coincide (a
27
+ // background's image id IS its preset id); for composites they differ (the
28
+ // composite's thumb is bundled as `<composite-id>-thumb.webp`), so pass the
29
+ // source as the lookup key when it is a string and falls back to the preset
30
+ // id otherwise.
31
+ const uriById = new Map(presets.map((p) => {
32
+ const lookupId = typeof p.source === 'string' ? p.source : p.id;
33
+ return [p.id, (0, resolve_image_uri_1.resolveImageUri)(lookupId, p.source)];
34
+ }));
35
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { accessibilityRole: "radiogroup", accessibilityLabel: "Presets", style: [styles.grid, style], children: presets.map((preset) => {
36
+ const selected = value === preset.id;
37
+ return ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: renderItem(preset, {
38
+ selected,
39
+ disabled,
40
+ uri: uriById.get(preset.id),
41
+ onPress: () => onSelect(selected ? null : preset.id),
42
+ testID: (0, test_id_1.presetTileTestId)(preset.id),
43
+ }) }, preset.id));
44
+ }) }));
45
+ }
46
+ const styles = react_native_1.StyleSheet.create({
47
+ grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, width: '100%' },
48
+ });
49
+ //# sourceMappingURL=preset-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-grid.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/preset-grid.tsx"],"names":[],"mappings":";;;;AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,oCAAoC;AACpC,EAAE;AACF,yEAAyE;AACzE,iFAAiF;AACjF,kEAAkE;AAElE,iCAAiC;AACjC,+CAAgF;AAChF,+CAAqD;AACrD,gDAA4C;AAE5C,2DAAsD;AActD,MAAM,iBAAiB,GAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACvD,uBAAC,wBAAU,IACT,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,MAAM,EAAE,KAAK,CAAC,MAAM,GACpB,CACH,CAAC;AAEF,oBAA2B,KAAsB;IAC/C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAChF,MAAM,UAAU,GAAG,UAAU,IAAI,iBAAiB,CAAC;IACnD,+EAA+E;IAC/E,8DAA8D;IAC9D,6EAA6E;IAC7E,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAA,mCAAe,EAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAU,CAAC;IAC9D,CAAC,CAAC,CACH,CAAC;IACF,OAAO,CACL,uBAAC,mBAAI,IAAC,iBAAiB,EAAC,YAAY,EAAC,kBAAkB,EAAC,SAAS,EAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,YAC1F,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,CACL,uBAAC,gBAAQ,cACN,UAAU,CAAC,MAAM,EAAE;oBAClB,QAAQ;oBACR,QAAQ;oBACR,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpD,MAAM,EAAE,IAAA,0BAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;iBACpC,CAAC,IAPW,MAAM,CAAC,EAAE,CAQb,CACZ,CAAC;QACJ,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;CACxE,CAAC,CAAC","sourcesContent":["// Family renderer: one family's presets as a uniform tile grid. Every family\n// renders through this; the per-preset tile decides wallpaper-vs-recessed by\n// whether it has a resolved thumbnail, so a family with no thumbnails just\n// renders recessed buttons of the same footprint. The tile renderer is the\n// `renderTile` slot or the default.\n//\n// The thumbnail URI comes from the platform-split `resolveImageUri`: the\n// source URL on web, the in-bundle file:// URI on native; undefined for a preset\n// with no thumbnail (the tile then renders its recessed variant).\n\nimport { Fragment } from 'react';\nimport { type StyleProp, StyleSheet, View, type ViewStyle } from 'react-native';\nimport { presetTileTestId } from '../../lib/test-id';\nimport { PresetTile } from '../preset-tile';\nimport type { PresetView, RenderTile } from './preset-book-menu.types';\nimport { resolveImageUri } from './resolve-image-uri';\n\ninterface PresetGridProps {\n readonly presets: ReadonlyArray<PresetView>;\n readonly value: string | null;\n readonly onSelect: (id: string | null) => void;\n readonly disabled?: boolean | undefined;\n /** Override the tile rendering (BYO tile, e.g. to add a badge). */\n readonly renderTile?: RenderTile | undefined;\n /** NativeWind class for the grid container; resolved via the `./nativewind` interop. */\n readonly className?: string | undefined;\n readonly style?: StyleProp<ViewStyle> | undefined;\n}\n\nconst defaultRenderTile: RenderTile = (preset, state) => (\n <PresetTile\n label={preset.label}\n uri={state.uri}\n selected={state.selected}\n disabled={state.disabled}\n onPress={state.onPress}\n testID={state.testID}\n />\n);\n\nexport function PresetGrid(props: PresetGridProps) {\n const { presets, value, onSelect, disabled = false, renderTile, style } = props;\n const renderItem = renderTile ?? defaultRenderTile;\n // Resolve each preset's thumbnail URI; pure in (id, source), so React Compiler\n // memoizes the map by `presets` when the library is compiled.\n // The native resolver looks the thumbnail up by id in Bundle.main. For image\n // presets the preset id and the thumbnail's bundle filename coincide (a\n // background's image id IS its preset id); for composites they differ (the\n // composite's thumb is bundled as `<composite-id>-thumb.webp`), so pass the\n // source as the lookup key when it is a string and falls back to the preset\n // id otherwise.\n const uriById = new Map(\n presets.map((p) => {\n const lookupId = typeof p.source === 'string' ? p.source : p.id;\n return [p.id, resolveImageUri(lookupId, p.source)] as const;\n }),\n );\n return (\n <View accessibilityRole=\"radiogroup\" accessibilityLabel=\"Presets\" style={[styles.grid, style]}>\n {presets.map((preset) => {\n const selected = value === preset.id;\n return (\n <Fragment key={preset.id}>\n {renderItem(preset, {\n selected,\n disabled,\n uri: uriById.get(preset.id),\n onPress: () => onSelect(selected ? null : preset.id),\n testID: presetTileTestId(preset.id),\n })}\n </Fragment>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, width: '100%' },\n});\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ResolveImageUri } from './resolve-image-uri.types';
2
+ export declare const resolveImageUri: ResolveImageUri;
3
+ //# sourceMappingURL=resolve-image-uri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-image-uri.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/resolve-image-uri.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAajE,eAAO,MAAM,eAAe,EAAE,eAM7B,CAAC","sourcesContent":["// Native variant: the prebuild copied the curated WebP to a conventional\n// in-bundle location; the native module returns a displayable URI for it\n// (Android `asset:///...` so Fresco's asset fetcher loads it, iOS the\n// `Bundle.main` file URL). No second copy of the image.\n//\n// The `resolveImageUri` Expo function is optional here: a native build\n// predating it (or a non-background effect build) simply lacks it, so guard with\n// `?.` and fall back to the source (the preset name), which renders no thumbnail\n// rather than crashing.\n\nimport { requireNativeModule } from 'expo-modules-core';\nimport type { ResolveImageUri } from './resolve-image-uri.types';\n\ninterface ImageUriModule {\n readonly resolveImageUri?: (id: string) => string | null;\n}\n\n// Resolve the module once, lazily; it is registered at the Expo module's\n// OnCreate, before any picker renders. Hoisted out of the per-call path so a\n// grid of N tiles does not perform N module lookups per render.\nlet cachedModule: ImageUriModule | undefined;\nconst nativeModule = (): ImageUriModule =>\n (cachedModule ??= requireNativeModule<ImageUriModule>('RnWebrtcKaleidoscope'));\n\nexport const resolveImageUri: ResolveImageUri = (id, source) => {\n // A numeric source is a Metro asset module id (from `require('./foo.webp')`)\n // and is consumable directly by `<Image source={number}>`; the native module\n // resolves only string preset names, so pass numbers straight through.\n if (typeof source === 'number') return source;\n return nativeModule().resolveImageUri?.(id) ?? source;\n};\n"]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ // Native variant: the prebuild copied the curated WebP to a conventional
3
+ // in-bundle location; the native module returns a displayable URI for it
4
+ // (Android `asset:///...` so Fresco's asset fetcher loads it, iOS the
5
+ // `Bundle.main` file URL). No second copy of the image.
6
+ //
7
+ // The `resolveImageUri` Expo function is optional here: a native build
8
+ // predating it (or a non-background effect build) simply lacks it, so guard with
9
+ // `?.` and fall back to the source (the preset name), which renders no thumbnail
10
+ // rather than crashing.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.resolveImageUri = void 0;
13
+ const expo_modules_core_1 = require("expo-modules-core");
14
+ // Resolve the module once, lazily; it is registered at the Expo module's
15
+ // OnCreate, before any picker renders. Hoisted out of the per-call path so a
16
+ // grid of N tiles does not perform N module lookups per render.
17
+ let cachedModule;
18
+ const nativeModule = () => (cachedModule ??= (0, expo_modules_core_1.requireNativeModule)('RnWebrtcKaleidoscope'));
19
+ const resolveImageUri = (id, source) => {
20
+ // A numeric source is a Metro asset module id (from `require('./foo.webp')`)
21
+ // and is consumable directly by `<Image source={number}>`; the native module
22
+ // resolves only string preset names, so pass numbers straight through.
23
+ if (typeof source === 'number')
24
+ return source;
25
+ return nativeModule().resolveImageUri?.(id) ?? source;
26
+ };
27
+ exports.resolveImageUri = resolveImageUri;
28
+ //# sourceMappingURL=resolve-image-uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-image-uri.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/resolve-image-uri.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,yEAAyE;AACzE,sEAAsE;AACtE,wDAAwD;AACxD,EAAE;AACF,uEAAuE;AACvE,iFAAiF;AACjF,iFAAiF;AACjF,wBAAwB;;;AAExB,yDAAwD;AAOxD,yEAAyE;AACzE,6EAA6E;AAC7E,gEAAgE;AAChE,IAAI,YAAwC,CAAC;AAC7C,MAAM,YAAY,GAAG,GAAmB,EAAE,CACxC,CAAC,YAAY,KAAK,IAAA,uCAAmB,EAAiB,sBAAsB,CAAC,CAAC,CAAC;AAE1E,MAAM,eAAe,GAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;IAC7D,6EAA6E;IAC7E,6EAA6E;IAC7E,uEAAuE;IACvE,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,OAAO,YAAY,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;AACxD,CAAC,CAAC;AANW,QAAA,eAAe,GAAf,eAAe,CAM1B","sourcesContent":["// Native variant: the prebuild copied the curated WebP to a conventional\n// in-bundle location; the native module returns a displayable URI for it\n// (Android `asset:///...` so Fresco's asset fetcher loads it, iOS the\n// `Bundle.main` file URL). No second copy of the image.\n//\n// The `resolveImageUri` Expo function is optional here: a native build\n// predating it (or a non-background effect build) simply lacks it, so guard with\n// `?.` and fall back to the source (the preset name), which renders no thumbnail\n// rather than crashing.\n\nimport { requireNativeModule } from 'expo-modules-core';\nimport type { ResolveImageUri } from './resolve-image-uri.types';\n\ninterface ImageUriModule {\n readonly resolveImageUri?: (id: string) => string | null;\n}\n\n// Resolve the module once, lazily; it is registered at the Expo module's\n// OnCreate, before any picker renders. Hoisted out of the per-call path so a\n// grid of N tiles does not perform N module lookups per render.\nlet cachedModule: ImageUriModule | undefined;\nconst nativeModule = (): ImageUriModule =>\n (cachedModule ??= requireNativeModule<ImageUriModule>('RnWebrtcKaleidoscope'));\n\nexport const resolveImageUri: ResolveImageUri = (id, source) => {\n // A numeric source is a Metro asset module id (from `require('./foo.webp')`)\n // and is consumable directly by `<Image source={number}>`; the native module\n // resolves only string preset names, so pass numbers straight through.\n if (typeof source === 'number') return source;\n return nativeModule().resolveImageUri?.(id) ?? source;\n};\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Resolve a displayable thumbnail source for a preset.
3
+ * - Web: the preset `source` is already a usable image URL; returned as-is.
4
+ * - Native: the bundled WebP lives at a conventional in-bundle location; the
5
+ * native module returns a `file://` URI for it (no second copy of the image).
6
+ * When `source` is a `number` (a Metro asset module id), it bypasses the
7
+ * native module and is returned as-is so `<Image source={number}>` can load
8
+ * it directly through Metro's asset pipeline.
9
+ * Returns `undefined` when no thumbnail can be resolved (the tile shows just its
10
+ * label).
11
+ */
12
+ export type ResolveImageUri = (id: string, source: string | number | undefined) => string | number | undefined;
13
+ //# sourceMappingURL=resolve-image-uri.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-image-uri.types.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/resolve-image-uri.types.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAChC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC","sourcesContent":["// Shared contract for the platform-split thumbnail resolver. No runtime imports\n// from platform-specific packages (web and native variants both import this).\n\n/**\n * Resolve a displayable thumbnail source for a preset.\n * - Web: the preset `source` is already a usable image URL; returned as-is.\n * - Native: the bundled WebP lives at a conventional in-bundle location; the\n * native module returns a `file://` URI for it (no second copy of the image).\n * When `source` is a `number` (a Metro asset module id), it bypasses the\n * native module and is returned as-is so `<Image source={number}>` can load\n * it directly through Metro's asset pipeline.\n * Returns `undefined` when no thumbnail can be resolved (the tile shows just its\n * label).\n */\nexport type ResolveImageUri = (\n id: string,\n source: string | number | undefined,\n) => string | number | undefined;\n"]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Shared contract for the platform-split thumbnail resolver. No runtime imports
3
+ // from platform-specific packages (web and native variants both import this).
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=resolve-image-uri.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-image-uri.types.js","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/resolve-image-uri.types.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8EAA8E","sourcesContent":["// Shared contract for the platform-split thumbnail resolver. No runtime imports\n// from platform-specific packages (web and native variants both import this).\n\n/**\n * Resolve a displayable thumbnail source for a preset.\n * - Web: the preset `source` is already a usable image URL; returned as-is.\n * - Native: the bundled WebP lives at a conventional in-bundle location; the\n * native module returns a `file://` URI for it (no second copy of the image).\n * When `source` is a `number` (a Metro asset module id), it bypasses the\n * native module and is returned as-is so `<Image source={number}>` can load\n * it directly through Metro's asset pipeline.\n * Returns `undefined` when no thumbnail can be resolved (the tile shows just its\n * label).\n */\nexport type ResolveImageUri = (\n id: string,\n source: string | number | undefined,\n) => string | number | undefined;\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ResolveImageUri } from './resolve-image-uri.types';
2
+ export declare const resolveImageUri: ResolveImageUri;
3
+ //# sourceMappingURL=resolve-image-uri.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-image-uri.web.d.ts","sourceRoot":"","sources":["../../../../src/components/preset-book-menu/resolve-image-uri.web.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,eAAO,MAAM,eAAe,EAAE,eAAyC,CAAC","sourcesContent":["// Web variant: the preset source is already a bundled image URL, so the\n// thumbnail URI is the source itself.\n//\n// How this file gets picked over the native sibling: Metro resolves the bare\n// `../resolve-image-uri` import to `.web.ts` via platform extensions; for\n// non-Metro dist consumers it is selected by the top-level `browser` FIELD remap\n// in package.json (dist/.../resolve-image-uri.js -> .web.js). That is a\n// different mechanism than the `backgrounds/*` subpath `exports` browser\n// CONDITIONS, because this file is reached by an internal relative import, not a\n// subpath export. Adding another platform-split file under src/ui consumed via a\n// bare import means extending that `browser` field, not adding an exports entry.\n\nimport type { ResolveImageUri } from './resolve-image-uri.types';\n\nexport const resolveImageUri: ResolveImageUri = (_id, source) => source;\n"]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // Web variant: the preset source is already a bundled image URL, so the
3
+ // thumbnail URI is the source itself.
4
+ //
5
+ // How this file gets picked over the native sibling: Metro resolves the bare
6
+ // `../resolve-image-uri` import to `.web.ts` via platform extensions; for
7
+ // non-Metro dist consumers it is selected by the top-level `browser` FIELD remap
8
+ // in package.json (dist/.../resolve-image-uri.js -> .web.js). That is a
9
+ // different mechanism than the `backgrounds/*` subpath `exports` browser
10
+ // CONDITIONS, because this file is reached by an internal relative import, not a
11
+ // subpath export. Adding another platform-split file under src/ui consumed via a
12
+ // bare import means extending that `browser` field, not adding an exports entry.
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.resolveImageUri = void 0;
15
+ const resolveImageUri = (_id, source) => source;
16
+ exports.resolveImageUri = resolveImageUri;
17
+ //# sourceMappingURL=resolve-image-uri.web.js.map