@pibbl/core 0.0.1 → 0.0.3-alpha.85.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 (374) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +81 -0
  3. package/dist/features/machines/animation.d.ts +64 -0
  4. package/dist/features/machines/animation.js +55 -0
  5. package/dist/features/machines/animation.js.map +7 -0
  6. package/dist/features/machines/animation.mjs +1 -0
  7. package/dist/features/machines/assign.d.ts +16 -0
  8. package/dist/features/machines/assign.js +15 -0
  9. package/dist/features/machines/assign.js.map +7 -0
  10. package/dist/features/machines/callback.d.ts +9 -0
  11. package/dist/features/machines/callback.js +7 -0
  12. package/dist/features/machines/callback.js.map +7 -0
  13. package/dist/features/machines/hook.d.ts +30 -0
  14. package/dist/features/machines/hook.js +37 -0
  15. package/dist/features/machines/hook.js.map +7 -0
  16. package/dist/features/machines/index.d.ts +6 -0
  17. package/dist/features/machines/index.js +12 -0
  18. package/dist/features/machines/index.js.map +7 -0
  19. package/dist/features/machines/index.mjs +1 -0
  20. package/dist/features/machines/runtime.d.ts +18 -0
  21. package/dist/features/machines/runtime.js +363 -0
  22. package/dist/features/machines/runtime.js.map +7 -0
  23. package/dist/features/machines/types.d.ts +164 -0
  24. package/dist/features/physics/2d-geometry.d.ts +3 -3
  25. package/dist/features/physics/2d-geometry.js.map +1 -1
  26. package/dist/features/physics/2d.d.ts +115 -62
  27. package/dist/features/physics/2d.js +59 -28
  28. package/dist/features/physics/2d.js.map +2 -2
  29. package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
  30. package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
  31. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  32. package/dist/features/physics/lib/2d/types.d.ts +8 -30
  33. package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
  34. package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
  35. package/dist/features/sprites/formats/aseprite.d.ts +5 -0
  36. package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
  37. package/dist/features/sprites/index.d.ts +6 -0
  38. package/dist/features/sprites/loader.d.ts +25 -0
  39. package/dist/features/sprites/model.d.ts +75 -0
  40. package/dist/features/sprites/sprite.d.ts +22 -0
  41. package/dist/features/textures/index.d.ts +12 -2
  42. package/dist/features/textures/index.js +33 -1
  43. package/dist/features/textures/index.js.map +2 -2
  44. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  45. package/dist/features/textures/lib/chemical-field.js +154 -0
  46. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  47. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  48. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  49. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  50. package/dist/features/textures/lib/definitions.d.ts +3 -18
  51. package/dist/features/textures/lib/definitions.js +15 -20
  52. package/dist/features/textures/lib/definitions.js.map +2 -2
  53. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  54. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  55. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  56. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  57. package/dist/features/textures/lib/gray-scott.js +39 -0
  58. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  59. package/dist/features/textures/lib/patterns.d.ts +123 -0
  60. package/dist/features/textures/lib/patterns.js +344 -0
  61. package/dist/features/textures/lib/patterns.js.map +7 -0
  62. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  63. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  64. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  65. package/dist/features/textures/lib/simulation.d.ts +10 -4
  66. package/dist/features/textures/lib/simulation.js +23 -13
  67. package/dist/features/textures/lib/simulation.js.map +2 -2
  68. package/dist/features/viz/index.d.ts +79 -5
  69. package/dist/features/viz/index.js +145 -4
  70. package/dist/features/viz/index.js.map +2 -2
  71. package/dist/features/viz/inspection/bar.d.ts +79 -0
  72. package/dist/features/viz/inspection/bar.js +49 -0
  73. package/dist/features/viz/inspection/bar.js.map +7 -0
  74. package/dist/features/viz/inspection/candle.d.ts +156 -0
  75. package/dist/features/viz/inspection/candle.js +120 -0
  76. package/dist/features/viz/inspection/candle.js.map +7 -0
  77. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  78. package/dist/features/viz/inspection/capture.d.ts +16 -0
  79. package/dist/features/viz/inspection/capture.js +49 -0
  80. package/dist/features/viz/inspection/capture.js.map +7 -0
  81. package/dist/features/viz/inspection/handler.d.ts +36 -0
  82. package/dist/features/viz/inspection/handler.js +91 -0
  83. package/dist/features/viz/inspection/handler.js.map +7 -0
  84. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  85. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  86. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  87. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  88. package/dist/features/viz/inspection/owned-ref.js +99 -0
  89. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  90. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  91. package/dist/features/viz/inspection/painted-point.js +29 -0
  92. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  93. package/dist/features/viz/inspection/queries.d.ts +100 -0
  94. package/dist/features/viz/inspection/queries.js +192 -0
  95. package/dist/features/viz/inspection/queries.js.map +7 -0
  96. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  97. package/dist/features/viz/inspection/volume.d.ts +104 -0
  98. package/dist/features/viz/inspection/volume.js +95 -0
  99. package/dist/features/viz/inspection/volume.js.map +7 -0
  100. package/dist/features/viz/inspection.d.ts +19 -0
  101. package/dist/features/viz/inspection.js +54 -0
  102. package/dist/features/viz/inspection.js.map +7 -0
  103. package/dist/features/viz/inspection.mjs +1 -0
  104. package/dist/features/viz/lib/area-series.d.ts +62 -0
  105. package/dist/features/viz/lib/area-series.js +120 -0
  106. package/dist/features/viz/lib/area-series.js.map +7 -0
  107. package/dist/features/viz/lib/axis-labels.d.ts +2 -0
  108. package/dist/features/viz/lib/axis-labels.js +41 -0
  109. package/dist/features/viz/lib/axis-labels.js.map +7 -0
  110. package/dist/features/viz/lib/axis-title.d.ts +23 -0
  111. package/dist/features/viz/lib/axis-title.js +23 -0
  112. package/dist/features/viz/lib/axis-title.js.map +7 -0
  113. package/dist/features/viz/lib/axis.d.ts +1 -1
  114. package/dist/features/viz/lib/axis.js +50 -50
  115. package/dist/features/viz/lib/axis.js.map +2 -2
  116. package/dist/features/viz/lib/bar-scale.d.ts +7 -0
  117. package/dist/features/viz/lib/bar-scale.js +34 -0
  118. package/dist/features/viz/lib/bar-scale.js.map +7 -0
  119. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  120. package/dist/features/viz/lib/bar-series.js +21 -5
  121. package/dist/features/viz/lib/bar-series.js.map +2 -2
  122. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  123. package/dist/features/viz/lib/baseline-series.js +136 -0
  124. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  125. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  126. package/dist/features/viz/lib/candlestick-series.js +150 -0
  127. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  128. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  129. package/dist/features/viz/lib/censored-point-series.js +129 -0
  130. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  131. package/dist/features/viz/lib/chart-lines.d.ts +41 -0
  132. package/dist/features/viz/lib/chart-lines.js +32 -0
  133. package/dist/features/viz/lib/chart-lines.js.map +7 -0
  134. package/dist/features/viz/lib/color-context.d.ts +4 -0
  135. package/dist/features/viz/lib/color-context.js +41 -0
  136. package/dist/features/viz/lib/color-context.js.map +7 -0
  137. package/dist/features/viz/lib/color-math.d.ts +4 -0
  138. package/dist/features/viz/lib/color-math.js +31 -0
  139. package/dist/features/viz/lib/color-math.js.map +7 -0
  140. package/dist/features/viz/lib/color-types.d.ts +53 -0
  141. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  142. package/dist/features/viz/lib/curve-definition.js +148 -0
  143. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  144. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  145. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  146. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  147. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  148. package/dist/features/viz/lib/domain-navigation.js +77 -0
  149. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  150. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  151. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  152. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  153. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  154. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  155. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  156. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  157. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  158. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  159. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  160. package/dist/features/viz/lib/financial-comparison.js +98 -0
  161. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  162. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  163. package/dist/features/viz/lib/financial-geometry.js +67 -0
  164. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  165. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  166. package/dist/features/viz/lib/financial-indicators.js +135 -0
  167. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  168. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  169. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  170. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  171. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  172. package/dist/features/viz/lib/hover-data.js +6 -3
  173. package/dist/features/viz/lib/hover-data.js.map +2 -2
  174. package/dist/features/viz/lib/hover-types.d.ts +5 -5
  175. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  176. package/dist/features/viz/lib/interval-band-series.js +136 -0
  177. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  178. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  179. package/dist/features/viz/lib/interval-diamond-series.js +124 -0
  180. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  181. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  182. package/dist/features/viz/lib/interval-series.js +158 -0
  183. package/dist/features/viz/lib/interval-series.js.map +7 -0
  184. package/dist/features/viz/lib/line-series.d.ts +1 -1
  185. package/dist/features/viz/lib/line-series.js +47 -28
  186. package/dist/features/viz/lib/line-series.js.map +2 -2
  187. package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
  188. package/dist/features/viz/lib/linear-scale-component.js +18 -0
  189. package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
  190. package/dist/features/viz/lib/linear-scale.js +1 -1
  191. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  192. package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
  193. package/dist/features/viz/lib/log-scale-component.js +19 -0
  194. package/dist/features/viz/lib/log-scale-component.js.map +7 -0
  195. package/dist/features/viz/lib/log-scale.d.ts +2 -0
  196. package/dist/features/viz/lib/log-scale.js +53 -0
  197. package/dist/features/viz/lib/log-scale.js.map +7 -0
  198. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  199. package/dist/features/viz/lib/monotone-curve.js +63 -0
  200. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  201. package/dist/features/viz/lib/nearest.d.ts +9 -9
  202. package/dist/features/viz/lib/nearest.js.map +1 -1
  203. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  204. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  205. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  206. package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
  207. package/dist/features/viz/lib/numeric-ticks.js +54 -0
  208. package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
  209. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  210. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  211. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  212. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  213. package/dist/features/viz/lib/paired-series.js +93 -0
  214. package/dist/features/viz/lib/paired-series.js.map +7 -0
  215. package/dist/features/viz/lib/plot-series.js +11 -6
  216. package/dist/features/viz/lib/plot-series.js.map +2 -2
  217. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  218. package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
  219. package/dist/features/viz/lib/point-scale-component.js +19 -0
  220. package/dist/features/viz/lib/point-scale-component.js.map +7 -0
  221. package/dist/features/viz/lib/point-scale.d.ts +2 -0
  222. package/dist/features/viz/lib/point-scale.js +45 -0
  223. package/dist/features/viz/lib/point-scale.js.map +7 -0
  224. package/dist/features/viz/lib/point-series.d.ts +1 -1
  225. package/dist/features/viz/lib/point-series.js +36 -9
  226. package/dist/features/viz/lib/point-series.js.map +2 -2
  227. package/dist/features/viz/lib/point-types.d.ts +5 -2
  228. package/dist/features/viz/lib/reference-band.d.ts +16 -0
  229. package/dist/features/viz/lib/reference-band.js +27 -0
  230. package/dist/features/viz/lib/reference-band.js.map +7 -0
  231. package/dist/features/viz/lib/scale-adjust.js +9 -4
  232. package/dist/features/viz/lib/scale-adjust.js.map +2 -2
  233. package/dist/features/viz/lib/scale-context.d.ts +5 -4
  234. package/dist/features/viz/lib/scale-context.js +15 -11
  235. package/dist/features/viz/lib/scale-context.js.map +2 -2
  236. package/dist/features/viz/lib/scale-provider.d.ts +2 -0
  237. package/dist/features/viz/lib/scale-provider.js +13 -0
  238. package/dist/features/viz/lib/scale-provider.js.map +7 -0
  239. package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
  240. package/dist/features/viz/lib/scale-ticks.js +64 -0
  241. package/dist/features/viz/lib/scale-ticks.js.map +7 -0
  242. package/dist/features/viz/lib/scale-view.d.ts +4 -0
  243. package/dist/features/viz/lib/scale-view.js +21 -0
  244. package/dist/features/viz/lib/scale-view.js.map +7 -0
  245. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  246. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  247. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  248. package/dist/features/viz/lib/series-position.d.ts +12 -0
  249. package/dist/features/viz/lib/series-position.js +44 -0
  250. package/dist/features/viz/lib/series-position.js.map +7 -0
  251. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  252. package/dist/features/viz/lib/step-curves.js +53 -0
  253. package/dist/features/viz/lib/step-curves.js.map +7 -0
  254. package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
  255. package/dist/features/viz/lib/symlog-scale-component.js +19 -0
  256. package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
  257. package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
  258. package/dist/features/viz/lib/symlog-scale.js +38 -0
  259. package/dist/features/viz/lib/symlog-scale.js.map +7 -0
  260. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  261. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  262. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  263. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  264. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  265. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  266. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  267. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  268. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  269. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  270. package/dist/features/viz/lib/trajectory-series.js +111 -0
  271. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  272. package/dist/features/viz/lib/types.d.ts +114 -21
  273. package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
  274. package/dist/features/viz/lib/use-bar-scale.js +9 -0
  275. package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
  276. package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
  277. package/dist/features/viz/lib/use-continuous-scale.js +14 -0
  278. package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
  279. package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
  280. package/dist/features/viz/lib/use-linear-scale.js +9 -0
  281. package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
  282. package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
  283. package/dist/features/viz/lib/use-log-scale.js +9 -0
  284. package/dist/features/viz/lib/use-log-scale.js.map +7 -0
  285. package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
  286. package/dist/features/viz/lib/use-point-scale.js +9 -0
  287. package/dist/features/viz/lib/use-point-scale.js.map +7 -0
  288. package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
  289. package/dist/features/viz/lib/use-symlog-scale.js +9 -0
  290. package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
  291. package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
  292. package/dist/features/viz/lib/use-utc-scale.js +9 -0
  293. package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
  294. package/dist/features/viz/lib/utc-labels.d.ts +12 -0
  295. package/dist/features/viz/lib/utc-labels.js +27 -0
  296. package/dist/features/viz/lib/utc-labels.js.map +7 -0
  297. package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
  298. package/dist/features/viz/lib/utc-scale-component.js +18 -0
  299. package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
  300. package/dist/features/viz/lib/utc-scale.d.ts +21 -0
  301. package/dist/features/viz/lib/utc-scale.js +123 -0
  302. package/dist/features/viz/lib/utc-scale.js.map +7 -0
  303. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  304. package/dist/features/viz/lib/volume-series.js +117 -0
  305. package/dist/features/viz/lib/volume-series.js.map +7 -0
  306. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  307. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  308. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  309. package/dist/filters/emboss-gpu.d.ts +4 -0
  310. package/dist/filters/emboss-gpu.js +39 -0
  311. package/dist/filters/emboss-gpu.js.map +7 -0
  312. package/dist/filters/emboss.d.ts +32 -0
  313. package/dist/filters/emboss.js +106 -0
  314. package/dist/filters/emboss.js.map +7 -0
  315. package/dist/filters/reflection-gpu.d.ts +3 -1
  316. package/dist/filters/reflection-gpu.js +5 -2
  317. package/dist/filters/reflection-gpu.js.map +2 -2
  318. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  319. package/dist/filters/render-emboss-boundary.js +131 -0
  320. package/dist/filters/render-emboss-boundary.js.map +7 -0
  321. package/dist/filters.d.ts +2 -0
  322. package/dist/filters.js +2 -0
  323. package/dist/filters.js.map +2 -2
  324. package/dist/index.d.ts +3 -1
  325. package/dist/index.js +3 -0
  326. package/dist/index.js.map +2 -2
  327. package/dist/internal.d.ts +2 -0
  328. package/dist/internal.js +4 -0
  329. package/dist/internal.js.map +2 -2
  330. package/dist/lib/animation/definition.d.ts +5 -3
  331. package/dist/lib/animation/definition.js +29 -4
  332. package/dist/lib/animation/definition.js.map +2 -2
  333. package/dist/lib/animation/playback.d.ts +8 -0
  334. package/dist/lib/animation/playback.js +33 -11
  335. package/dist/lib/animation/playback.js.map +2 -2
  336. package/dist/lib/animation/spring.d.ts +3 -1
  337. package/dist/lib/animation/spring.js.map +2 -2
  338. package/dist/lib/animation/types.d.ts +29 -73
  339. package/dist/lib/events/event-facade.d.ts +13 -0
  340. package/dist/lib/events/event-facade.js +23 -0
  341. package/dist/lib/events/event-facade.js.map +2 -2
  342. package/dist/lib/events/propagation.js +19 -14
  343. package/dist/lib/events/propagation.js.map +2 -2
  344. package/dist/lib/execute-render.js +13 -0
  345. package/dist/lib/execute-render.js.map +2 -2
  346. package/dist/lib/hooks/use-animated-value.d.ts +11 -21
  347. package/dist/lib/hooks/use-animated-value.js +23 -70
  348. package/dist/lib/hooks/use-animated-value.js.map +3 -3
  349. package/dist/lib/hooks/use-playback.js +1 -0
  350. package/dist/lib/hooks/use-playback.js.map +2 -2
  351. package/dist/lib/recording/recording.d.ts +43 -0
  352. package/dist/lib/recording/recording.js +555 -0
  353. package/dist/lib/recording/recording.js.map +7 -0
  354. package/dist/lib/recording/types.d.ts +118 -0
  355. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  356. package/dist/lib/recording/wasm-bytes.js +5 -0
  357. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  358. package/dist/lib/recording/worker-source.d.ts +1 -0
  359. package/dist/lib/recording/worker-source.js +5 -0
  360. package/dist/lib/recording/worker-source.js.map +7 -0
  361. package/dist/lib/render-transaction.d.ts +5 -2
  362. package/dist/lib/render-transaction.js +23 -1
  363. package/dist/lib/render-transaction.js.map +2 -2
  364. package/dist/lib/series-inspection-frame.d.ts +18 -0
  365. package/dist/lib/series-inspection-frame.js +70 -0
  366. package/dist/lib/series-inspection-frame.js.map +7 -0
  367. package/dist/lib/types.d.ts +6 -0
  368. package/package.json +27 -5
  369. package/dist/features/viz/lib/scale.d.ts +0 -11
  370. package/dist/features/viz/lib/scale.js +0 -80
  371. package/dist/features/viz/lib/scale.js.map +0 -7
  372. package/dist/features/viz/lib/use-scale.d.ts +0 -20
  373. package/dist/features/viz/lib/use-scale.js +0 -10
  374. package/dist/features/viz/lib/use-scale.js.map +0 -7
@@ -0,0 +1,149 @@
1
+ import { type TextureRecipe } from "@pibbl/core";
2
+ import type { PatternMotionOptions } from "./patterns.js";
3
+ /** Seamless circular dots with optional stagger and seeded displacement. @see {@link polkaDots} */
4
+ export interface PolkaDotsOptions extends PatternMotionOptions {
5
+ /** Integer columns, 1–64; default 12. See {@link PolkaDotsOptions}. */
6
+ readonly columns?: number;
7
+ /** Even integer rows, 2–64; default 12, preserving stagger across the seam. See {@link PolkaDotsOptions}. */
8
+ readonly rows?: number;
9
+ /** Radius in cell fractions, 0–0.5; default 0.3. See {@link PolkaDotsOptions}. */
10
+ readonly radius?: number;
11
+ /** Alternate-row horizontal offset in cell fractions, 0–1; default 0. See {@link PolkaDotsOptions}. */
12
+ readonly stagger?: number;
13
+ /** Seeded center displacement per axis in cell fractions, 0–0.5; default 0. See {@link PolkaDotsOptions}. */
14
+ readonly jitter?: number;
15
+ /** Unsigned 32-bit variation seed; default 42. See {@link PolkaDotsOptions}. */
16
+ readonly seed?: number;
17
+ }
18
+ /** A periodic tonal field expressed as varying dot sizes. @see {@link halftone} */
19
+ export interface HalftoneOptions extends PatternMotionOptions {
20
+ /** Integer columns, 1–64; default 24. See {@link HalftoneOptions}. */
21
+ readonly columns?: number;
22
+ /** Even integer rows, 2–64; default 24. See {@link HalftoneOptions}. */
23
+ readonly rows?: number;
24
+ /** Smallest dot radius in cell fractions, 0–0.5; default 0.05. See {@link HalftoneOptions}. */
25
+ readonly minRadius?: number;
26
+ /** Largest dot radius in cell fractions, minRadius–0.5; default 0.45. See {@link HalftoneOptions}. */
27
+ readonly maxRadius?: number;
28
+ /** Integer horizontal tonal periods, 0–16; default 1. See {@link HalftoneOptions}. */
29
+ readonly cyclesX?: number;
30
+ /** Integer vertical tonal periods, 0–16; default 1. See {@link HalftoneOptions}. */
31
+ readonly cyclesY?: number;
32
+ /** Tonal wave amplitude, 0–1; default 0.7. See {@link HalftoneOptions}. */
33
+ readonly contrast?: number;
34
+ /** Alternate-row offset in cell fractions, 0–1; default 0.5. See {@link HalftoneOptions}. */
35
+ readonly stagger?: number;
36
+ }
37
+ /** Seeded connecting quarter-circle tiles. @see {@link truchet} */
38
+ export interface TruchetOptions extends PatternMotionOptions {
39
+ /** Integer columns, 1–64; default 8. See {@link TruchetOptions}. */
40
+ readonly columns?: number;
41
+ /** Integer rows, 1–64; default 8. See {@link TruchetOptions}. */
42
+ readonly rows?: number;
43
+ /** Stroke width in cell fractions, 0–0.5; default 0.12. See {@link TruchetOptions}. */
44
+ readonly lineWidth?: number;
45
+ /** Fraction of tiles with the first orientation, 0–1; default 0.5. See {@link TruchetOptions}. */
46
+ readonly orientationBias?: number;
47
+ /** Unsigned 32-bit orientation seed; default 42. See {@link TruchetOptions}. */
48
+ readonly seed?: number;
49
+ }
50
+ /** One band in an ordered plaid repeat; colors are named keys. @see {@link PlaidOptions} */
51
+ export interface PlaidBand<Key extends string = string> {
52
+ /** Positive relative width; all widths on an axis are normalized together. See {@link PlaidBand}. */
53
+ readonly width: number;
54
+ /** A key from the plaid's colors dictionary. See {@link PlaidBand}. */
55
+ readonly color: Key;
56
+ }
57
+ /** A plaid's named colors, ordered bands, and crossing balance. @see {@link plaid} */
58
+ export interface PlaidOptions<Colors extends Readonly<Record<string, string>> = Readonly<Record<string, string>>> extends PatternMotionOptions {
59
+ /** Dictionary of 1–16 opaque #RRGGBB colors. See {@link PlaidOptions}. */
60
+ readonly colors: Colors;
61
+ /** Ordered horizontal bands, 1–32, referencing existing color keys. See {@link PlaidOptions}. */
62
+ readonly horizontal: readonly PlaidBand<NoInfer<Extract<keyof Colors, string>>>[];
63
+ /** Ordered vertical bands, 1–32, referencing existing color keys. See {@link PlaidOptions}. */
64
+ readonly vertical: readonly PlaidBand<NoInfer<Extract<keyof Colors, string>>>[];
65
+ /** Horizontal contribution at crossings, 0–1; default 0.5. See {@link PlaidOptions}. */
66
+ readonly crossing?: number;
67
+ }
68
+ /**
69
+ * Creates a seamless dot lattice using palette endpoints.
70
+ * @param options - Dot geometry and motion.
71
+ * @returns A mountable texture recipe.
72
+ * @see {@link PolkaDotsOptions}
73
+ */
74
+ export declare function polkaDots(options?: PolkaDotsOptions): TextureRecipe;
75
+ /**
76
+ * Creates seamless varying-size dots from a periodic tonal field.
77
+ * @param options - Dot sizes, tonal periods, and motion.
78
+ * @returns A mountable texture recipe.
79
+ * @see {@link HalftoneOptions}
80
+ */
81
+ export declare function halftone(options?: HalftoneOptions): TextureRecipe;
82
+ /**
83
+ * Creates seeded quarter-circle tiles that connect across every edge.
84
+ * @param options - Tile counts, stroke width, seed, and motion.
85
+ * @returns A mountable texture recipe.
86
+ * @see {@link TruchetOptions}
87
+ */
88
+ export declare function truchet(options?: TruchetOptions): TextureRecipe;
89
+ /**
90
+ * Creates plaid using checked color keys and ordered relative-width bands.
91
+ * @param options - Named colors, bands, crossing balance, and motion.
92
+ * @returns A mountable texture recipe.
93
+ * @see {@link PlaidOptions}
94
+ */
95
+ export declare function plaid<const Colors extends Readonly<Record<string, string>>>(options: PlaidOptions<Colors>): TextureRecipe;
96
+ /** Named-color band configurations for gingham, tartan, and windowpane patterns. @see {@link plaid} */
97
+ export declare const plaidPresets: Readonly<{
98
+ /** Equal-width alternating bands. See {@link plaidPresets}. */
99
+ gingham: Readonly<{
100
+ colors: Readonly<{
101
+ background: "#f5e9d3";
102
+ primary: "#304c48";
103
+ accent: "#c56948";
104
+ }>;
105
+ horizontal: readonly Readonly<{
106
+ width: number;
107
+ color: "accent" | "background" | "primary";
108
+ }>[];
109
+ vertical: readonly Readonly<{
110
+ width: number;
111
+ color: "accent" | "background" | "primary";
112
+ }>[];
113
+ crossing: 0.5;
114
+ }>;
115
+ /** Symmetric bands with narrow accent lines. See {@link plaidPresets}. */
116
+ tartan: Readonly<{
117
+ colors: Readonly<{
118
+ background: "#f5e9d3";
119
+ primary: "#304c48";
120
+ accent: "#c56948";
121
+ }>;
122
+ horizontal: readonly Readonly<{
123
+ width: number;
124
+ color: "accent" | "background" | "primary";
125
+ }>[];
126
+ vertical: readonly Readonly<{
127
+ width: number;
128
+ color: "accent" | "background" | "primary";
129
+ }>[];
130
+ crossing: 0.5;
131
+ }>;
132
+ /** Narrow crossing lines on a broad background. See {@link plaidPresets}. */
133
+ windowpane: Readonly<{
134
+ colors: Readonly<{
135
+ background: "#f5e9d3";
136
+ primary: "#304c48";
137
+ accent: "#c56948";
138
+ }>;
139
+ horizontal: readonly Readonly<{
140
+ width: number;
141
+ color: "accent" | "background" | "primary";
142
+ }>[];
143
+ vertical: readonly Readonly<{
144
+ width: number;
145
+ color: "accent" | "background" | "primary";
146
+ }>[];
147
+ crossing: 0.5;
148
+ }>;
149
+ }>;
@@ -0,0 +1,305 @@
1
+ import { defineTexture } from "@pibbl/core";
2
+ import { paletteLut, texturePalettes, validateSeed } from "./palette.js";
3
+ const tau = 2 * Math.PI;
4
+ const wrap = (n) => (n % 1 + 1) % 1;
5
+ function bound(name, n, min, max, integer = false) {
6
+ if (!Number.isFinite(n) || n < min || n > max || integer && !Number.isInteger(n))
7
+ throw new RangeError(
8
+ `${name} must be ${integer ? "an integer" : "finite"} in ${min}\u2013${max}.`
9
+ );
10
+ return n;
11
+ }
12
+ function motion(o) {
13
+ return {
14
+ phase: wrap(
15
+ bound("phase", o.phase ?? 0, -Number.MAX_VALUE, Number.MAX_VALUE)
16
+ ),
17
+ speed: bound("speed", o.speed ?? 0, 0, 20)
18
+ };
19
+ }
20
+ function grid(o, defaults, even = false) {
21
+ const columns = bound("columns", o.columns ?? defaults, 1, 64, true), rows = bound("rows", o.rows ?? defaults, even ? 2 : 1, 64, true);
22
+ if (even && rows % 2)
23
+ throw new RangeError("rows must be even for seamless stagger.");
24
+ return { columns, rows };
25
+ }
26
+ function hash(x, y, columns, rows, seed) {
27
+ const ix = (x % columns + columns) % columns, iy = (y % rows + rows) % rows;
28
+ let h = Math.imul(iy * columns + ix ^ seed, 73244475);
29
+ h = Math.imul(h ^ h >>> 16, 73244475);
30
+ return ((h ^ h >>> 16) >>> 0) / 4294967296;
31
+ }
32
+ function coverage(distance, halfWidth, pixel) {
33
+ if (halfWidth === 0) return 0;
34
+ const t = Math.max(0, Math.min(1, (halfWidth - distance) / pixel + 0.5));
35
+ return t * t * (3 - 2 * t);
36
+ }
37
+ function geometry(validate, sample, named = false) {
38
+ const definition = defineTexture({
39
+ create(context, config) {
40
+ if (config.speed) context.requestFrame();
41
+ return {
42
+ config,
43
+ phase: config.phase,
44
+ fresh: true,
45
+ dirty: true,
46
+ image: new ImageData(context.canvas.width, context.canvas.height),
47
+ paletteKey: "",
48
+ lut: void 0
49
+ };
50
+ },
51
+ update(state, config, context) {
52
+ if (JSON.stringify(config) === JSON.stringify(state.config)) return;
53
+ if (config.phase !== state.config.phase) state.phase = config.phase;
54
+ if (config.speed !== state.config.speed) state.fresh = true;
55
+ state.config = config;
56
+ state.dirty = true;
57
+ context.invalidate();
58
+ if (config.speed) context.requestFrame();
59
+ },
60
+ advance(state, frame, context) {
61
+ if (!state.config.speed) return;
62
+ if (!state.fresh && frame.delta > 0) {
63
+ state.phase = wrap(
64
+ state.phase + frame.delta * state.config.speed / 1e3
65
+ );
66
+ state.dirty = true;
67
+ context.invalidate();
68
+ }
69
+ state.fresh = false;
70
+ context.requestFrame();
71
+ },
72
+ rasterize(state, context) {
73
+ if (named && context.palette !== void 0)
74
+ throw new TypeError(
75
+ "plaid uses its named colors dictionary; omit useTexture palette."
76
+ );
77
+ const palette = context.palette ?? texturePalettes.porcelain, key = palette.join();
78
+ if (!named && key !== state.paletteKey) {
79
+ state.lut = paletteLut(palette);
80
+ state.paletteKey = key;
81
+ state.dirty = true;
82
+ }
83
+ if (!state.dirty) return;
84
+ const { width, height } = context.canvas, data = state.image.data;
85
+ for (let y = 0; y < height; y++)
86
+ for (let x = 0; x < width; x++) {
87
+ const result = sample(
88
+ state.config,
89
+ x === width - 1 ? 0 : x / (width - 1),
90
+ y === height - 1 ? 0 : y / (height - 1),
91
+ state.phase,
92
+ 1 / (width - 1),
93
+ 1 / (height - 1)
94
+ ), index = (y * width + x) * 4;
95
+ if (typeof result === "number") {
96
+ const at = Math.round(Math.max(0, Math.min(1, result)) * 255) * 4;
97
+ data[index] = state.lut[at];
98
+ data[index + 1] = state.lut[at + 1];
99
+ data[index + 2] = state.lut[at + 2];
100
+ } else {
101
+ data[index] = result[0];
102
+ data[index + 1] = result[1];
103
+ data[index + 2] = result[2];
104
+ }
105
+ data[index + 3] = 255;
106
+ }
107
+ context.canvas.getContext("2d").putImageData(state.image, 0, 0);
108
+ state.dirty = false;
109
+ },
110
+ dispose(state) {
111
+ state.image = void 0;
112
+ state.lut = void 0;
113
+ }
114
+ });
115
+ return (o) => definition(validate(o));
116
+ }
117
+ function dots(c, u, v, radius, px, py) {
118
+ const x = u * c.columns, y = v * c.rows, pixel = Math.max(px * c.columns, py * c.rows);
119
+ let amount = 0;
120
+ for (let j = Math.floor(y) - 1; j <= Math.floor(y) + 1; j++)
121
+ for (let i = Math.floor(x) - 2; i <= Math.floor(x) + 1; i++) {
122
+ const row = (j % c.rows + c.rows) % c.rows;
123
+ const cx = i + 0.5 + row % 2 * c.stagger + (hash(i, j, c.columns, c.rows, c.seed) - 0.5) * 2 * c.jitter;
124
+ const cy = j + 0.5 + (hash(i, j, c.columns, c.rows, c.seed ^ 6574) - 0.5) * 2 * c.jitter;
125
+ amount = Math.max(
126
+ amount,
127
+ coverage(Math.hypot(x - cx, y - cy), radius(i, j), pixel)
128
+ );
129
+ }
130
+ return amount;
131
+ }
132
+ const dotRecipe = geometry(
133
+ (o) => ({
134
+ ...motion(o),
135
+ ...grid(o, 12, true),
136
+ radius: bound("radius", o.radius ?? 0.3, 0, 0.5),
137
+ stagger: bound("stagger", o.stagger ?? 0, 0, 1),
138
+ jitter: bound("jitter", o.jitter ?? 0, 0, 0.5),
139
+ seed: validateSeed(o.seed ?? 42)
140
+ }),
141
+ (c, u, v, p, px, py) => dots(c, wrap(u + p), v, () => c.radius, px, py)
142
+ );
143
+ function polkaDots(options = {}) {
144
+ return dotRecipe(options);
145
+ }
146
+ const halftoneRecipe = geometry(
147
+ (o) => {
148
+ const minRadius = bound("minRadius", o.minRadius ?? 0.05, 0, 0.5), maxRadius = bound("maxRadius", o.maxRadius ?? 0.45, minRadius, 0.5);
149
+ return {
150
+ ...motion(o),
151
+ ...grid(o, 24, true),
152
+ minRadius,
153
+ maxRadius,
154
+ cyclesX: bound("cyclesX", o.cyclesX ?? 1, 0, 16, true),
155
+ cyclesY: bound("cyclesY", o.cyclesY ?? 1, 0, 16, true),
156
+ contrast: bound("contrast", o.contrast ?? 0.7, 0, 1),
157
+ stagger: bound("stagger", o.stagger ?? 0.5, 0, 1),
158
+ jitter: 0,
159
+ seed: 42
160
+ };
161
+ },
162
+ (c, u, v, p, px, py) => dots(
163
+ c,
164
+ u,
165
+ v,
166
+ (x, y) => {
167
+ const tone = 0.5 + 0.25 * c.contrast * (Math.sin(tau * ((x + 0.5) / c.columns * c.cyclesX + p)) + Math.sin(tau * ((y + 0.5) / c.rows * c.cyclesY + p)));
168
+ return c.minRadius + (c.maxRadius - c.minRadius) * tone;
169
+ },
170
+ px,
171
+ py
172
+ )
173
+ );
174
+ function halftone(options = {}) {
175
+ return halftoneRecipe(options);
176
+ }
177
+ const truchetRecipe = geometry(
178
+ (o) => ({
179
+ ...motion(o),
180
+ ...grid(o, 8),
181
+ lineWidth: bound("lineWidth", o.lineWidth ?? 0.12, 0, 0.5),
182
+ orientationBias: bound("orientationBias", o.orientationBias ?? 0.5, 0, 1),
183
+ seed: validateSeed(o.seed ?? 42)
184
+ }),
185
+ (c, u, v, p, px, py) => {
186
+ const x = wrap(u + p) * c.columns, y = wrap(v + p) * c.rows, ix = Math.floor(x), iy = Math.floor(y), a = x - ix, b = y - iy;
187
+ const first = hash(ix, iy, c.columns, c.rows, c.seed) < c.orientationBias;
188
+ const distance = first ? Math.min(
189
+ Math.abs(Math.hypot(a, b) - 0.5),
190
+ Math.abs(Math.hypot(1 - a, 1 - b) - 0.5)
191
+ ) : Math.min(
192
+ Math.abs(Math.hypot(1 - a, b) - 0.5),
193
+ Math.abs(Math.hypot(a, 1 - b) - 0.5)
194
+ );
195
+ return coverage(
196
+ distance,
197
+ c.lineWidth / 2,
198
+ Math.max(px * c.columns, py * c.rows)
199
+ );
200
+ }
201
+ );
202
+ function truchet(options = {}) {
203
+ return truchetRecipe(options);
204
+ }
205
+ function bands(input, colors) {
206
+ if (!Array.isArray(input) || input.length < 1 || input.length > 32)
207
+ throw new RangeError("Plaid requires 1\u201332 bands per axis.");
208
+ const total = input.reduce(
209
+ (n, b) => n + bound("band width", b.width, Number.MIN_VALUE, 1e6),
210
+ 0
211
+ );
212
+ let end = 0;
213
+ return input.map((b) => {
214
+ if (!Object.hasOwn(colors, b.color))
215
+ throw new TypeError(`Unknown plaid color key: ${b.color}`);
216
+ end += b.width / total;
217
+ return { end, color: colors[b.color] };
218
+ });
219
+ }
220
+ function bandColor(bands2, position, footprint) {
221
+ const center = wrap(position), lo = center - footprint / 2, hi = center + footprint / 2, result = [0, 0, 0];
222
+ for (let shift = -1; shift <= 1; shift++) {
223
+ let start = shift;
224
+ for (const band of bands2) {
225
+ const end = shift + band.end, weight = Math.max(0, Math.min(hi, end) - Math.max(lo, start)) / footprint;
226
+ for (let k = 0; k < 3; k++) result[k] += band.color[k] * weight;
227
+ start = end;
228
+ }
229
+ }
230
+ return result;
231
+ }
232
+ const plaidRecipe = geometry(
233
+ (o) => {
234
+ const entries = Object.entries(o.colors);
235
+ if (entries.length < 1 || entries.length > 16)
236
+ throw new RangeError("Plaid colors requires 1\u201316 named entries.");
237
+ const colors = /* @__PURE__ */ Object.create(null);
238
+ for (const [key, value] of entries) {
239
+ if (!key || !/^#[\da-f]{6}$/i.test(value))
240
+ throw new TypeError("Plaid colors require named #RRGGBB entries.");
241
+ colors[key] = [
242
+ parseInt(value.slice(1, 3), 16),
243
+ parseInt(value.slice(3, 5), 16),
244
+ parseInt(value.slice(5, 7), 16)
245
+ ];
246
+ }
247
+ return {
248
+ ...motion(o),
249
+ horizontal: bands(o.horizontal, colors),
250
+ vertical: bands(o.vertical, colors),
251
+ crossing: bound("crossing", o.crossing ?? 0.5, 0, 1)
252
+ };
253
+ },
254
+ (c, u, v, p, px, py) => {
255
+ const horizontal = bandColor(c.horizontal, v + p, py), vertical = bandColor(c.vertical, u + p, px);
256
+ return horizontal.map(
257
+ (n, i) => n * c.crossing + vertical[i] * (1 - c.crossing)
258
+ );
259
+ },
260
+ true
261
+ );
262
+ function plaid(options) {
263
+ return plaidRecipe(options);
264
+ }
265
+ const presetColors = Object.freeze({
266
+ background: "#f5e9d3",
267
+ primary: "#304c48",
268
+ accent: "#c56948"
269
+ });
270
+ function preset(sequence) {
271
+ const bands2 = Object.freeze(sequence.map((b) => Object.freeze({ ...b })));
272
+ return Object.freeze({
273
+ colors: presetColors,
274
+ horizontal: bands2,
275
+ vertical: bands2,
276
+ crossing: 0.5
277
+ });
278
+ }
279
+ const plaidPresets = Object.freeze({
280
+ /** Equal-width alternating bands. See {@link plaidPresets}. */
281
+ gingham: preset([
282
+ { width: 1, color: "background" },
283
+ { width: 1, color: "primary" }
284
+ ]),
285
+ /** Symmetric bands with narrow accent lines. See {@link plaidPresets}. */
286
+ tartan: preset([
287
+ { width: 8, color: "primary" },
288
+ { width: 2, color: "background" },
289
+ { width: 1, color: "accent" },
290
+ { width: 2, color: "background" }
291
+ ]),
292
+ /** Narrow crossing lines on a broad background. See {@link plaidPresets}. */
293
+ windowpane: preset([
294
+ { width: 14, color: "background" },
295
+ { width: 1, color: "primary" }
296
+ ])
297
+ });
298
+ export {
299
+ halftone,
300
+ plaid,
301
+ plaidPresets,
302
+ polkaDots,
303
+ truchet
304
+ };
305
+ //# sourceMappingURL=geometric-patterns.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/features/textures/lib/geometric-patterns.ts"],
4
+ "sourcesContent": ["import { defineTexture, type TextureRecipe } from \"@pibbl/core\";\nimport { paletteLut, texturePalettes, validateSeed } from \"./palette.js\";\nimport type { PatternMotionOptions } from \"./patterns.js\";\n\n/** Seamless circular dots with optional stagger and seeded displacement. @see {@link polkaDots} */\nexport interface PolkaDotsOptions extends PatternMotionOptions {\n /** Integer columns, 1\u201364; default 12. See {@link PolkaDotsOptions}. */\n readonly columns?: number;\n /** Even integer rows, 2\u201364; default 12, preserving stagger across the seam. See {@link PolkaDotsOptions}. */\n readonly rows?: number;\n /** Radius in cell fractions, 0\u20130.5; default 0.3. See {@link PolkaDotsOptions}. */\n readonly radius?: number;\n /** Alternate-row horizontal offset in cell fractions, 0\u20131; default 0. See {@link PolkaDotsOptions}. */\n readonly stagger?: number;\n /** Seeded center displacement per axis in cell fractions, 0\u20130.5; default 0. See {@link PolkaDotsOptions}. */\n readonly jitter?: number;\n /** Unsigned 32-bit variation seed; default 42. See {@link PolkaDotsOptions}. */\n readonly seed?: number;\n}\n/** A periodic tonal field expressed as varying dot sizes. @see {@link halftone} */\nexport interface HalftoneOptions extends PatternMotionOptions {\n /** Integer columns, 1\u201364; default 24. See {@link HalftoneOptions}. */\n readonly columns?: number;\n /** Even integer rows, 2\u201364; default 24. See {@link HalftoneOptions}. */\n readonly rows?: number;\n /** Smallest dot radius in cell fractions, 0\u20130.5; default 0.05. See {@link HalftoneOptions}. */\n readonly minRadius?: number;\n /** Largest dot radius in cell fractions, minRadius\u20130.5; default 0.45. See {@link HalftoneOptions}. */\n readonly maxRadius?: number;\n /** Integer horizontal tonal periods, 0\u201316; default 1. See {@link HalftoneOptions}. */\n readonly cyclesX?: number;\n /** Integer vertical tonal periods, 0\u201316; default 1. See {@link HalftoneOptions}. */\n readonly cyclesY?: number;\n /** Tonal wave amplitude, 0\u20131; default 0.7. See {@link HalftoneOptions}. */\n readonly contrast?: number;\n /** Alternate-row offset in cell fractions, 0\u20131; default 0.5. See {@link HalftoneOptions}. */\n readonly stagger?: number;\n}\n/** Seeded connecting quarter-circle tiles. @see {@link truchet} */\nexport interface TruchetOptions extends PatternMotionOptions {\n /** Integer columns, 1\u201364; default 8. See {@link TruchetOptions}. */\n readonly columns?: number;\n /** Integer rows, 1\u201364; default 8. See {@link TruchetOptions}. */\n readonly rows?: number;\n /** Stroke width in cell fractions, 0\u20130.5; default 0.12. See {@link TruchetOptions}. */\n readonly lineWidth?: number;\n /** Fraction of tiles with the first orientation, 0\u20131; default 0.5. See {@link TruchetOptions}. */\n readonly orientationBias?: number;\n /** Unsigned 32-bit orientation seed; default 42. See {@link TruchetOptions}. */\n readonly seed?: number;\n}\n/** One band in an ordered plaid repeat; colors are named keys. @see {@link PlaidOptions} */\nexport interface PlaidBand<Key extends string = string> {\n /** Positive relative width; all widths on an axis are normalized together. See {@link PlaidBand}. */\n readonly width: number;\n /** A key from the plaid's colors dictionary. See {@link PlaidBand}. */\n readonly color: Key;\n}\n/** A plaid's named colors, ordered bands, and crossing balance. @see {@link plaid} */\nexport interface PlaidOptions<\n Colors extends Readonly<Record<string, string>> = Readonly<\n Record<string, string>\n >,\n> extends PatternMotionOptions {\n /** Dictionary of 1\u201316 opaque #RRGGBB colors. See {@link PlaidOptions}. */\n readonly colors: Colors;\n /** Ordered horizontal bands, 1\u201332, referencing existing color keys. See {@link PlaidOptions}. */\n readonly horizontal: readonly PlaidBand<\n NoInfer<Extract<keyof Colors, string>>\n >[];\n /** Ordered vertical bands, 1\u201332, referencing existing color keys. See {@link PlaidOptions}. */\n readonly vertical: readonly PlaidBand<\n NoInfer<Extract<keyof Colors, string>>\n >[];\n /** Horizontal contribution at crossings, 0\u20131; default 0.5. See {@link PlaidOptions}. */\n readonly crossing?: number;\n}\nconst tau = 2 * Math.PI;\nconst wrap = (n: number) => ((n % 1) + 1) % 1;\nfunction bound(\n name: string,\n n: number,\n min: number,\n max: number,\n integer = false,\n) {\n if (\n !Number.isFinite(n) ||\n n < min ||\n n > max ||\n (integer && !Number.isInteger(n))\n )\n throw new RangeError(\n `${name} must be ${integer ? \"an integer\" : \"finite\"} in ${min}\u2013${max}.`,\n );\n return n;\n}\nfunction motion(o: PatternMotionOptions) {\n return {\n phase: wrap(\n bound(\"phase\", o.phase ?? 0, -Number.MAX_VALUE, Number.MAX_VALUE),\n ),\n speed: bound(\"speed\", o.speed ?? 0, 0, 20),\n };\n}\nfunction grid(\n o: { columns?: number; rows?: number },\n defaults: number,\n even = false,\n) {\n const columns = bound(\"columns\", o.columns ?? defaults, 1, 64, true),\n rows = bound(\"rows\", o.rows ?? defaults, even ? 2 : 1, 64, true);\n if (even && rows % 2)\n throw new RangeError(\"rows must be even for seamless stagger.\");\n return { columns, rows };\n}\nfunction hash(\n x: number,\n y: number,\n columns: number,\n rows: number,\n seed: number,\n) {\n const ix = ((x % columns) + columns) % columns,\n iy = ((y % rows) + rows) % rows;\n let h = Math.imul((iy * columns + ix) ^ seed, 0x45d9f3b);\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b);\n return ((h ^ (h >>> 16)) >>> 0) / 0x100000000;\n}\nfunction coverage(distance: number, halfWidth: number, pixel: number) {\n if (halfWidth === 0) return 0;\n const t = Math.max(0, Math.min(1, (halfWidth - distance) / pixel + 0.5));\n return t * t * (3 - 2 * t);\n}\ntype Motion = { phase: number; speed: number };\ntype RGB = readonly [number, number, number];\ninterface State<C> {\n config: C;\n phase: number;\n fresh: boolean;\n dirty: boolean;\n image: ImageData | undefined;\n paletteKey: string;\n lut: Uint8ClampedArray | undefined;\n}\n// Each factory owns a stable definition. Color samplers share only bounded raster\n// storage and the existing Pibbl lifecycle; they never start a separate timer.\nfunction geometry<O, C extends Motion>(\n validate: (o: O) => C,\n sample: (\n c: C,\n u: number,\n v: number,\n phase: number,\n pixelX: number,\n pixelY: number,\n ) => number | RGB,\n named = false,\n) {\n const definition = defineTexture<C, State<C>>({\n create(context, config) {\n if (config.speed) context.requestFrame();\n return {\n config,\n phase: config.phase,\n fresh: true,\n dirty: true,\n image: new ImageData(context.canvas.width, context.canvas.height),\n paletteKey: \"\",\n lut: undefined,\n };\n },\n update(state, config, context) {\n if (JSON.stringify(config) === JSON.stringify(state.config)) return;\n if (config.phase !== state.config.phase) state.phase = config.phase;\n if (config.speed !== state.config.speed) state.fresh = true;\n state.config = config;\n state.dirty = true;\n context.invalidate();\n if (config.speed) context.requestFrame();\n },\n advance(state, frame, context) {\n if (!state.config.speed) return;\n if (!state.fresh && frame.delta > 0) {\n state.phase = wrap(\n state.phase + (frame.delta * state.config.speed) / 1000,\n );\n state.dirty = true;\n context.invalidate();\n }\n state.fresh = false;\n context.requestFrame();\n },\n rasterize(state, context) {\n if (named && context.palette !== undefined)\n throw new TypeError(\n \"plaid uses its named colors dictionary; omit useTexture palette.\",\n );\n const palette = context.palette ?? texturePalettes.porcelain,\n key = palette.join();\n if (!named && key !== state.paletteKey) {\n state.lut = paletteLut(palette);\n state.paletteKey = key;\n state.dirty = true;\n }\n if (!state.dirty) return;\n const { width, height } = context.canvas,\n data = state.image!.data;\n for (let y = 0; y < height; y++)\n for (let x = 0; x < width; x++) {\n const result = sample(\n state.config,\n x === width - 1 ? 0 : x / (width - 1),\n y === height - 1 ? 0 : y / (height - 1),\n state.phase,\n 1 / (width - 1),\n 1 / (height - 1),\n ),\n index = (y * width + x) * 4;\n if (typeof result === \"number\") {\n const at = Math.round(Math.max(0, Math.min(1, result)) * 255) * 4;\n data[index] = state.lut![at];\n data[index + 1] = state.lut![at + 1];\n data[index + 2] = state.lut![at + 2];\n } else {\n data[index] = result[0];\n data[index + 1] = result[1];\n data[index + 2] = result[2];\n }\n data[index + 3] = 255;\n }\n context.canvas.getContext(\"2d\")!.putImageData(state.image!, 0, 0);\n state.dirty = false;\n },\n dispose(state) {\n state.image = undefined;\n state.lut = undefined;\n },\n });\n return (o: O): TextureRecipe => definition(validate(o));\n}\nfunction dots(\n c: {\n columns: number;\n rows: number;\n stagger: number;\n jitter: number;\n seed: number;\n },\n u: number,\n v: number,\n radius: (x: number, y: number) => number,\n px: number,\n py: number,\n) {\n const x = u * c.columns,\n y = v * c.rows,\n pixel = Math.max(px * c.columns, py * c.rows);\n let amount = 0;\n // Neighboring periodic cells include dots displaced across cell/tile boundaries.\n for (let j = Math.floor(y) - 1; j <= Math.floor(y) + 1; j++)\n for (let i = Math.floor(x) - 2; i <= Math.floor(x) + 1; i++) {\n const row = ((j % c.rows) + c.rows) % c.rows;\n const cx =\n i +\n 0.5 +\n (row % 2) * c.stagger +\n (hash(i, j, c.columns, c.rows, c.seed) - 0.5) * 2 * c.jitter;\n const cy =\n j +\n 0.5 +\n (hash(i, j, c.columns, c.rows, c.seed ^ 0x19ae) - 0.5) * 2 * c.jitter;\n amount = Math.max(\n amount,\n coverage(Math.hypot(x - cx, y - cy), radius(i, j), pixel),\n );\n }\n return amount;\n}\nconst dotRecipe = geometry(\n (o: PolkaDotsOptions) => ({\n ...motion(o),\n ...grid(o, 12, true),\n radius: bound(\"radius\", o.radius ?? 0.3, 0, 0.5),\n stagger: bound(\"stagger\", o.stagger ?? 0, 0, 1),\n jitter: bound(\"jitter\", o.jitter ?? 0, 0, 0.5),\n seed: validateSeed(o.seed ?? 42),\n }),\n (c, u, v, p, px, py) => dots(c, wrap(u + p), v, () => c.radius, px, py),\n);\n/**\n * Creates a seamless dot lattice using palette endpoints.\n * @param options - Dot geometry and motion.\n * @returns A mountable texture recipe.\n * @see {@link PolkaDotsOptions}\n */\nexport function polkaDots(options: PolkaDotsOptions = {}): TextureRecipe {\n return dotRecipe(options);\n}\nconst halftoneRecipe = geometry(\n (o: HalftoneOptions) => {\n const minRadius = bound(\"minRadius\", o.minRadius ?? 0.05, 0, 0.5),\n maxRadius = bound(\"maxRadius\", o.maxRadius ?? 0.45, minRadius, 0.5);\n return {\n ...motion(o),\n ...grid(o, 24, true),\n minRadius,\n maxRadius,\n cyclesX: bound(\"cyclesX\", o.cyclesX ?? 1, 0, 16, true),\n cyclesY: bound(\"cyclesY\", o.cyclesY ?? 1, 0, 16, true),\n contrast: bound(\"contrast\", o.contrast ?? 0.7, 0, 1),\n stagger: bound(\"stagger\", o.stagger ?? 0.5, 0, 1),\n jitter: 0,\n seed: 42,\n };\n },\n (c, u, v, p, px, py) =>\n dots(\n c,\n u,\n v,\n (x, y) => {\n const tone =\n 0.5 +\n 0.25 *\n c.contrast *\n (Math.sin(tau * (((x + 0.5) / c.columns) * c.cyclesX + p)) +\n Math.sin(tau * (((y + 0.5) / c.rows) * c.cyclesY + p)));\n return c.minRadius + (c.maxRadius - c.minRadius) * tone;\n },\n px,\n py,\n ),\n);\n/**\n * Creates seamless varying-size dots from a periodic tonal field.\n * @param options - Dot sizes, tonal periods, and motion.\n * @returns A mountable texture recipe.\n * @see {@link HalftoneOptions}\n */\nexport function halftone(options: HalftoneOptions = {}): TextureRecipe {\n return halftoneRecipe(options);\n}\nconst truchetRecipe = geometry(\n (o: TruchetOptions) => ({\n ...motion(o),\n ...grid(o, 8),\n lineWidth: bound(\"lineWidth\", o.lineWidth ?? 0.12, 0, 0.5),\n orientationBias: bound(\"orientationBias\", o.orientationBias ?? 0.5, 0, 1),\n seed: validateSeed(o.seed ?? 42),\n }),\n (c, u, v, p, px, py) => {\n const x = wrap(u + p) * c.columns,\n y = wrap(v + p) * c.rows,\n ix = Math.floor(x),\n iy = Math.floor(y),\n a = x - ix,\n b = y - iy;\n const first = hash(ix, iy, c.columns, c.rows, c.seed) < c.orientationBias;\n const distance = first\n ? Math.min(\n Math.abs(Math.hypot(a, b) - 0.5),\n Math.abs(Math.hypot(1 - a, 1 - b) - 0.5),\n )\n : Math.min(\n Math.abs(Math.hypot(1 - a, b) - 0.5),\n Math.abs(Math.hypot(a, 1 - b) - 0.5),\n );\n return coverage(\n distance,\n c.lineWidth / 2,\n Math.max(px * c.columns, py * c.rows),\n );\n },\n);\n/**\n * Creates seeded quarter-circle tiles that connect across every edge.\n * @param options - Tile counts, stroke width, seed, and motion.\n * @returns A mountable texture recipe.\n * @see {@link TruchetOptions}\n */\nexport function truchet(options: TruchetOptions = {}): TextureRecipe {\n return truchetRecipe(options);\n}\ninterface Band {\n end: number;\n color: RGB;\n}\nfunction bands(\n input: readonly PlaidBand[],\n colors: Readonly<Record<string, RGB>>,\n): Band[] {\n if (!Array.isArray(input) || input.length < 1 || input.length > 32)\n throw new RangeError(\"Plaid requires 1\u201332 bands per axis.\");\n const total = input.reduce(\n (n, b) => n + bound(\"band width\", b.width, Number.MIN_VALUE, 1e6),\n 0,\n );\n let end = 0;\n return input.map((b) => {\n if (!Object.hasOwn(colors, b.color))\n throw new TypeError(`Unknown plaid color key: ${b.color}`);\n end += b.width / total;\n return { end, color: colors[b.color] };\n });\n}\n// Integrate a box footprint across periodic band boundaries, giving crisp interiors\n// and gradual coverage at edges at any raster resolution.\nfunction bandColor(\n bands: readonly Band[],\n position: number,\n footprint: number,\n): RGB {\n const center = wrap(position),\n lo = center - footprint / 2,\n hi = center + footprint / 2,\n result = [0, 0, 0];\n for (let shift = -1; shift <= 1; shift++) {\n let start = shift;\n for (const band of bands) {\n const end = shift + band.end,\n weight =\n Math.max(0, Math.min(hi, end) - Math.max(lo, start)) / footprint;\n for (let k = 0; k < 3; k++) result[k] += band.color[k] * weight;\n start = end;\n }\n }\n return result as [number, number, number];\n}\nconst plaidRecipe = geometry(\n (\n o: PatternMotionOptions & {\n colors: Readonly<Record<string, string>>;\n horizontal: readonly PlaidBand[];\n vertical: readonly PlaidBand[];\n crossing?: number;\n },\n ) => {\n const entries = Object.entries(o.colors);\n if (entries.length < 1 || entries.length > 16)\n throw new RangeError(\"Plaid colors requires 1\u201316 named entries.\");\n const colors: Record<string, RGB> = Object.create(null);\n for (const [key, value] of entries) {\n if (!key || !/^#[\\da-f]{6}$/i.test(value))\n throw new TypeError(\"Plaid colors require named #RRGGBB entries.\");\n colors[key] = [\n parseInt(value.slice(1, 3), 16),\n parseInt(value.slice(3, 5), 16),\n parseInt(value.slice(5, 7), 16),\n ];\n }\n return {\n ...motion(o),\n horizontal: bands(o.horizontal, colors),\n vertical: bands(o.vertical, colors),\n crossing: bound(\"crossing\", o.crossing ?? 0.5, 0, 1),\n };\n },\n (c, u, v, p, px, py) => {\n const horizontal = bandColor(c.horizontal, v + p, py),\n vertical = bandColor(c.vertical, u + p, px);\n return horizontal.map(\n (n, i) => n * c.crossing + vertical[i] * (1 - c.crossing),\n ) as [number, number, number];\n },\n true,\n);\n/**\n * Creates plaid using checked color keys and ordered relative-width bands.\n * @param options - Named colors, bands, crossing balance, and motion.\n * @returns A mountable texture recipe.\n * @see {@link PlaidOptions}\n */\nexport function plaid<const Colors extends Readonly<Record<string, string>>>(\n options: PlaidOptions<Colors>,\n): TextureRecipe {\n return plaidRecipe(options);\n}\nconst presetColors = Object.freeze({\n background: \"#f5e9d3\",\n primary: \"#304c48\",\n accent: \"#c56948\",\n});\nfunction preset(sequence: readonly PlaidBand<keyof typeof presetColors>[]) {\n const bands = Object.freeze(sequence.map((b) => Object.freeze({ ...b })));\n return Object.freeze({\n colors: presetColors,\n horizontal: bands,\n vertical: bands,\n crossing: 0.5,\n });\n}\n/** Named-color band configurations for gingham, tartan, and windowpane patterns. @see {@link plaid} */\nexport const plaidPresets = Object.freeze({\n /** Equal-width alternating bands. See {@link plaidPresets}. */\n gingham: preset([\n { width: 1, color: \"background\" },\n { width: 1, color: \"primary\" },\n ]),\n /** Symmetric bands with narrow accent lines. See {@link plaidPresets}. */\n tartan: preset([\n { width: 8, color: \"primary\" },\n { width: 2, color: \"background\" },\n { width: 1, color: \"accent\" },\n { width: 2, color: \"background\" },\n ]),\n /** Narrow crossing lines on a broad background. See {@link plaidPresets}. */\n windowpane: preset([\n { width: 14, color: \"background\" },\n { width: 1, color: \"primary\" },\n ]),\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["bands"]
7
+ }
@@ -0,0 +1,55 @@
1
+ /** Curated immutable Gray–Scott feed/kill pairs. Appearance also depends on seed and elapsed steps. @see {@link ReactionDiffusionOptions} */
2
+ export declare const grayScottPresets: Readonly<{
3
+ /** Existing isolated spots. See {@link grayScottPresets}. */
4
+ spots: Readonly<{
5
+ feed: 0.0367;
6
+ kill: 0.0649;
7
+ }>;
8
+ /** Existing connected stripes. See {@link grayScottPresets}. */
9
+ stripes: Readonly<{
10
+ feed: 0.029;
11
+ kill: 0.057;
12
+ }>;
13
+ /** Branching coral-like fronts. See {@link grayScottPresets}. */
14
+ coral: Readonly<{
15
+ feed: 0.0545;
16
+ kill: 0.062;
17
+ }>;
18
+ /** Elongated worm-like structures. See {@link grayScottPresets}. */
19
+ worms: Readonly<{
20
+ feed: 0.078;
21
+ kill: 0.061;
22
+ }>;
23
+ /** Dense connected labyrinths. See {@link grayScottPresets}. */
24
+ labyrinths: Readonly<{
25
+ feed: 0.037;
26
+ kill: 0.06;
27
+ }>;
28
+ /** Growing and dividing spots in suitable seeded conditions. See {@link grayScottPresets}. */
29
+ mitosis: Readonly<{
30
+ feed: 0.028;
31
+ kill: 0.062;
32
+ }>;
33
+ }>;
34
+ /** Named configurations of the same Gray–Scott solver and message contract. @see {@link grayScottPresets} */
35
+ export type ReactionDiffusionPreset = keyof typeof grayScottPresets;
36
+ /** Seed, chemistry, and initialization controls for Gray–Scott textures. @see {@link grayScottPresets} */
37
+ export interface ReactionDiffusionOptions {
38
+ /** Unsigned 32-bit initialization seed; default 42. See {@link ReactionDiffusionOptions}. */
39
+ readonly seed?: number;
40
+ /** Curated feed/kill configuration; default spots. See {@link ReactionDiffusionPreset}. */
41
+ readonly preset?: ReactionDiffusionPreset;
42
+ /** Feed-rate override, finite 0–0.1. Changes reset the field. See {@link ReactionDiffusionOptions}. */
43
+ readonly feed?: number;
44
+ /** Kill-rate override, finite 0–0.1. Changes reset the field. See {@link ReactionDiffusionOptions}. */
45
+ readonly kill?: number;
46
+ /** Initial numerical steps, integer 0–4096; default 0. Runs once per initialization. See {@link ReactionDiffusionOptions}. */
47
+ readonly warmupSteps?: number;
48
+ }
49
+ export declare function grayScottConfig(options: ReactionDiffusionOptions): {
50
+ seed: number;
51
+ preset: "coral" | "labyrinths" | "mitosis" | "spots" | "stripes" | "worms";
52
+ feed: number;
53
+ kill: number;
54
+ warmupSteps: number;
55
+ };
@@ -0,0 +1,39 @@
1
+ import { validateSeed } from "./palette.js";
2
+ const grayScottPresets = Object.freeze({
3
+ /** Existing isolated spots. See {@link grayScottPresets}. */
4
+ spots: Object.freeze({ feed: 0.0367, kill: 0.0649 }),
5
+ /** Existing connected stripes. See {@link grayScottPresets}. */
6
+ stripes: Object.freeze({ feed: 0.029, kill: 0.057 }),
7
+ /** Branching coral-like fronts. See {@link grayScottPresets}. */
8
+ coral: Object.freeze({ feed: 0.0545, kill: 0.062 }),
9
+ /** Elongated worm-like structures. See {@link grayScottPresets}. */
10
+ worms: Object.freeze({ feed: 0.078, kill: 0.061 }),
11
+ /** Dense connected labyrinths. See {@link grayScottPresets}. */
12
+ labyrinths: Object.freeze({ feed: 0.037, kill: 0.06 }),
13
+ /** Growing and dividing spots in suitable seeded conditions. See {@link grayScottPresets}. */
14
+ mitosis: Object.freeze({ feed: 0.028, kill: 0.062 })
15
+ });
16
+ function grayScottConfig(options) {
17
+ const preset = options.preset ?? "spots";
18
+ if (!Object.hasOwn(grayScottPresets, preset))
19
+ throw new TypeError("Unknown reaction-diffusion preset.");
20
+ const feed = options.feed ?? grayScottPresets[preset].feed;
21
+ const kill = options.kill ?? grayScottPresets[preset].kill;
22
+ if (![feed, kill].every(
23
+ (value) => Number.isFinite(value) && value >= 0 && value <= 0.1
24
+ ))
25
+ throw new RangeError(
26
+ "Gray\u2013Scott feed and kill must be finite values in [0, 0.1]."
27
+ );
28
+ const warmupSteps = options.warmupSteps ?? 0;
29
+ if (!Number.isInteger(warmupSteps) || warmupSteps < 0 || warmupSteps > 4096)
30
+ throw new RangeError(
31
+ "Gray\u2013Scott warmupSteps must be an integer in [0, 4096]."
32
+ );
33
+ return { seed: validateSeed(options.seed), preset, feed, kill, warmupSteps };
34
+ }
35
+ export {
36
+ grayScottConfig,
37
+ grayScottPresets
38
+ };
39
+ //# sourceMappingURL=gray-scott.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/features/textures/lib/gray-scott.ts"],
4
+ "sourcesContent": ["import { validateSeed } from \"./palette.js\";\n/** Curated immutable Gray\u2013Scott feed/kill pairs. Appearance also depends on seed and elapsed steps. @see {@link ReactionDiffusionOptions} */\nexport const grayScottPresets = Object.freeze({\n /** Existing isolated spots. See {@link grayScottPresets}. */\n spots: Object.freeze({ feed: 0.0367, kill: 0.0649 }),\n /** Existing connected stripes. See {@link grayScottPresets}. */\n stripes: Object.freeze({ feed: 0.029, kill: 0.057 }),\n /** Branching coral-like fronts. See {@link grayScottPresets}. */\n coral: Object.freeze({ feed: 0.0545, kill: 0.062 }),\n /** Elongated worm-like structures. See {@link grayScottPresets}. */\n worms: Object.freeze({ feed: 0.078, kill: 0.061 }),\n /** Dense connected labyrinths. See {@link grayScottPresets}. */\n labyrinths: Object.freeze({ feed: 0.037, kill: 0.06 }),\n /** Growing and dividing spots in suitable seeded conditions. See {@link grayScottPresets}. */\n mitosis: Object.freeze({ feed: 0.028, kill: 0.062 }),\n});\n/** Named configurations of the same Gray\u2013Scott solver and message contract. @see {@link grayScottPresets} */\nexport type ReactionDiffusionPreset = keyof typeof grayScottPresets;\n/** Seed, chemistry, and initialization controls for Gray\u2013Scott textures. @see {@link grayScottPresets} */\nexport interface ReactionDiffusionOptions {\n /** Unsigned 32-bit initialization seed; default 42. See {@link ReactionDiffusionOptions}. */\n readonly seed?: number;\n /** Curated feed/kill configuration; default spots. See {@link ReactionDiffusionPreset}. */\n readonly preset?: ReactionDiffusionPreset;\n /** Feed-rate override, finite 0\u20130.1. Changes reset the field. See {@link ReactionDiffusionOptions}. */\n readonly feed?: number;\n /** Kill-rate override, finite 0\u20130.1. Changes reset the field. See {@link ReactionDiffusionOptions}. */\n readonly kill?: number;\n /** Initial numerical steps, integer 0\u20134096; default 0. Runs once per initialization. See {@link ReactionDiffusionOptions}. */\n readonly warmupSteps?: number;\n}\nexport function grayScottConfig(options: ReactionDiffusionOptions) {\n const preset = options.preset ?? \"spots\";\n if (!Object.hasOwn(grayScottPresets, preset))\n throw new TypeError(\"Unknown reaction-diffusion preset.\");\n const feed = options.feed ?? grayScottPresets[preset].feed;\n const kill = options.kill ?? grayScottPresets[preset].kill;\n if (\n ![feed, kill].every(\n (value) => Number.isFinite(value) && value >= 0 && value <= 0.1,\n )\n )\n throw new RangeError(\n \"Gray\u2013Scott feed and kill must be finite values in [0, 0.1].\",\n );\n const warmupSteps = options.warmupSteps ?? 0;\n if (!Number.isInteger(warmupSteps) || warmupSteps < 0 || warmupSteps > 4096)\n throw new RangeError(\n \"Gray\u2013Scott warmupSteps must be an integer in [0, 4096].\",\n );\n return { seed: validateSeed(options.seed), preset, feed, kill, warmupSteps };\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAEtB,MAAM,mBAAmB,OAAO,OAAO;AAAA;AAAA,EAE5C,OAAO,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA;AAAA,EAEnD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA;AAAA,EAEnD,OAAO,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA;AAAA,EAElD,OAAO,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA;AAAA,EAEjD,YAAY,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,KAAK,CAAC;AAAA;AAAA,EAErD,SAAS,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC;AACrD,CAAC;AAgBM,SAAS,gBAAgB,SAAmC;AACjE,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,CAAC,OAAO,OAAO,kBAAkB,MAAM;AACzC,UAAM,IAAI,UAAU,oCAAoC;AAC1D,QAAM,OAAO,QAAQ,QAAQ,iBAAiB,MAAM,EAAE;AACtD,QAAM,OAAO,QAAQ,QAAQ,iBAAiB,MAAM,EAAE;AACtD,MACE,CAAC,CAAC,MAAM,IAAI,EAAE;AAAA,IACZ,CAAC,UAAU,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS;AAAA,EAC9D;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,cAAc,QAAQ,eAAe;AAC3C,MAAI,CAAC,OAAO,UAAU,WAAW,KAAK,cAAc,KAAK,cAAc;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,EAAE,MAAM,aAAa,QAAQ,IAAI,GAAG,QAAQ,MAAM,MAAM,YAAY;AAC7E;",
6
+ "names": []
7
+ }