interactive-bg 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -2
  3. package/dist/core/canvas2d-renderer.cjs +119 -0
  4. package/dist/core/canvas2d-renderer.cjs.map +1 -0
  5. package/dist/core/canvas2d-renderer.d.cts +7 -0
  6. package/dist/core/canvas2d-renderer.d.ts +7 -0
  7. package/dist/core/canvas2d-renderer.js +119 -0
  8. package/dist/core/canvas2d-renderer.js.map +1 -0
  9. package/dist/core/color.cjs +46 -0
  10. package/dist/core/color.cjs.map +1 -0
  11. package/dist/core/color.d.cts +6 -0
  12. package/dist/core/color.d.ts +6 -0
  13. package/dist/core/color.js +46 -0
  14. package/dist/core/color.js.map +1 -0
  15. package/dist/core/engine.cjs +367 -0
  16. package/dist/core/engine.cjs.map +1 -0
  17. package/dist/core/engine.d.cts +69 -0
  18. package/dist/core/engine.d.ts +69 -0
  19. package/dist/core/engine.js +366 -0
  20. package/dist/core/engine.js.map +1 -0
  21. package/dist/core/style.cjs +21 -0
  22. package/dist/core/style.cjs.map +1 -0
  23. package/dist/core/style.d.cts +85 -0
  24. package/dist/core/style.d.ts +85 -0
  25. package/dist/core/style.js +21 -0
  26. package/dist/core/style.js.map +1 -0
  27. package/dist/core/surface.cjs +25 -0
  28. package/dist/core/surface.cjs.map +1 -0
  29. package/dist/core/surface.d.cts +42 -0
  30. package/dist/core/surface.d.ts +42 -0
  31. package/dist/core/surface.js +24 -0
  32. package/dist/core/surface.js.map +1 -0
  33. package/dist/core/webgl-renderer.cjs +137 -0
  34. package/dist/core/webgl-renderer.cjs.map +1 -0
  35. package/dist/core/webgl-renderer.d.cts +8 -0
  36. package/dist/core/webgl-renderer.d.ts +8 -0
  37. package/dist/core/webgl-renderer.js +137 -0
  38. package/dist/core/webgl-renderer.js.map +1 -0
  39. package/dist/core/webgl.cjs +62 -0
  40. package/dist/core/webgl.cjs.map +1 -0
  41. package/dist/core/webgl.d.cts +15 -0
  42. package/dist/core/webgl.d.ts +15 -0
  43. package/dist/core/webgl.js +60 -0
  44. package/dist/core/webgl.js.map +1 -0
  45. package/dist/dots/canvas2d.cjs +14 -0
  46. package/dist/dots/canvas2d.cjs.map +1 -0
  47. package/dist/dots/canvas2d.d.cts +5 -0
  48. package/dist/dots/canvas2d.d.ts +5 -0
  49. package/dist/dots/canvas2d.js +13 -0
  50. package/dist/dots/canvas2d.js.map +1 -0
  51. package/dist/dots/index.cjs +16 -0
  52. package/dist/dots/index.cjs.map +1 -0
  53. package/dist/dots/index.d.cts +5 -0
  54. package/dist/dots/index.d.ts +5 -0
  55. package/dist/dots/index.js +15 -0
  56. package/dist/dots/index.js.map +1 -0
  57. package/dist/dots/webgl.cjs +14 -0
  58. package/dist/dots/webgl.cjs.map +1 -0
  59. package/dist/dots/webgl.d.cts +5 -0
  60. package/dist/dots/webgl.d.ts +5 -0
  61. package/dist/dots/webgl.js +13 -0
  62. package/dist/dots/webgl.js.map +1 -0
  63. package/dist/index.cjs +24 -0
  64. package/dist/index.d.cts +18 -0
  65. package/dist/index.d.ts +18 -0
  66. package/dist/index.js +11 -0
  67. package/dist/index.umd.js +211 -0
  68. package/dist/index.umd.js.map +1 -0
  69. package/dist/plus/canvas2d.cjs +14 -0
  70. package/dist/plus/canvas2d.cjs.map +1 -0
  71. package/dist/plus/canvas2d.d.cts +5 -0
  72. package/dist/plus/canvas2d.d.ts +5 -0
  73. package/dist/plus/canvas2d.js +13 -0
  74. package/dist/plus/canvas2d.js.map +1 -0
  75. package/dist/plus/index.cjs +16 -0
  76. package/dist/plus/index.cjs.map +1 -0
  77. package/dist/plus/index.d.cts +5 -0
  78. package/dist/plus/index.d.ts +5 -0
  79. package/dist/plus/index.js +15 -0
  80. package/dist/plus/index.js.map +1 -0
  81. package/dist/plus/webgl.cjs +14 -0
  82. package/dist/plus/webgl.cjs.map +1 -0
  83. package/dist/plus/webgl.d.cts +5 -0
  84. package/dist/plus/webgl.d.ts +5 -0
  85. package/dist/plus/webgl.js +13 -0
  86. package/dist/plus/webgl.js.map +1 -0
  87. package/dist/shared/buffer.cjs +20 -0
  88. package/dist/shared/buffer.cjs.map +1 -0
  89. package/dist/shared/buffer.d.cts +11 -0
  90. package/dist/shared/buffer.d.ts +11 -0
  91. package/dist/shared/buffer.js +19 -0
  92. package/dist/shared/buffer.js.map +1 -0
  93. package/dist/shared/grid-webgl.cjs +63 -0
  94. package/dist/shared/grid-webgl.cjs.map +1 -0
  95. package/dist/shared/grid-webgl.d.cts +10 -0
  96. package/dist/shared/grid-webgl.d.ts +10 -0
  97. package/dist/shared/grid-webgl.js +61 -0
  98. package/dist/shared/grid-webgl.js.map +1 -0
  99. package/dist/shared/grid.cjs +133 -0
  100. package/dist/shared/grid.cjs.map +1 -0
  101. package/dist/shared/grid.d.cts +72 -0
  102. package/dist/shared/grid.d.ts +72 -0
  103. package/dist/shared/grid.js +123 -0
  104. package/dist/shared/grid.js.map +1 -0
  105. package/dist/shared/noise.cjs +166 -0
  106. package/dist/shared/noise.cjs.map +1 -0
  107. package/dist/shared/noise.d.cts +4 -0
  108. package/dist/shared/noise.d.ts +4 -0
  109. package/dist/shared/noise.js +166 -0
  110. package/dist/shared/noise.js.map +1 -0
  111. package/dist/styles/dots/canvas2d.cjs +99 -0
  112. package/dist/styles/dots/canvas2d.cjs.map +1 -0
  113. package/dist/styles/dots/canvas2d.d.cts +7 -0
  114. package/dist/styles/dots/canvas2d.d.ts +7 -0
  115. package/dist/styles/dots/canvas2d.js +99 -0
  116. package/dist/styles/dots/canvas2d.js.map +1 -0
  117. package/dist/styles/dots/definition.cjs +15 -0
  118. package/dist/styles/dots/definition.cjs.map +1 -0
  119. package/dist/styles/dots/definition.d.cts +7 -0
  120. package/dist/styles/dots/definition.d.ts +7 -0
  121. package/dist/styles/dots/definition.js +16 -0
  122. package/dist/styles/dots/definition.js.map +1 -0
  123. package/dist/styles/dots/motion.cjs +6 -0
  124. package/dist/styles/dots/motion.cjs.map +1 -0
  125. package/dist/styles/dots/motion.d.cts +2 -0
  126. package/dist/styles/dots/motion.d.ts +2 -0
  127. package/dist/styles/dots/motion.js +6 -0
  128. package/dist/styles/dots/motion.js.map +1 -0
  129. package/dist/styles/dots/options.cjs +33 -0
  130. package/dist/styles/dots/options.cjs.map +1 -0
  131. package/dist/styles/dots/options.d.cts +33 -0
  132. package/dist/styles/dots/options.d.ts +33 -0
  133. package/dist/styles/dots/options.js +32 -0
  134. package/dist/styles/dots/options.js.map +1 -0
  135. package/dist/styles/dots/webgl.cjs +113 -0
  136. package/dist/styles/dots/webgl.cjs.map +1 -0
  137. package/dist/styles/dots/webgl.d.cts +4 -0
  138. package/dist/styles/dots/webgl.d.ts +4 -0
  139. package/dist/styles/dots/webgl.js +113 -0
  140. package/dist/styles/dots/webgl.js.map +1 -0
  141. package/dist/styles/plus/canvas2d.cjs +88 -0
  142. package/dist/styles/plus/canvas2d.cjs.map +1 -0
  143. package/dist/styles/plus/canvas2d.d.cts +8 -0
  144. package/dist/styles/plus/canvas2d.d.ts +8 -0
  145. package/dist/styles/plus/canvas2d.js +88 -0
  146. package/dist/styles/plus/canvas2d.js.map +1 -0
  147. package/dist/styles/plus/definition.cjs +17 -0
  148. package/dist/styles/plus/definition.cjs.map +1 -0
  149. package/dist/styles/plus/definition.d.cts +9 -0
  150. package/dist/styles/plus/definition.d.ts +9 -0
  151. package/dist/styles/plus/definition.js +18 -0
  152. package/dist/styles/plus/definition.js.map +1 -0
  153. package/dist/styles/plus/motion.cjs +18 -0
  154. package/dist/styles/plus/motion.cjs.map +1 -0
  155. package/dist/styles/plus/motion.d.cts +5 -0
  156. package/dist/styles/plus/motion.d.ts +5 -0
  157. package/dist/styles/plus/motion.js +18 -0
  158. package/dist/styles/plus/motion.js.map +1 -0
  159. package/dist/styles/plus/options.cjs +45 -0
  160. package/dist/styles/plus/options.cjs.map +1 -0
  161. package/dist/styles/plus/options.d.cts +45 -0
  162. package/dist/styles/plus/options.d.ts +45 -0
  163. package/dist/styles/plus/options.js +43 -0
  164. package/dist/styles/plus/options.js.map +1 -0
  165. package/dist/styles/plus/turns.cjs +102 -0
  166. package/dist/styles/plus/turns.cjs.map +1 -0
  167. package/dist/styles/plus/turns.d.cts +17 -0
  168. package/dist/styles/plus/turns.d.ts +17 -0
  169. package/dist/styles/plus/turns.js +102 -0
  170. package/dist/styles/plus/turns.js.map +1 -0
  171. package/dist/styles/plus/webgl.cjs +121 -0
  172. package/dist/styles/plus/webgl.cjs.map +1 -0
  173. package/dist/styles/plus/webgl.d.cts +8 -0
  174. package/dist/styles/plus/webgl.d.ts +8 -0
  175. package/dist/styles/plus/webgl.js +121 -0
  176. package/dist/styles/plus/webgl.js.map +1 -0
  177. package/dist/styles/topo/canvas2d.cjs +77 -0
  178. package/dist/styles/topo/canvas2d.cjs.map +1 -0
  179. package/dist/styles/topo/canvas2d.d.cts +4 -0
  180. package/dist/styles/topo/canvas2d.d.ts +4 -0
  181. package/dist/styles/topo/canvas2d.js +77 -0
  182. package/dist/styles/topo/canvas2d.js.map +1 -0
  183. package/dist/styles/topo/contours.cjs +83 -0
  184. package/dist/styles/topo/contours.cjs.map +1 -0
  185. package/dist/styles/topo/contours.d.cts +9 -0
  186. package/dist/styles/topo/contours.d.ts +9 -0
  187. package/dist/styles/topo/contours.js +83 -0
  188. package/dist/styles/topo/contours.js.map +1 -0
  189. package/dist/styles/topo/definition.cjs +13 -0
  190. package/dist/styles/topo/definition.cjs.map +1 -0
  191. package/dist/styles/topo/definition.d.cts +7 -0
  192. package/dist/styles/topo/definition.d.ts +7 -0
  193. package/dist/styles/topo/definition.js +14 -0
  194. package/dist/styles/topo/definition.js.map +1 -0
  195. package/dist/styles/topo/field.cjs +118 -0
  196. package/dist/styles/topo/field.cjs.map +1 -0
  197. package/dist/styles/topo/field.d.cts +26 -0
  198. package/dist/styles/topo/field.d.ts +26 -0
  199. package/dist/styles/topo/field.js +118 -0
  200. package/dist/styles/topo/field.js.map +1 -0
  201. package/dist/styles/topo/options.cjs +39 -0
  202. package/dist/styles/topo/options.cjs.map +1 -0
  203. package/dist/styles/topo/options.d.cts +52 -0
  204. package/dist/styles/topo/options.d.ts +52 -0
  205. package/dist/styles/topo/options.js +38 -0
  206. package/dist/styles/topo/options.js.map +1 -0
  207. package/dist/styles/topo/terrain.cjs +22 -0
  208. package/dist/styles/topo/terrain.cjs.map +1 -0
  209. package/dist/styles/topo/terrain.d.cts +11 -0
  210. package/dist/styles/topo/terrain.d.ts +11 -0
  211. package/dist/styles/topo/terrain.js +22 -0
  212. package/dist/styles/topo/terrain.js.map +1 -0
  213. package/dist/styles/topo/webgl.cjs +150 -0
  214. package/dist/styles/topo/webgl.cjs.map +1 -0
  215. package/dist/styles/topo/webgl.d.cts +7 -0
  216. package/dist/styles/topo/webgl.d.ts +7 -0
  217. package/dist/styles/topo/webgl.js +150 -0
  218. package/dist/styles/topo/webgl.js.map +1 -0
  219. package/dist/topo/canvas2d.cjs +14 -0
  220. package/dist/topo/canvas2d.cjs.map +1 -0
  221. package/dist/topo/canvas2d.d.cts +5 -0
  222. package/dist/topo/canvas2d.d.ts +5 -0
  223. package/dist/topo/canvas2d.js +13 -0
  224. package/dist/topo/canvas2d.js.map +1 -0
  225. package/dist/topo/index.cjs +16 -0
  226. package/dist/topo/index.cjs.map +1 -0
  227. package/dist/topo/index.d.cts +5 -0
  228. package/dist/topo/index.d.ts +5 -0
  229. package/dist/topo/index.js +15 -0
  230. package/dist/topo/index.js.map +1 -0
  231. package/dist/topo/webgl.cjs +14 -0
  232. package/dist/topo/webgl.cjs.map +1 -0
  233. package/dist/topo/webgl.d.cts +5 -0
  234. package/dist/topo/webgl.d.ts +5 -0
  235. package/dist/topo/webgl.js +13 -0
  236. package/dist/topo/webgl.js.map +1 -0
  237. package/package.json +192 -4
@@ -0,0 +1,16 @@
1
+ import { wanderIdleFps } from "../../shared/grid.js";
2
+ import { dotsDefaults } from "./options.js";
3
+ // src/styles/dots/definition.ts
4
+ /**
5
+ * A grid of dots that wander gently around their places. The pointer pushes
6
+ * nearby dots away, more the closer they are, and clicks send out a wave.
7
+ */
8
+ var dotsStyle = {
9
+ name: "dots",
10
+ defaults: dotsDefaults,
11
+ animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,
12
+ idleFps: wanderIdleFps
13
+ };
14
+ export { dotsStyle };
15
+
16
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","names":[],"sources":["../../../src/styles/dots/definition.ts"],"sourcesContent":["import type { StyleBase } from '../../core/style';\nimport { wanderIdleFps } from '../../shared/grid';\nimport { dotsDefaults, type DotsOptions } from './options';\n\n/**\n * A grid of dots that wander gently around their places. The pointer pushes\n * nearby dots away, more the closer they are, and clicks send out a wave.\n */\nexport const dotsStyle: StyleBase<DotsOptions> = {\n name: 'dots',\n defaults: dotsDefaults,\n animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,\n // The wander is slow and sub-pixel, so it rarely needs the engine's full idle frame rate.\n idleFps: wanderIdleFps,\n};\n"],"mappings":";;;;;;;AAQA,IAAa,YAAoC;CAC/C,MAAM;CACN,UAAU;CACV,WAAW,YAAY,QAAQ,SAAS,KAAK,QAAQ,cAAc;CAEnE,SAAS;AACX"}
@@ -0,0 +1,6 @@
1
+ // src/styles/dots/motion.ts
2
+ /** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */
3
+ var WAVE_GROW = .6;
4
+ exports.WAVE_GROW = WAVE_GROW;
5
+
6
+ //# sourceMappingURL=motion.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.cjs","names":[],"sources":["../../../src/styles/dots/motion.ts"],"sourcesContent":["// The dots-specific part of the motion model; the rest is shared with other\n// grid styles in shared/grid.ts.\n\n/** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */\nexport const WAVE_GROW = 0.6;\n"],"mappings":";;AAIA,IAAa,YAAY"}
@@ -0,0 +1,2 @@
1
+ /** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */
2
+ export declare const WAVE_GROW = 0.6;
@@ -0,0 +1,2 @@
1
+ /** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */
2
+ export declare const WAVE_GROW = 0.6;
@@ -0,0 +1,6 @@
1
+ // src/styles/dots/motion.ts
2
+ /** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */
3
+ var WAVE_GROW = .6;
4
+ export { WAVE_GROW };
5
+
6
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","names":[],"sources":["../../../src/styles/dots/motion.ts"],"sourcesContent":["// The dots-specific part of the motion model; the rest is shared with other\n// grid styles in shared/grid.ts.\n\n/** Size boost of a dot riding the crest of a wave (1 + WAVE_GROW × ring). */\nexport const WAVE_GROW = 0.6;\n"],"mappings":";;AAIA,IAAa,YAAY"}
@@ -0,0 +1,33 @@
1
+ // src/styles/dots/options.ts
2
+ var dotsDefaults = Object.freeze({
3
+ color: "#8b95a5",
4
+ opacity: .6,
5
+ size: 1.6,
6
+ spacing: 26,
7
+ jitter: 1.2,
8
+ jitterSpeed: .35,
9
+ pointerRadius: 160,
10
+ pointerStrength: 22,
11
+ waveSpeed: 520,
12
+ waveStrength: 10,
13
+ waveWidth: 60,
14
+ waveDuration: 1.8
15
+ });
16
+ function resolveDotsOptions(options) {
17
+ return {
18
+ ...options,
19
+ opacity: Math.min(1, Math.max(0, options.opacity)),
20
+ size: Math.max(.1, options.size),
21
+ spacing: Math.max(4, options.spacing),
22
+ jitter: Math.max(0, options.jitter),
23
+ jitterSpeed: Math.max(0, options.jitterSpeed),
24
+ pointerRadius: Math.max(1, options.pointerRadius),
25
+ waveSpeed: Math.max(1, options.waveSpeed),
26
+ waveWidth: Math.max(1, options.waveWidth),
27
+ waveDuration: Math.max(.05, options.waveDuration)
28
+ };
29
+ }
30
+ exports.dotsDefaults = dotsDefaults;
31
+ exports.resolveDotsOptions = resolveDotsOptions;
32
+
33
+ //# sourceMappingURL=options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.cjs","names":[],"sources":["../../../src/styles/dots/options.ts"],"sourcesContent":["export interface DotsOptions {\n /** Dot colour. Any CSS colour. */\n color: string;\n /** Opacity of the dots, from `0` to `1`. Multiplies any alpha in the colour. */\n opacity: number;\n /** Dot radius in CSS pixels. */\n size: number;\n /**\n * Distance between neighbouring dots in CSS pixels. The grid also keeps at least half of\n * this as empty space along every edge, so dots at the edges aren't clipped.\n */\n spacing: number;\n /** How far each dot wanders around its place, in CSS pixels. `0` = still. */\n jitter: number;\n /** How fast the dots wander, in cycles per second. `0` = still. */\n jitterSpeed: number;\n /** Radius around the pointer within which dots are pushed away, in CSS pixels. */\n pointerRadius: number;\n /** How far the dots right next to the pointer are pushed, in CSS pixels. Negative values pull them in. */\n pointerStrength: number;\n /** How fast a click wave travels outwards, in CSS pixels per second. */\n waveSpeed: number;\n /** How far a click wave pushes dots, in CSS pixels. `0` disables waves. */\n waveStrength: number;\n /** Width of a click wave's ring, in CSS pixels. */\n waveWidth: number;\n /** How long a click wave lasts before it has faded out, in seconds. */\n waveDuration: number;\n}\n\nexport const dotsDefaults: Readonly<DotsOptions> = Object.freeze({\n color: '#8b95a5',\n opacity: 0.6,\n size: 1.6,\n spacing: 26,\n jitter: 1.2,\n jitterSpeed: 0.35,\n pointerRadius: 160,\n pointerStrength: 22,\n waveSpeed: 520,\n waveStrength: 10,\n waveWidth: 60,\n waveDuration: 1.8,\n});\n\n/** Options after clamping: what the renderers consume. */\nexport type ResolvedDotsOptions = DotsOptions;\n\nexport function resolveDotsOptions(options: DotsOptions): ResolvedDotsOptions {\n return {\n ...options,\n opacity: Math.min(1, Math.max(0, options.opacity)),\n size: Math.max(0.1, options.size),\n spacing: Math.max(4, options.spacing),\n jitter: Math.max(0, options.jitter),\n jitterSpeed: Math.max(0, options.jitterSpeed),\n pointerRadius: Math.max(1, options.pointerRadius),\n waveSpeed: Math.max(1, options.waveSpeed),\n waveWidth: Math.max(1, options.waveWidth),\n waveDuration: Math.max(0.05, options.waveDuration),\n };\n}\n"],"mappings":";AA8BA,IAAa,eAAsC,OAAO,OAAO;CAC/D,OAAO;CACP,SAAS;CACT,MAAM;CACN,SAAS;CACT,QAAQ;CACR,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,WAAW;CACX,cAAc;CACd,WAAW;CACX,cAAc;AAChB,CAAC;AAKD,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO;EACL,GAAG;EACH,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,OAAO,CAAC;EACjD,MAAM,KAAK,IAAI,IAAK,QAAQ,IAAI;EAChC,SAAS,KAAK,IAAI,GAAG,QAAQ,OAAO;EACpC,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;EAClC,aAAa,KAAK,IAAI,GAAG,QAAQ,WAAW;EAC5C,eAAe,KAAK,IAAI,GAAG,QAAQ,aAAa;EAChD,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,cAAc,KAAK,IAAI,KAAM,QAAQ,YAAY;CACnD;AACF"}
@@ -0,0 +1,33 @@
1
+ export interface DotsOptions {
2
+ /** Dot colour. Any CSS colour. */
3
+ color: string;
4
+ /** Opacity of the dots, from `0` to `1`. Multiplies any alpha in the colour. */
5
+ opacity: number;
6
+ /** Dot radius in CSS pixels. */
7
+ size: number;
8
+ /**
9
+ * Distance between neighbouring dots in CSS pixels. The grid also keeps at least half of
10
+ * this as empty space along every edge, so dots at the edges aren't clipped.
11
+ */
12
+ spacing: number;
13
+ /** How far each dot wanders around its place, in CSS pixels. `0` = still. */
14
+ jitter: number;
15
+ /** How fast the dots wander, in cycles per second. `0` = still. */
16
+ jitterSpeed: number;
17
+ /** Radius around the pointer within which dots are pushed away, in CSS pixels. */
18
+ pointerRadius: number;
19
+ /** How far the dots right next to the pointer are pushed, in CSS pixels. Negative values pull them in. */
20
+ pointerStrength: number;
21
+ /** How fast a click wave travels outwards, in CSS pixels per second. */
22
+ waveSpeed: number;
23
+ /** How far a click wave pushes dots, in CSS pixels. `0` disables waves. */
24
+ waveStrength: number;
25
+ /** Width of a click wave's ring, in CSS pixels. */
26
+ waveWidth: number;
27
+ /** How long a click wave lasts before it has faded out, in seconds. */
28
+ waveDuration: number;
29
+ }
30
+ export declare const dotsDefaults: Readonly<DotsOptions>;
31
+ /** Options after clamping: what the renderers consume. */
32
+ export type ResolvedDotsOptions = DotsOptions;
33
+ export declare function resolveDotsOptions(options: DotsOptions): ResolvedDotsOptions;
@@ -0,0 +1,33 @@
1
+ export interface DotsOptions {
2
+ /** Dot colour. Any CSS colour. */
3
+ color: string;
4
+ /** Opacity of the dots, from `0` to `1`. Multiplies any alpha in the colour. */
5
+ opacity: number;
6
+ /** Dot radius in CSS pixels. */
7
+ size: number;
8
+ /**
9
+ * Distance between neighbouring dots in CSS pixels. The grid also keeps at least half of
10
+ * this as empty space along every edge, so dots at the edges aren't clipped.
11
+ */
12
+ spacing: number;
13
+ /** How far each dot wanders around its place, in CSS pixels. `0` = still. */
14
+ jitter: number;
15
+ /** How fast the dots wander, in cycles per second. `0` = still. */
16
+ jitterSpeed: number;
17
+ /** Radius around the pointer within which dots are pushed away, in CSS pixels. */
18
+ pointerRadius: number;
19
+ /** How far the dots right next to the pointer are pushed, in CSS pixels. Negative values pull them in. */
20
+ pointerStrength: number;
21
+ /** How fast a click wave travels outwards, in CSS pixels per second. */
22
+ waveSpeed: number;
23
+ /** How far a click wave pushes dots, in CSS pixels. `0` disables waves. */
24
+ waveStrength: number;
25
+ /** Width of a click wave's ring, in CSS pixels. */
26
+ waveWidth: number;
27
+ /** How long a click wave lasts before it has faded out, in seconds. */
28
+ waveDuration: number;
29
+ }
30
+ export declare const dotsDefaults: Readonly<DotsOptions>;
31
+ /** Options after clamping: what the renderers consume. */
32
+ export type ResolvedDotsOptions = DotsOptions;
33
+ export declare function resolveDotsOptions(options: DotsOptions): ResolvedDotsOptions;
@@ -0,0 +1,32 @@
1
+ // src/styles/dots/options.ts
2
+ var dotsDefaults = Object.freeze({
3
+ color: "#8b95a5",
4
+ opacity: .6,
5
+ size: 1.6,
6
+ spacing: 26,
7
+ jitter: 1.2,
8
+ jitterSpeed: .35,
9
+ pointerRadius: 160,
10
+ pointerStrength: 22,
11
+ waveSpeed: 520,
12
+ waveStrength: 10,
13
+ waveWidth: 60,
14
+ waveDuration: 1.8
15
+ });
16
+ function resolveDotsOptions(options) {
17
+ return {
18
+ ...options,
19
+ opacity: Math.min(1, Math.max(0, options.opacity)),
20
+ size: Math.max(.1, options.size),
21
+ spacing: Math.max(4, options.spacing),
22
+ jitter: Math.max(0, options.jitter),
23
+ jitterSpeed: Math.max(0, options.jitterSpeed),
24
+ pointerRadius: Math.max(1, options.pointerRadius),
25
+ waveSpeed: Math.max(1, options.waveSpeed),
26
+ waveWidth: Math.max(1, options.waveWidth),
27
+ waveDuration: Math.max(.05, options.waveDuration)
28
+ };
29
+ }
30
+ export { dotsDefaults, resolveDotsOptions };
31
+
32
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../src/styles/dots/options.ts"],"sourcesContent":["export interface DotsOptions {\n /** Dot colour. Any CSS colour. */\n color: string;\n /** Opacity of the dots, from `0` to `1`. Multiplies any alpha in the colour. */\n opacity: number;\n /** Dot radius in CSS pixels. */\n size: number;\n /**\n * Distance between neighbouring dots in CSS pixels. The grid also keeps at least half of\n * this as empty space along every edge, so dots at the edges aren't clipped.\n */\n spacing: number;\n /** How far each dot wanders around its place, in CSS pixels. `0` = still. */\n jitter: number;\n /** How fast the dots wander, in cycles per second. `0` = still. */\n jitterSpeed: number;\n /** Radius around the pointer within which dots are pushed away, in CSS pixels. */\n pointerRadius: number;\n /** How far the dots right next to the pointer are pushed, in CSS pixels. Negative values pull them in. */\n pointerStrength: number;\n /** How fast a click wave travels outwards, in CSS pixels per second. */\n waveSpeed: number;\n /** How far a click wave pushes dots, in CSS pixels. `0` disables waves. */\n waveStrength: number;\n /** Width of a click wave's ring, in CSS pixels. */\n waveWidth: number;\n /** How long a click wave lasts before it has faded out, in seconds. */\n waveDuration: number;\n}\n\nexport const dotsDefaults: Readonly<DotsOptions> = Object.freeze({\n color: '#8b95a5',\n opacity: 0.6,\n size: 1.6,\n spacing: 26,\n jitter: 1.2,\n jitterSpeed: 0.35,\n pointerRadius: 160,\n pointerStrength: 22,\n waveSpeed: 520,\n waveStrength: 10,\n waveWidth: 60,\n waveDuration: 1.8,\n});\n\n/** Options after clamping: what the renderers consume. */\nexport type ResolvedDotsOptions = DotsOptions;\n\nexport function resolveDotsOptions(options: DotsOptions): ResolvedDotsOptions {\n return {\n ...options,\n opacity: Math.min(1, Math.max(0, options.opacity)),\n size: Math.max(0.1, options.size),\n spacing: Math.max(4, options.spacing),\n jitter: Math.max(0, options.jitter),\n jitterSpeed: Math.max(0, options.jitterSpeed),\n pointerRadius: Math.max(1, options.pointerRadius),\n waveSpeed: Math.max(1, options.waveSpeed),\n waveWidth: Math.max(1, options.waveWidth),\n waveDuration: Math.max(0.05, options.waveDuration),\n };\n}\n"],"mappings":";AA8BA,IAAa,eAAsC,OAAO,OAAO;CAC/D,OAAO;CACP,SAAS;CACT,MAAM;CACN,SAAS;CACT,QAAQ;CACR,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,WAAW;CACX,cAAc;CACd,WAAW;CACX,cAAc;AAChB,CAAC;AAKD,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO;EACL,GAAG;EACH,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,OAAO,CAAC;EACjD,MAAM,KAAK,IAAI,IAAK,QAAQ,IAAI;EAChC,SAAS,KAAK,IAAI,GAAG,QAAQ,OAAO;EACpC,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;EAClC,aAAa,KAAK,IAAI,GAAG,QAAQ,WAAW;EAC5C,eAAe,KAAK,IAAI,GAAG,QAAQ,aAAa;EAChD,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,cAAc,KAAK,IAAI,KAAM,QAAQ,YAAY;CACnD;AACF"}
@@ -0,0 +1,113 @@
1
+ const require_color = require("../../core/color.cjs");
2
+ const require_webgl = require("../../core/webgl.cjs");
3
+ const require_grid = require("../../shared/grid.cjs");
4
+ const require_motion = require("./motion.cjs");
5
+ const require_options = require("./options.cjs");
6
+ const require_grid_webgl = require("../../shared/grid-webgl.cjs");
7
+ // src/styles/dots/webgl.ts
8
+ var VERTEX = `#version 300 es
9
+ precision highp float;
10
+
11
+ ${require_grid_webgl.GRID_VERTEX_GLSL}
12
+ uniform float uSize; // dot radius, CSS px
13
+ uniform vec3 uPointer; // x, y, push distance (strength × influence)
14
+ uniform float uPointerRadius;
15
+ uniform vec4 uWaves[8]; // x, y, ring radius, envelope (0 = inactive)
16
+ uniform float uWaveStrength;
17
+ uniform float uWaveWidth;
18
+
19
+ out float vRadius; // device px
20
+ out float vPointSize; // device px
21
+
22
+ void main() {
23
+ vec2 ij = markCell();
24
+ vec2 rest = restPosition(ij);
25
+ vec2 p = rest + wander(ij);
26
+
27
+ vec2 d = rest - uPointer.xy;
28
+ float dist = length(d);
29
+ if (dist > 0.0 && dist < uPointerRadius) {
30
+ float k = 1.0 - dist / uPointerRadius;
31
+ p += d / dist * uPointer.z * k * k;
32
+ }
33
+
34
+ float grow = 0.0;
35
+ for (int w = 0; w < 8; w++) {
36
+ vec4 wave = uWaves[w];
37
+ if (wave.w <= 0.0) continue;
38
+ vec2 dw = rest - wave.xy;
39
+ float dd = length(dw);
40
+ if (dd == 0.0) continue;
41
+ float x = (dd - wave.z) / uWaveWidth;
42
+ float ring = exp(-x * x) * wave.w;
43
+ p += dw / dd * uWaveStrength * ring;
44
+ grow += ring;
45
+ }
46
+
47
+ vRadius = uSize * (1.0 + ${require_motion.WAVE_GROW.toFixed(3)} * grow) * uDpr;
48
+ vPointSize = 2.0 * vRadius + 2.0; // room for the antialiased edge
49
+ gl_PointSize = vPointSize;
50
+ gl_Position = toClip(p);
51
+ }`;
52
+ var FRAGMENT = `#version 300 es
53
+ precision highp float;
54
+
55
+ uniform vec4 uColor; // straight RGBA, opacity applied
56
+ in float vRadius;
57
+ in float vPointSize;
58
+ out vec4 outColor;
59
+
60
+ void main() {
61
+ float dist = length(gl_PointCoord - 0.5) * vPointSize;
62
+ float a = uColor.a * clamp(vRadius + 0.5 - dist, 0.0, 1.0);
63
+ outColor = vec4(uColor.rgb * a, a); // premultiplied; the engine blends it over the background
64
+ }`;
65
+ var UNIFORMS = [
66
+ ...require_grid_webgl.GRID_UNIFORMS,
67
+ "uSize",
68
+ "uPointer",
69
+ "uPointerRadius",
70
+ "uWaves",
71
+ "uWaveStrength",
72
+ "uWaveWidth",
73
+ "uColor"
74
+ ];
75
+ /** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */
76
+ function createDotsWebGL(gl, initial) {
77
+ let options = require_options.resolveDotsOptions(initial);
78
+ const waves = require_grid.createWaveList();
79
+ const waveData = /* @__PURE__ */ new Float32Array(32);
80
+ let clock = 0;
81
+ const program = require_webgl.createProgram(gl, VERTEX, FRAGMENT);
82
+ const uniforms = program ? require_webgl.getUniforms(gl, program, UNIFORMS) : null;
83
+ return {
84
+ update(next) {
85
+ options = require_options.resolveDotsOptions(next);
86
+ },
87
+ render(frame) {
88
+ if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * require_grid.TAU;
89
+ waves.advance(frame, options.waveDuration, options.waveStrength !== 0);
90
+ if (!program || !uniforms) return waves.waves.length > 0;
91
+ waves.pack(waveData, options.waveSpeed, options.waveDuration);
92
+ const grid = require_grid.gridLayout(frame.width, frame.height, options.spacing);
93
+ const color = require_color.parseColor(options.color);
94
+ gl.useProgram(program);
95
+ require_grid_webgl.setGridUniforms(gl, uniforms, grid, frame, options.spacing, clock, options.jitter);
96
+ gl.uniform1f(uniforms.uSize, options.size);
97
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);
98
+ gl.uniform1f(uniforms.uPointerRadius, options.pointerRadius);
99
+ gl.uniform4fv(uniforms.uWaves, waveData);
100
+ gl.uniform1f(uniforms.uWaveStrength, options.waveStrength);
101
+ gl.uniform1f(uniforms.uWaveWidth, options.waveWidth);
102
+ gl.uniform4f(uniforms.uColor, color[0], color[1], color[2], color[3] * options.opacity);
103
+ gl.drawArrays(gl.POINTS, 0, grid.cols * grid.rows);
104
+ return waves.waves.length > 0;
105
+ },
106
+ destroy() {
107
+ gl.deleteProgram(program);
108
+ }
109
+ };
110
+ }
111
+ exports.createDotsWebGL = createDotsWebGL;
112
+
113
+ //# sourceMappingURL=webgl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.cjs","names":["GRID_VERTEX_GLSL","WAVE_GROW","GRID_UNIFORMS","resolveDotsOptions","createWaveList","createProgram","getUniforms","TAU","gridLayout","parseColor"],"sources":["../../../src/styles/dots/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { StyleRenderer } from '../../core/style';\nimport { createProgram, getUniforms } from '../../core/webgl';\nimport { createWaveList, gridLayout, MAX_WAVES, TAU } from '../../shared/grid';\nimport { GRID_UNIFORMS, GRID_VERTEX_GLSL, setGridUniforms } from '../../shared/grid-webgl';\nimport { WAVE_GROW } from './motion';\nimport { resolveDotsOptions, type DotsOptions } from './options';\n\n// Mirrors the motion model in shared/grid.ts: pointerFalloff, waveRing.\nconst VERTEX = `#version 300 es\nprecision highp float;\n\n${GRID_VERTEX_GLSL}\nuniform float uSize; // dot radius, CSS px\nuniform vec3 uPointer; // x, y, push distance (strength × influence)\nuniform float uPointerRadius;\nuniform vec4 uWaves[${MAX_WAVES}]; // x, y, ring radius, envelope (0 = inactive)\nuniform float uWaveStrength;\nuniform float uWaveWidth;\n\nout float vRadius; // device px\nout float vPointSize; // device px\n\nvoid main() {\n vec2 ij = markCell();\n vec2 rest = restPosition(ij);\n vec2 p = rest + wander(ij);\n\n vec2 d = rest - uPointer.xy;\n float dist = length(d);\n if (dist > 0.0 && dist < uPointerRadius) {\n float k = 1.0 - dist / uPointerRadius;\n p += d / dist * uPointer.z * k * k;\n }\n\n float grow = 0.0;\n for (int w = 0; w < ${MAX_WAVES}; w++) {\n vec4 wave = uWaves[w];\n if (wave.w <= 0.0) continue;\n vec2 dw = rest - wave.xy;\n float dd = length(dw);\n if (dd == 0.0) continue;\n float x = (dd - wave.z) / uWaveWidth;\n float ring = exp(-x * x) * wave.w;\n p += dw / dd * uWaveStrength * ring;\n grow += ring;\n }\n\n vRadius = uSize * (1.0 + ${WAVE_GROW.toFixed(3)} * grow) * uDpr;\n vPointSize = 2.0 * vRadius + 2.0; // room for the antialiased edge\n gl_PointSize = vPointSize;\n gl_Position = toClip(p);\n}`;\n\nconst FRAGMENT = `#version 300 es\nprecision highp float;\n\nuniform vec4 uColor; // straight RGBA, opacity applied\nin float vRadius;\nin float vPointSize;\nout vec4 outColor;\n\nvoid main() {\n float dist = length(gl_PointCoord - 0.5) * vPointSize;\n float a = uColor.a * clamp(vRadius + 0.5 - dist, 0.0, 1.0);\n outColor = vec4(uColor.rgb * a, a); // premultiplied; the engine blends it over the background\n}`;\n\nconst UNIFORMS = [\n ...GRID_UNIFORMS, 'uSize', 'uPointer', 'uPointerRadius', 'uWaves', 'uWaveStrength', 'uWaveWidth', 'uColor',\n] as const;\n\n/** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */\nexport function createDotsWebGL(gl: WebGL2RenderingContext, initial: DotsOptions): StyleRenderer<DotsOptions> {\n let options = resolveDotsOptions(initial);\n const waves = createWaveList();\n const waveData = new Float32Array(MAX_WAVES * 4);\n let clock = 0;\n\n const program = createProgram(gl, VERTEX, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n\n return {\n update(next) {\n options = resolveDotsOptions(next);\n },\n render(frame) {\n if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;\n waves.advance(frame, options.waveDuration, options.waveStrength !== 0);\n if (!program || !uniforms) return waves.waves.length > 0; // context lost during setup\n\n waves.pack(waveData, options.waveSpeed, options.waveDuration);\n\n const grid = gridLayout(frame.width, frame.height, options.spacing);\n const color = parseColor(options.color);\n\n gl.useProgram(program);\n setGridUniforms(gl, uniforms, grid, frame, options.spacing, clock, options.jitter);\n gl.uniform1f(uniforms.uSize, options.size);\n gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);\n gl.uniform1f(uniforms.uPointerRadius, options.pointerRadius);\n gl.uniform4fv(uniforms.uWaves, waveData);\n gl.uniform1f(uniforms.uWaveStrength, options.waveStrength);\n gl.uniform1f(uniforms.uWaveWidth, options.waveWidth);\n gl.uniform4f(uniforms.uColor, color[0], color[1], color[2], color[3] * options.opacity);\n gl.drawArrays(gl.POINTS, 0, grid.cols * grid.rows);\n return waves.waves.length > 0;\n },\n destroy() {\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":";;;;;;;AASA,IAAM,SAAS;;;EAGbA,mBAAAA,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAoCUC,eAAAA,UAAU,QAAQ,CAAC,EAAE;;;;;AAMlD,IAAM,WAAW;;;;;;;;;;;;;AAcjB,IAAM,WAAW;CACf,GAAGC,mBAAAA;CAAe;CAAS;CAAY;CAAkB;CAAU;CAAiB;CAAc;AACpG;;AAGA,SAAgB,gBAAgB,IAA4B,SAAkD;CAC5G,IAAI,UAAUC,gBAAAA,mBAAmB,OAAO;CACxC,MAAM,QAAQC,aAAAA,eAAe;CAC7B,MAAM,2BAAW,IAAI,aAAA,EAA0B;CAC/C,IAAI,QAAQ;CAEZ,MAAM,UAAUC,cAAAA,cAAc,IAAI,QAAQ,QAAQ;CAClD,MAAM,WAAW,UAAUC,cAAAA,YAAY,IAAI,SAAS,QAAQ,IAAI;CAEhE,OAAO;EACL,OAAO,MAAM;GACX,UAAUH,gBAAAA,mBAAmB,IAAI;EACnC;EACA,OAAO,OAAO;GACZ,IAAI,CAAC,MAAM,eAAe,SAAS,MAAM,KAAK,QAAQ,cAAcI,aAAAA;GACpE,MAAM,QAAQ,OAAO,QAAQ,cAAc,QAAQ,iBAAiB,CAAC;GACrE,IAAI,CAAC,WAAW,CAAC,UAAU,OAAO,MAAM,MAAM,SAAS;GAEvD,MAAM,KAAK,UAAU,QAAQ,WAAW,QAAQ,YAAY;GAE5D,MAAM,OAAOC,aAAAA,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,OAAO;GAClE,MAAM,QAAQC,cAAAA,WAAW,QAAQ,KAAK;GAEtC,GAAG,WAAW,OAAO;GACrB,mBAAA,gBAAgB,IAAI,UAAU,MAAM,OAAO,QAAQ,SAAS,OAAO,QAAQ,MAAM;GACjF,GAAG,UAAU,SAAS,OAAO,QAAQ,IAAI;GACzC,GAAG,UAAU,SAAS,UAAU,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,QAAQ,kBAAkB,MAAM,QAAQ,SAAS;GACnH,GAAG,UAAU,SAAS,gBAAgB,QAAQ,aAAa;GAC3D,GAAG,WAAW,SAAS,QAAQ,QAAQ;GACvC,GAAG,UAAU,SAAS,eAAe,QAAQ,YAAY;GACzD,GAAG,UAAU,SAAS,YAAY,QAAQ,SAAS;GACnD,GAAG,UAAU,SAAS,QAAQ,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ,OAAO;GACtF,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,OAAO,KAAK,IAAI;GACjD,OAAO,MAAM,MAAM,SAAS;EAC9B;EACA,UAAU;GACR,GAAG,cAAc,OAAO;EAC1B;CACF;AACF"}
@@ -0,0 +1,4 @@
1
+ import type { StyleRenderer } from '../../core/style.cjs';
2
+ import { type DotsOptions } from './options.cjs';
3
+ /** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */
4
+ export declare function createDotsWebGL(gl: WebGL2RenderingContext, initial: DotsOptions): StyleRenderer<DotsOptions>;
@@ -0,0 +1,4 @@
1
+ import type { StyleRenderer } from '../../core/style.js';
2
+ import { type DotsOptions } from './options.js';
3
+ /** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */
4
+ export declare function createDotsWebGL(gl: WebGL2RenderingContext, initial: DotsOptions): StyleRenderer<DotsOptions>;
@@ -0,0 +1,113 @@
1
+ import { parseColor } from "../../core/color.js";
2
+ import { createProgram, getUniforms } from "../../core/webgl.js";
3
+ import { TAU, createWaveList, gridLayout } from "../../shared/grid.js";
4
+ import { WAVE_GROW } from "./motion.js";
5
+ import { resolveDotsOptions } from "./options.js";
6
+ import { GRID_UNIFORMS, GRID_VERTEX_GLSL, setGridUniforms } from "../../shared/grid-webgl.js";
7
+ // src/styles/dots/webgl.ts
8
+ var VERTEX = `#version 300 es
9
+ precision highp float;
10
+
11
+ ${GRID_VERTEX_GLSL}
12
+ uniform float uSize; // dot radius, CSS px
13
+ uniform vec3 uPointer; // x, y, push distance (strength × influence)
14
+ uniform float uPointerRadius;
15
+ uniform vec4 uWaves[8]; // x, y, ring radius, envelope (0 = inactive)
16
+ uniform float uWaveStrength;
17
+ uniform float uWaveWidth;
18
+
19
+ out float vRadius; // device px
20
+ out float vPointSize; // device px
21
+
22
+ void main() {
23
+ vec2 ij = markCell();
24
+ vec2 rest = restPosition(ij);
25
+ vec2 p = rest + wander(ij);
26
+
27
+ vec2 d = rest - uPointer.xy;
28
+ float dist = length(d);
29
+ if (dist > 0.0 && dist < uPointerRadius) {
30
+ float k = 1.0 - dist / uPointerRadius;
31
+ p += d / dist * uPointer.z * k * k;
32
+ }
33
+
34
+ float grow = 0.0;
35
+ for (int w = 0; w < 8; w++) {
36
+ vec4 wave = uWaves[w];
37
+ if (wave.w <= 0.0) continue;
38
+ vec2 dw = rest - wave.xy;
39
+ float dd = length(dw);
40
+ if (dd == 0.0) continue;
41
+ float x = (dd - wave.z) / uWaveWidth;
42
+ float ring = exp(-x * x) * wave.w;
43
+ p += dw / dd * uWaveStrength * ring;
44
+ grow += ring;
45
+ }
46
+
47
+ vRadius = uSize * (1.0 + ${WAVE_GROW.toFixed(3)} * grow) * uDpr;
48
+ vPointSize = 2.0 * vRadius + 2.0; // room for the antialiased edge
49
+ gl_PointSize = vPointSize;
50
+ gl_Position = toClip(p);
51
+ }`;
52
+ var FRAGMENT = `#version 300 es
53
+ precision highp float;
54
+
55
+ uniform vec4 uColor; // straight RGBA, opacity applied
56
+ in float vRadius;
57
+ in float vPointSize;
58
+ out vec4 outColor;
59
+
60
+ void main() {
61
+ float dist = length(gl_PointCoord - 0.5) * vPointSize;
62
+ float a = uColor.a * clamp(vRadius + 0.5 - dist, 0.0, 1.0);
63
+ outColor = vec4(uColor.rgb * a, a); // premultiplied; the engine blends it over the background
64
+ }`;
65
+ var UNIFORMS = [
66
+ ...GRID_UNIFORMS,
67
+ "uSize",
68
+ "uPointer",
69
+ "uPointerRadius",
70
+ "uWaves",
71
+ "uWaveStrength",
72
+ "uWaveWidth",
73
+ "uColor"
74
+ ];
75
+ /** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */
76
+ function createDotsWebGL(gl, initial) {
77
+ let options = resolveDotsOptions(initial);
78
+ const waves = createWaveList();
79
+ const waveData = /* @__PURE__ */ new Float32Array(32);
80
+ let clock = 0;
81
+ const program = createProgram(gl, VERTEX, FRAGMENT);
82
+ const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;
83
+ return {
84
+ update(next) {
85
+ options = resolveDotsOptions(next);
86
+ },
87
+ render(frame) {
88
+ if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;
89
+ waves.advance(frame, options.waveDuration, options.waveStrength !== 0);
90
+ if (!program || !uniforms) return waves.waves.length > 0;
91
+ waves.pack(waveData, options.waveSpeed, options.waveDuration);
92
+ const grid = gridLayout(frame.width, frame.height, options.spacing);
93
+ const color = parseColor(options.color);
94
+ gl.useProgram(program);
95
+ setGridUniforms(gl, uniforms, grid, frame, options.spacing, clock, options.jitter);
96
+ gl.uniform1f(uniforms.uSize, options.size);
97
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);
98
+ gl.uniform1f(uniforms.uPointerRadius, options.pointerRadius);
99
+ gl.uniform4fv(uniforms.uWaves, waveData);
100
+ gl.uniform1f(uniforms.uWaveStrength, options.waveStrength);
101
+ gl.uniform1f(uniforms.uWaveWidth, options.waveWidth);
102
+ gl.uniform4f(uniforms.uColor, color[0], color[1], color[2], color[3] * options.opacity);
103
+ gl.drawArrays(gl.POINTS, 0, grid.cols * grid.rows);
104
+ return waves.waves.length > 0;
105
+ },
106
+ destroy() {
107
+ gl.deleteProgram(program);
108
+ }
109
+ };
110
+ }
111
+ export { createDotsWebGL };
112
+
113
+ //# sourceMappingURL=webgl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.js","names":[],"sources":["../../../src/styles/dots/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { StyleRenderer } from '../../core/style';\nimport { createProgram, getUniforms } from '../../core/webgl';\nimport { createWaveList, gridLayout, MAX_WAVES, TAU } from '../../shared/grid';\nimport { GRID_UNIFORMS, GRID_VERTEX_GLSL, setGridUniforms } from '../../shared/grid-webgl';\nimport { WAVE_GROW } from './motion';\nimport { resolveDotsOptions, type DotsOptions } from './options';\n\n// Mirrors the motion model in shared/grid.ts: pointerFalloff, waveRing.\nconst VERTEX = `#version 300 es\nprecision highp float;\n\n${GRID_VERTEX_GLSL}\nuniform float uSize; // dot radius, CSS px\nuniform vec3 uPointer; // x, y, push distance (strength × influence)\nuniform float uPointerRadius;\nuniform vec4 uWaves[${MAX_WAVES}]; // x, y, ring radius, envelope (0 = inactive)\nuniform float uWaveStrength;\nuniform float uWaveWidth;\n\nout float vRadius; // device px\nout float vPointSize; // device px\n\nvoid main() {\n vec2 ij = markCell();\n vec2 rest = restPosition(ij);\n vec2 p = rest + wander(ij);\n\n vec2 d = rest - uPointer.xy;\n float dist = length(d);\n if (dist > 0.0 && dist < uPointerRadius) {\n float k = 1.0 - dist / uPointerRadius;\n p += d / dist * uPointer.z * k * k;\n }\n\n float grow = 0.0;\n for (int w = 0; w < ${MAX_WAVES}; w++) {\n vec4 wave = uWaves[w];\n if (wave.w <= 0.0) continue;\n vec2 dw = rest - wave.xy;\n float dd = length(dw);\n if (dd == 0.0) continue;\n float x = (dd - wave.z) / uWaveWidth;\n float ring = exp(-x * x) * wave.w;\n p += dw / dd * uWaveStrength * ring;\n grow += ring;\n }\n\n vRadius = uSize * (1.0 + ${WAVE_GROW.toFixed(3)} * grow) * uDpr;\n vPointSize = 2.0 * vRadius + 2.0; // room for the antialiased edge\n gl_PointSize = vPointSize;\n gl_Position = toClip(p);\n}`;\n\nconst FRAGMENT = `#version 300 es\nprecision highp float;\n\nuniform vec4 uColor; // straight RGBA, opacity applied\nin float vRadius;\nin float vPointSize;\nout vec4 outColor;\n\nvoid main() {\n float dist = length(gl_PointCoord - 0.5) * vPointSize;\n float a = uColor.a * clamp(vRadius + 0.5 - dist, 0.0, 1.0);\n outColor = vec4(uColor.rgb * a, a); // premultiplied; the engine blends it over the background\n}`;\n\nconst UNIFORMS = [\n ...GRID_UNIFORMS, 'uSize', 'uPointer', 'uPointerRadius', 'uWaves', 'uWaveStrength', 'uWaveWidth', 'uColor',\n] as const;\n\n/** Every dot is one GL point; the vertex shader places it, so the CPU only sets uniforms. */\nexport function createDotsWebGL(gl: WebGL2RenderingContext, initial: DotsOptions): StyleRenderer<DotsOptions> {\n let options = resolveDotsOptions(initial);\n const waves = createWaveList();\n const waveData = new Float32Array(MAX_WAVES * 4);\n let clock = 0;\n\n const program = createProgram(gl, VERTEX, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n\n return {\n update(next) {\n options = resolveDotsOptions(next);\n },\n render(frame) {\n if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;\n waves.advance(frame, options.waveDuration, options.waveStrength !== 0);\n if (!program || !uniforms) return waves.waves.length > 0; // context lost during setup\n\n waves.pack(waveData, options.waveSpeed, options.waveDuration);\n\n const grid = gridLayout(frame.width, frame.height, options.spacing);\n const color = parseColor(options.color);\n\n gl.useProgram(program);\n setGridUniforms(gl, uniforms, grid, frame, options.spacing, clock, options.jitter);\n gl.uniform1f(uniforms.uSize, options.size);\n gl.uniform3f(uniforms.uPointer, frame.pointer.x, frame.pointer.y, options.pointerStrength * frame.pointer.influence);\n gl.uniform1f(uniforms.uPointerRadius, options.pointerRadius);\n gl.uniform4fv(uniforms.uWaves, waveData);\n gl.uniform1f(uniforms.uWaveStrength, options.waveStrength);\n gl.uniform1f(uniforms.uWaveWidth, options.waveWidth);\n gl.uniform4f(uniforms.uColor, color[0], color[1], color[2], color[3] * options.opacity);\n gl.drawArrays(gl.POINTS, 0, grid.cols * grid.rows);\n return waves.waves.length > 0;\n },\n destroy() {\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":";;;;;;;AASA,IAAM,SAAS;;;EAGb,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAoCU,UAAU,QAAQ,CAAC,EAAE;;;;;AAMlD,IAAM,WAAW;;;;;;;;;;;;;AAcjB,IAAM,WAAW;CACf,GAAG;CAAe;CAAS;CAAY;CAAkB;CAAU;CAAiB;CAAc;AACpG;;AAGA,SAAgB,gBAAgB,IAA4B,SAAkD;CAC5G,IAAI,UAAU,mBAAmB,OAAO;CACxC,MAAM,QAAQ,eAAe;CAC7B,MAAM,2BAAW,IAAI,aAAA,EAA0B;CAC/C,IAAI,QAAQ;CAEZ,MAAM,UAAU,cAAc,IAAI,QAAQ,QAAQ;CAClD,MAAM,WAAW,UAAU,YAAY,IAAI,SAAS,QAAQ,IAAI;CAEhE,OAAO;EACL,OAAO,MAAM;GACX,UAAU,mBAAmB,IAAI;EACnC;EACA,OAAO,OAAO;GACZ,IAAI,CAAC,MAAM,eAAe,SAAS,MAAM,KAAK,QAAQ,cAAc;GACpE,MAAM,QAAQ,OAAO,QAAQ,cAAc,QAAQ,iBAAiB,CAAC;GACrE,IAAI,CAAC,WAAW,CAAC,UAAU,OAAO,MAAM,MAAM,SAAS;GAEvD,MAAM,KAAK,UAAU,QAAQ,WAAW,QAAQ,YAAY;GAE5D,MAAM,OAAO,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,OAAO;GAClE,MAAM,QAAQ,WAAW,QAAQ,KAAK;GAEtC,GAAG,WAAW,OAAO;GACrB,gBAAgB,IAAI,UAAU,MAAM,OAAO,QAAQ,SAAS,OAAO,QAAQ,MAAM;GACjF,GAAG,UAAU,SAAS,OAAO,QAAQ,IAAI;GACzC,GAAG,UAAU,SAAS,UAAU,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,QAAQ,kBAAkB,MAAM,QAAQ,SAAS;GACnH,GAAG,UAAU,SAAS,gBAAgB,QAAQ,aAAa;GAC3D,GAAG,WAAW,SAAS,QAAQ,QAAQ;GACvC,GAAG,UAAU,SAAS,eAAe,QAAQ,YAAY;GACzD,GAAG,UAAU,SAAS,YAAY,QAAQ,SAAS;GACnD,GAAG,UAAU,SAAS,QAAQ,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ,OAAO;GACtF,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,OAAO,KAAK,IAAI;GACjD,OAAO,MAAM,MAAM,SAAS;EAC9B;EACA,UAAU;GACR,GAAG,cAAc,OAAO;EAC1B;CACF;AACF"}
@@ -0,0 +1,88 @@
1
+ const require_buffer = require("../../shared/buffer.cjs");
2
+ const require_grid = require("../../shared/grid.cjs");
3
+ const require_options = require("./options.cjs");
4
+ const require_turns = require("./turns.cjs");
5
+ // src/styles/plus/canvas2d.ts
6
+ /** Signs made heavier by waves are drawn in this many weight steps per unit of ring height. */
7
+ var WEIGHT_STEPS = 8;
8
+ /** Ring heights beyond this are clamped (two overlapping wave crests). */
9
+ var MAX_WEIGHT_STEP = 16;
10
+ /**
11
+ * Every sign's position computed on the CPU, with angles and weights from
12
+ * SignTurns. All signs of one weight are a single path of round-capped lines,
13
+ * stroked once.
14
+ */
15
+ function createPlusCanvas2D(ctx, initial) {
16
+ let options = require_options.resolvePlusOptions(initial);
17
+ const waves = require_grid.createWaveList();
18
+ const phasesFor = require_grid.createPhaseCache();
19
+ const turns = require_turns.createSignTurns();
20
+ let clock = 0;
21
+ const weights = Array.from({ length: 17 }, () => require_buffer.createFloatBuffer(512));
22
+ function add(buffer, x, y, dx, dy) {
23
+ const data = require_buffer.reserve(buffer, 4);
24
+ data[buffer.length++] = x;
25
+ data[buffer.length++] = y;
26
+ data[buffer.length++] = dx;
27
+ data[buffer.length++] = dy;
28
+ }
29
+ function stroke(buffer, weight) {
30
+ const { data, length } = buffer;
31
+ ctx.lineWidth = weight;
32
+ ctx.beginPath();
33
+ for (let k = 0; k < length; k += 4) {
34
+ const x = data[k];
35
+ const y = data[k + 1];
36
+ const dx = data[k + 2];
37
+ const dy = data[k + 3];
38
+ ctx.moveTo(x - dx, y - dy);
39
+ ctx.lineTo(x + dx, y + dy);
40
+ ctx.moveTo(x + dy, y - dx);
41
+ ctx.lineTo(x - dy, y + dx);
42
+ }
43
+ ctx.stroke();
44
+ }
45
+ return {
46
+ update(next) {
47
+ options = require_options.resolvePlusOptions(next);
48
+ },
49
+ render(frame) {
50
+ if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * require_grid.TAU;
51
+ waves.advance(frame, options.waveDuration, require_options.wavesEnabled(options));
52
+ const { spacing, size, jitter } = options;
53
+ const grid = require_grid.gridLayout(frame.width, frame.height, spacing);
54
+ const { cols, rows, originX, originY } = grid;
55
+ const wander = phasesFor(cols, rows);
56
+ const { sx, cx, sy, cy } = require_grid.wanderClock(clock);
57
+ turns.update(frame, options, grid, waves.waves);
58
+ const turn = turns.data;
59
+ for (const buffer of weights) buffer.length = 0;
60
+ for (let j = 0; j < rows; j++) {
61
+ const restY = originY + j * spacing;
62
+ for (let i = 0; i < cols; i++) {
63
+ const k = j * cols + i;
64
+ const w = k * 4;
65
+ const x = originX + i * spacing + jitter * (sx * wander[w] + cx * wander[w + 1]);
66
+ const y = restY + jitter * (cy * wander[w + 2] - sy * wander[w + 3]);
67
+ const angle = turn[k * 2];
68
+ const step = Math.min(MAX_WEIGHT_STEP, Math.round(turn[k * 2 + 1] * WEIGHT_STEPS));
69
+ if (angle === 0) add(weights[step], x, y, size, 0);
70
+ else {
71
+ const a2 = angle * angle;
72
+ const cos = 1 - a2 * (.5 - a2 * (1 / 24 - a2 * (1 / 720 - a2 / 40320)));
73
+ const sin = angle * (1 - a2 * (1 / 6 - a2 * (1 / 120 - a2 / 5040)));
74
+ add(weights[step], x, y, size * cos, size * sin);
75
+ }
76
+ }
77
+ }
78
+ ctx.globalAlpha = options.opacity;
79
+ ctx.strokeStyle = options.color;
80
+ ctx.lineCap = "round";
81
+ for (let step = 0; step <= MAX_WEIGHT_STEP; step++) if (weights[step].length > 0) stroke(weights[step], options.weight * (1 + options.waveWeight * step / WEIGHT_STEPS));
82
+ return waves.waves.length > 0 || turns.settling;
83
+ }
84
+ };
85
+ }
86
+ exports.createPlusCanvas2D = createPlusCanvas2D;
87
+
88
+ //# sourceMappingURL=canvas2d.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas2d.cjs","names":["resolvePlusOptions","createWaveList","createPhaseCache","createSignTurns","createFloatBuffer","reserve","TAU","wavesEnabled","gridLayout","wanderClock"],"sources":["../../../src/styles/plus/canvas2d.ts"],"sourcesContent":["import type { StyleRenderer } from '../../core/style';\nimport { createFloatBuffer, reserve, type FloatBuffer } from '../../shared/buffer';\nimport { createPhaseCache, createWaveList, gridLayout, TAU, wanderClock } from '../../shared/grid';\nimport { resolvePlusOptions, wavesEnabled, type PlusOptions } from './options';\nimport { createSignTurns } from './turns';\n\n/** Signs made heavier by waves are drawn in this many weight steps per unit of ring height. */\nconst WEIGHT_STEPS = 8;\n/** Ring heights beyond this are clamped (two overlapping wave crests). */\nconst MAX_WEIGHT_STEP = 2 * WEIGHT_STEPS;\n\n/**\n * Every sign's position computed on the CPU, with angles and weights from\n * SignTurns. All signs of one weight are a single path of round-capped lines,\n * stroked once.\n */\nexport function createPlusCanvas2D(ctx: CanvasRenderingContext2D, initial: PlusOptions): StyleRenderer<PlusOptions> {\n let options = resolvePlusOptions(initial);\n const waves = createWaveList();\n const phasesFor = createPhaseCache();\n const turns = createSignTurns();\n let clock = 0;\n\n // Signs as x, y, arm vector (dx, dy), one buffer per weight step; signs outside a wave all land in step 0.\n const weights = Array.from({ length: MAX_WEIGHT_STEP + 1 }, () => createFloatBuffer(512));\n\n function add(buffer: FloatBuffer, x: number, y: number, dx: number, dy: number): void {\n const data = reserve(buffer, 4);\n data[buffer.length++] = x;\n data[buffer.length++] = y;\n data[buffer.length++] = dx;\n data[buffer.length++] = dy;\n }\n\n function stroke(buffer: FloatBuffer, weight: number): void {\n const { data, length } = buffer;\n ctx.lineWidth = weight;\n ctx.beginPath();\n for (let k = 0; k < length; k += 4) {\n const x = data[k];\n const y = data[k + 1];\n const dx = data[k + 2];\n const dy = data[k + 3];\n // Two arms: along (dx, dy) and along its perpendicular (-dy, dx).\n ctx.moveTo(x - dx, y - dy);\n ctx.lineTo(x + dx, y + dy);\n ctx.moveTo(x + dy, y - dx);\n ctx.lineTo(x - dy, y + dx);\n }\n ctx.stroke();\n }\n\n return {\n update(next) {\n options = resolvePlusOptions(next);\n },\n render(frame) {\n if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;\n waves.advance(frame, options.waveDuration, wavesEnabled(options));\n\n const { spacing, size, jitter } = options;\n const grid = gridLayout(frame.width, frame.height, spacing);\n const { cols, rows, originX, originY } = grid;\n const wander = phasesFor(cols, rows);\n const { sx, cx, sy, cy } = wanderClock(clock);\n turns.update(frame, options, grid, waves.waves);\n const turn = turns.data;\n for (const buffer of weights) buffer.length = 0;\n\n for (let j = 0; j < rows; j++) {\n const restY = originY + j * spacing;\n for (let i = 0; i < cols; i++) {\n const k = j * cols + i;\n const w = k * 4;\n const x = originX + i * spacing + jitter * (sx * wander[w] + cx * wander[w + 1]);\n const y = restY + jitter * (cy * wander[w + 2] - sy * wander[w + 3]);\n const angle = turn[k * 2];\n const step = Math.min(MAX_WEIGHT_STEP, Math.round(turn[k * 2 + 1] * WEIGHT_STEPS));\n if (angle === 0) {\n add(weights[step], x, y, size, 0);\n } else {\n // Angles stay within ±45°, where these short series are exact to ~1e-6.\n const a2 = angle * angle;\n const cos = 1 - a2 * (0.5 - a2 * (1 / 24 - a2 * (1 / 720 - a2 / 40320)));\n const sin = angle * (1 - a2 * (1 / 6 - a2 * (1 / 120 - a2 / 5040)));\n add(weights[step], x, y, size * cos, size * sin);\n }\n }\n }\n\n ctx.globalAlpha = options.opacity;\n ctx.strokeStyle = options.color;\n ctx.lineCap = 'round';\n for (let step = 0; step <= MAX_WEIGHT_STEP; step++) {\n if (weights[step].length > 0) {\n stroke(weights[step], options.weight * (1 + (options.waveWeight * step) / WEIGHT_STEPS));\n }\n }\n return waves.waves.length > 0 || turns.settling;\n },\n };\n}\n"],"mappings":";;;;;;AAOA,IAAM,eAAe;;AAErB,IAAM,kBAAkB;;;;;;AAOxB,SAAgB,mBAAmB,KAA+B,SAAkD;CAClH,IAAI,UAAUA,gBAAAA,mBAAmB,OAAO;CACxC,MAAM,QAAQC,aAAAA,eAAe;CAC7B,MAAM,YAAYC,aAAAA,iBAAiB;CACnC,MAAM,QAAQC,cAAAA,gBAAgB;CAC9B,IAAI,QAAQ;CAGZ,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,GAAoB,SAASC,eAAAA,kBAAkB,GAAG,CAAC;CAExF,SAAS,IAAI,QAAqB,GAAW,GAAW,IAAY,IAAkB;EACpF,MAAM,OAAOC,eAAAA,QAAQ,QAAQ,CAAC;EAC9B,KAAK,OAAO,YAAY;EACxB,KAAK,OAAO,YAAY;EACxB,KAAK,OAAO,YAAY;EACxB,KAAK,OAAO,YAAY;CAC1B;CAEA,SAAS,OAAO,QAAqB,QAAsB;EACzD,MAAM,EAAE,MAAM,WAAW;EACzB,IAAI,YAAY;EAChB,IAAI,UAAU;EACd,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAClC,MAAM,IAAI,KAAK;GACf,MAAM,IAAI,KAAK,IAAI;GACnB,MAAM,KAAK,KAAK,IAAI;GACpB,MAAM,KAAK,KAAK,IAAI;GAEpB,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE;GACzB,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE;GACzB,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE;GACzB,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE;EAC3B;EACA,IAAI,OAAO;CACb;CAEA,OAAO;EACL,OAAO,MAAM;GACX,UAAUL,gBAAAA,mBAAmB,IAAI;EACnC;EACA,OAAO,OAAO;GACZ,IAAI,CAAC,MAAM,eAAe,SAAS,MAAM,KAAK,QAAQ,cAAcM,aAAAA;GACpE,MAAM,QAAQ,OAAO,QAAQ,cAAcC,gBAAAA,aAAa,OAAO,CAAC;GAEhE,MAAM,EAAE,SAAS,MAAM,WAAW;GAClC,MAAM,OAAOC,aAAAA,WAAW,MAAM,OAAO,MAAM,QAAQ,OAAO;GAC1D,MAAM,EAAE,MAAM,MAAM,SAAS,YAAY;GACzC,MAAM,SAAS,UAAU,MAAM,IAAI;GACnC,MAAM,EAAE,IAAI,IAAI,IAAI,OAAOC,aAAAA,YAAY,KAAK;GAC5C,MAAM,OAAO,OAAO,SAAS,MAAM,MAAM,KAAK;GAC9C,MAAM,OAAO,MAAM;GACnB,KAAK,MAAM,UAAU,SAAS,OAAO,SAAS;GAE9C,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK;IAC7B,MAAM,QAAQ,UAAU,IAAI;IAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK;KAC7B,MAAM,IAAI,IAAI,OAAO;KACrB,MAAM,IAAI,IAAI;KACd,MAAM,IAAI,UAAU,IAAI,UAAU,UAAU,KAAK,OAAO,KAAK,KAAK,OAAO,IAAI;KAC7E,MAAM,IAAI,QAAQ,UAAU,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI;KACjE,MAAM,QAAQ,KAAK,IAAI;KACvB,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC;KACjF,IAAI,UAAU,GACZ,IAAI,QAAQ,OAAO,GAAG,GAAG,MAAM,CAAC;UAC3B;MAEL,MAAM,KAAK,QAAQ;MACnB,MAAM,MAAM,IAAI,MAAM,KAAM,MAAM,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK;MAChE,MAAM,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,MAAM,KAAK;MAC5D,IAAI,QAAQ,OAAO,GAAG,GAAG,OAAO,KAAK,OAAO,GAAG;KACjD;IACF;GACF;GAEA,IAAI,cAAc,QAAQ;GAC1B,IAAI,cAAc,QAAQ;GAC1B,IAAI,UAAU;GACd,KAAK,IAAI,OAAO,GAAG,QAAQ,iBAAiB,QAC1C,IAAI,QAAQ,KAAK,CAAC,SAAS,GACzB,OAAO,QAAQ,OAAO,QAAQ,UAAU,IAAK,QAAQ,aAAa,OAAQ,aAAa;GAG3F,OAAO,MAAM,MAAM,SAAS,KAAK,MAAM;EACzC;CACF;AACF"}
@@ -0,0 +1,8 @@
1
+ import type { StyleRenderer } from '../../core/style.cjs';
2
+ import { type PlusOptions } from './options.cjs';
3
+ /**
4
+ * Every sign's position computed on the CPU, with angles and weights from
5
+ * SignTurns. All signs of one weight are a single path of round-capped lines,
6
+ * stroked once.
7
+ */
8
+ export declare function createPlusCanvas2D(ctx: CanvasRenderingContext2D, initial: PlusOptions): StyleRenderer<PlusOptions>;
@@ -0,0 +1,8 @@
1
+ import type { StyleRenderer } from '../../core/style.js';
2
+ import { type PlusOptions } from './options.js';
3
+ /**
4
+ * Every sign's position computed on the CPU, with angles and weights from
5
+ * SignTurns. All signs of one weight are a single path of round-capped lines,
6
+ * stroked once.
7
+ */
8
+ export declare function createPlusCanvas2D(ctx: CanvasRenderingContext2D, initial: PlusOptions): StyleRenderer<PlusOptions>;