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,88 @@
1
+ import { createFloatBuffer, reserve } from "../../shared/buffer.js";
2
+ import { TAU, createPhaseCache, createWaveList, gridLayout, wanderClock } from "../../shared/grid.js";
3
+ import { resolvePlusOptions, wavesEnabled } from "./options.js";
4
+ import { createSignTurns } from "./turns.js";
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 = resolvePlusOptions(initial);
17
+ const waves = createWaveList();
18
+ const phasesFor = createPhaseCache();
19
+ const turns = createSignTurns();
20
+ let clock = 0;
21
+ const weights = Array.from({ length: 17 }, () => createFloatBuffer(512));
22
+ function add(buffer, x, y, dx, dy) {
23
+ const data = 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 = resolvePlusOptions(next);
48
+ },
49
+ render(frame) {
50
+ if (!frame.reducedMotion) clock += frame.dt * options.jitterSpeed * TAU;
51
+ waves.advance(frame, options.waveDuration, wavesEnabled(options));
52
+ const { spacing, size, jitter } = options;
53
+ const 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 } = 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
+ export { createPlusCanvas2D };
87
+
88
+ //# sourceMappingURL=canvas2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas2d.js","names":[],"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":"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"}
@@ -0,0 +1,17 @@
1
+ const require_grid = require("../../shared/grid.cjs");
2
+ // src/styles/plus/definition.ts
3
+ /**
4
+ * A grid of "+" signs that wander gently around their places. While the
5
+ * pointer is over the background, every sign turns smoothly so an arm points
6
+ * at it. Clicks send out a wave that turns the signs on its crest to face the
7
+ * click and makes them heavier as it passes.
8
+ */
9
+ var plusStyle = {
10
+ name: "plus",
11
+ defaults: require("./options.cjs").plusDefaults,
12
+ animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,
13
+ idleFps: require_grid.wanderIdleFps
14
+ };
15
+ exports.plusStyle = plusStyle;
16
+
17
+ //# sourceMappingURL=definition.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.cjs","names":["plusDefaults","wanderIdleFps"],"sources":["../../../src/styles/plus/definition.ts"],"sourcesContent":["import type { StyleBase } from '../../core/style';\nimport { wanderIdleFps } from '../../shared/grid';\nimport { plusDefaults, type PlusOptions } from './options';\n\n/**\n * A grid of \"+\" signs that wander gently around their places. While the\n * pointer is over the background, every sign turns smoothly so an arm points\n * at it. Clicks send out a wave that turns the signs on its crest to face the\n * click and makes them heavier as it passes.\n */\nexport const plusStyle: StyleBase<PlusOptions> = {\n name: 'plus',\n defaults: plusDefaults,\n animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,\n // Same slow, sub-pixel wander as dots: it rarely needs the engine's full idle frame rate.\n idleFps: wanderIdleFps,\n};\n"],"mappings":";;;;;;;;AAUA,IAAa,YAAoC;CAC/C,MAAM;CACN,U,uBAAUA,CAAAA,CAAAA;CACV,WAAW,YAAY,QAAQ,SAAS,KAAK,QAAQ,cAAc;CAEnE,SAASC,aAAAA;AACX"}
@@ -0,0 +1,9 @@
1
+ import type { StyleBase } from '../../core/style.cjs';
2
+ import { type PlusOptions } from './options.cjs';
3
+ /**
4
+ * A grid of "+" signs that wander gently around their places. While the
5
+ * pointer is over the background, every sign turns smoothly so an arm points
6
+ * at it. Clicks send out a wave that turns the signs on its crest to face the
7
+ * click and makes them heavier as it passes.
8
+ */
9
+ export declare const plusStyle: StyleBase<PlusOptions>;
@@ -0,0 +1,9 @@
1
+ import type { StyleBase } from '../../core/style.js';
2
+ import { type PlusOptions } from './options.js';
3
+ /**
4
+ * A grid of "+" signs that wander gently around their places. While the
5
+ * pointer is over the background, every sign turns smoothly so an arm points
6
+ * at it. Clicks send out a wave that turns the signs on its crest to face the
7
+ * click and makes them heavier as it passes.
8
+ */
9
+ export declare const plusStyle: StyleBase<PlusOptions>;
@@ -0,0 +1,18 @@
1
+ import { wanderIdleFps } from "../../shared/grid.js";
2
+ import { plusDefaults } from "./options.js";
3
+ // src/styles/plus/definition.ts
4
+ /**
5
+ * A grid of "+" signs that wander gently around their places. While the
6
+ * pointer is over the background, every sign turns smoothly so an arm points
7
+ * at it. Clicks send out a wave that turns the signs on its crest to face the
8
+ * click and makes them heavier as it passes.
9
+ */
10
+ var plusStyle = {
11
+ name: "plus",
12
+ defaults: plusDefaults,
13
+ animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,
14
+ idleFps: wanderIdleFps
15
+ };
16
+ export { plusStyle };
17
+
18
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","names":[],"sources":["../../../src/styles/plus/definition.ts"],"sourcesContent":["import type { StyleBase } from '../../core/style';\nimport { wanderIdleFps } from '../../shared/grid';\nimport { plusDefaults, type PlusOptions } from './options';\n\n/**\n * A grid of \"+\" signs that wander gently around their places. While the\n * pointer is over the background, every sign turns smoothly so an arm points\n * at it. Clicks send out a wave that turns the signs on its crest to face the\n * click and makes them heavier as it passes.\n */\nexport const plusStyle: StyleBase<PlusOptions> = {\n name: 'plus',\n defaults: plusDefaults,\n animates: (options) => options.jitter > 0 && options.jitterSpeed > 0,\n // Same slow, sub-pixel wander as dots: it rarely needs the engine's full idle frame rate.\n idleFps: wanderIdleFps,\n};\n"],"mappings":";;;;;;;;;AAUA,IAAa,YAAoC;CAC/C,MAAM;CACN,UAAU;CACV,WAAW,YAAY,QAAQ,SAAS,KAAK,QAAQ,cAAc;CAEnE,SAAS;AACX"}
@@ -0,0 +1,18 @@
1
+ // src/styles/plus/motion.ts
2
+ /** atan(r) for r in [-1, 1], within 1e-5 rad: much cheaper than Math.atan2. */
3
+ function atanUnit(r) {
4
+ const r2 = r * r;
5
+ return r * (.99997726 + r2 * (-.33262347 + r2 * (.19354346 + r2 * (-.11643287 + r2 * (.05265332 - .0117212 * r2)))));
6
+ }
7
+ /**
8
+ * The smallest turn that points one of a sign's arms along (dx, dy). A "+"
9
+ * looks the same every 90°, so this is always within ±45°.
10
+ */
11
+ function facingAngle(dx, dy) {
12
+ const ax = Math.abs(dx);
13
+ if (ax >= Math.abs(dy)) return ax === 0 ? 0 : atanUnit(dy / dx);
14
+ return -atanUnit(dx / dy);
15
+ }
16
+ exports.facingAngle = facingAngle;
17
+
18
+ //# sourceMappingURL=motion.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.cjs","names":[],"sources":["../../../src/styles/plus/motion.ts"],"sourcesContent":["// The plus-specific part of the motion model; the rest is shared with other\n// grid styles in shared/grid.ts.\n\n/** atan(r) for r in [-1, 1], within 1e-5 rad: much cheaper than Math.atan2. */\nfunction atanUnit(r: number): number {\n const r2 = r * r;\n return r * (0.99997726 + r2 * (-0.33262347 + r2 * (0.19354346 + r2 * (-0.11643287 + r2 * (0.05265332 - 0.0117212 * r2)))));\n}\n\n/**\n * The smallest turn that points one of a sign's arms along (dx, dy). A \"+\"\n * looks the same every 90°, so this is always within ±45°.\n */\nexport function facingAngle(dx: number, dy: number): number {\n const ax = Math.abs(dx);\n const ay = Math.abs(dy);\n if (ax >= ay) return ax === 0 ? 0 : atanUnit(dy / dx);\n // Steeper than 45°: the vertical arm is closer, a quarter turn away from the horizontal one.\n return -atanUnit(dx / dy);\n}\n"],"mappings":";;AAIA,SAAS,SAAS,GAAmB;CACnC,MAAM,KAAK,IAAI;CACf,OAAO,KAAK,YAAa,MAAM,aAAc,MAAM,YAAa,MAAM,aAAc,MAAM,YAAa,WAAY;AACrH;;;;;AAMA,SAAgB,YAAY,IAAY,IAAoB;CAC1D,MAAM,KAAK,KAAK,IAAI,EAAE;CAEtB,IAAI,MADO,KAAK,IAAI,EACV,GAAI,OAAO,OAAO,IAAI,IAAI,SAAS,KAAK,EAAE;CAEpD,OAAO,CAAC,SAAS,KAAK,EAAE;AAC1B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The smallest turn that points one of a sign's arms along (dx, dy). A "+"
3
+ * looks the same every 90°, so this is always within ±45°.
4
+ */
5
+ export declare function facingAngle(dx: number, dy: number): number;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The smallest turn that points one of a sign's arms along (dx, dy). A "+"
3
+ * looks the same every 90°, so this is always within ±45°.
4
+ */
5
+ export declare function facingAngle(dx: number, dy: number): number;
@@ -0,0 +1,18 @@
1
+ // src/styles/plus/motion.ts
2
+ /** atan(r) for r in [-1, 1], within 1e-5 rad: much cheaper than Math.atan2. */
3
+ function atanUnit(r) {
4
+ const r2 = r * r;
5
+ return r * (.99997726 + r2 * (-.33262347 + r2 * (.19354346 + r2 * (-.11643287 + r2 * (.05265332 - .0117212 * r2)))));
6
+ }
7
+ /**
8
+ * The smallest turn that points one of a sign's arms along (dx, dy). A "+"
9
+ * looks the same every 90°, so this is always within ±45°.
10
+ */
11
+ function facingAngle(dx, dy) {
12
+ const ax = Math.abs(dx);
13
+ if (ax >= Math.abs(dy)) return ax === 0 ? 0 : atanUnit(dy / dx);
14
+ return -atanUnit(dx / dy);
15
+ }
16
+ export { facingAngle };
17
+
18
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","names":[],"sources":["../../../src/styles/plus/motion.ts"],"sourcesContent":["// The plus-specific part of the motion model; the rest is shared with other\n// grid styles in shared/grid.ts.\n\n/** atan(r) for r in [-1, 1], within 1e-5 rad: much cheaper than Math.atan2. */\nfunction atanUnit(r: number): number {\n const r2 = r * r;\n return r * (0.99997726 + r2 * (-0.33262347 + r2 * (0.19354346 + r2 * (-0.11643287 + r2 * (0.05265332 - 0.0117212 * r2)))));\n}\n\n/**\n * The smallest turn that points one of a sign's arms along (dx, dy). A \"+\"\n * looks the same every 90°, so this is always within ±45°.\n */\nexport function facingAngle(dx: number, dy: number): number {\n const ax = Math.abs(dx);\n const ay = Math.abs(dy);\n if (ax >= ay) return ax === 0 ? 0 : atanUnit(dy / dx);\n // Steeper than 45°: the vertical arm is closer, a quarter turn away from the horizontal one.\n return -atanUnit(dx / dy);\n}\n"],"mappings":";;AAIA,SAAS,SAAS,GAAmB;CACnC,MAAM,KAAK,IAAI;CACf,OAAO,KAAK,YAAa,MAAM,aAAc,MAAM,YAAa,MAAM,aAAc,MAAM,YAAa,WAAY;AACrH;;;;;AAMA,SAAgB,YAAY,IAAY,IAAoB;CAC1D,MAAM,KAAK,KAAK,IAAI,EAAE;CAEtB,IAAI,MADO,KAAK,IAAI,EACV,GAAI,OAAO,OAAO,IAAI,IAAI,SAAS,KAAK,EAAE;CAEpD,OAAO,CAAC,SAAS,KAAK,EAAE;AAC1B"}
@@ -0,0 +1,45 @@
1
+ // src/styles/plus/options.ts
2
+ var plusDefaults = Object.freeze({
3
+ color: "#8b95a5",
4
+ opacity: .6,
5
+ size: 4,
6
+ weight: 1.2,
7
+ spacing: 28,
8
+ jitter: 1,
9
+ jitterSpeed: .35,
10
+ pointerAlign: 1,
11
+ turnTime: .25,
12
+ waveSpeed: 520,
13
+ waveAlign: 1,
14
+ waveWeight: 1.5,
15
+ waveWidth: 60,
16
+ waveDuration: 1.8
17
+ });
18
+ var unit = (value) => Math.min(1, Math.max(0, value));
19
+ function resolvePlusOptions(options) {
20
+ return {
21
+ ...options,
22
+ opacity: unit(options.opacity),
23
+ size: Math.max(.5, options.size),
24
+ weight: Math.max(.1, options.weight),
25
+ spacing: Math.max(4, options.spacing),
26
+ jitter: Math.max(0, options.jitter),
27
+ jitterSpeed: Math.max(0, options.jitterSpeed),
28
+ pointerAlign: unit(options.pointerAlign),
29
+ turnTime: Math.max(0, options.turnTime),
30
+ waveSpeed: Math.max(1, options.waveSpeed),
31
+ waveAlign: unit(options.waveAlign),
32
+ waveWeight: Math.max(0, options.waveWeight),
33
+ waveWidth: Math.max(1, options.waveWidth),
34
+ waveDuration: Math.max(.05, options.waveDuration)
35
+ };
36
+ }
37
+ /** Clicks start a wave only if it would change something. */
38
+ function wavesEnabled(options) {
39
+ return options.waveAlign !== 0 || options.waveWeight !== 0;
40
+ }
41
+ exports.plusDefaults = plusDefaults;
42
+ exports.resolvePlusOptions = resolvePlusOptions;
43
+ exports.wavesEnabled = wavesEnabled;
44
+
45
+ //# sourceMappingURL=options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.cjs","names":[],"sources":["../../../src/styles/plus/options.ts"],"sourcesContent":["export interface PlusOptions {\n /** Colour of the signs. Any CSS colour. */\n color: string;\n /** Opacity of the signs, from `0` to `1`. Multiplies any alpha in the colour. */\n opacity: number;\n /** Length of each arm from the centre, in CSS pixels. */\n size: number;\n /** Stroke weight of the arms, in CSS pixels. */\n weight: number;\n /**\n * Distance between neighbouring signs in CSS pixels. The grid also keeps at least half of\n * this as empty space along every edge, so signs at the edges aren't clipped.\n */\n spacing: number;\n /** How far each sign wanders around its place, in CSS pixels. `0` = still. */\n jitter: number;\n /** How fast the signs wander, in cycles per second. `0` = still. */\n jitterSpeed: number;\n /**\n * How fully the signs turn to face the pointer while it's over the background, from `0` (not at all)\n * to `1` (an arm of every sign points straight at the pointer).\n */\n pointerAlign: number;\n /**\n * How smoothly signs turn, in seconds: about how long a sign takes to cover two thirds of a turn.\n * `0` = they snap to their new angle at once.\n */\n turnTime: number;\n /** How fast a click wave travels outwards, in CSS pixels per second. */\n waveSpeed: number;\n /** How fully signs on a click wave's crest turn to face the click, from `0` to `1`. */\n waveAlign: number;\n /** How much heavier a click wave makes the signs it passes: `1` doubles the weight on the crest. */\n waveWeight: 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 plusDefaults: Readonly<PlusOptions> = Object.freeze({\n color: '#8b95a5',\n opacity: 0.6,\n size: 4,\n weight: 1.2,\n spacing: 28,\n jitter: 1,\n jitterSpeed: 0.35,\n pointerAlign: 1,\n turnTime: 0.25,\n waveSpeed: 520,\n waveAlign: 1,\n waveWeight: 1.5,\n waveWidth: 60,\n waveDuration: 1.8,\n});\n\n/** Options after clamping: what the renderers consume. */\nexport type ResolvedPlusOptions = PlusOptions;\n\nconst unit = (value: number) => Math.min(1, Math.max(0, value));\n\nexport function resolvePlusOptions(options: PlusOptions): ResolvedPlusOptions {\n return {\n ...options,\n opacity: unit(options.opacity),\n size: Math.max(0.5, options.size),\n weight: Math.max(0.1, options.weight),\n spacing: Math.max(4, options.spacing),\n jitter: Math.max(0, options.jitter),\n jitterSpeed: Math.max(0, options.jitterSpeed),\n pointerAlign: unit(options.pointerAlign),\n turnTime: Math.max(0, options.turnTime),\n waveSpeed: Math.max(1, options.waveSpeed),\n waveAlign: unit(options.waveAlign),\n waveWeight: Math.max(0, options.waveWeight),\n waveWidth: Math.max(1, options.waveWidth),\n waveDuration: Math.max(0.05, options.waveDuration),\n };\n}\n\n/** Clicks start a wave only if it would change something. */\nexport function wavesEnabled(options: ResolvedPlusOptions): boolean {\n return options.waveAlign !== 0 || options.waveWeight !== 0;\n}\n"],"mappings":";AAwCA,IAAa,eAAsC,OAAO,OAAO;CAC/D,OAAO;CACP,SAAS;CACT,MAAM;CACN,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,UAAU;CACV,WAAW;CACX,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;AAChB,CAAC;AAKD,IAAM,QAAQ,UAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAE9D,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO;EACL,GAAG;EACH,SAAS,KAAK,QAAQ,OAAO;EAC7B,MAAM,KAAK,IAAI,IAAK,QAAQ,IAAI;EAChC,QAAQ,KAAK,IAAI,IAAK,QAAQ,MAAM;EACpC,SAAS,KAAK,IAAI,GAAG,QAAQ,OAAO;EACpC,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;EAClC,aAAa,KAAK,IAAI,GAAG,QAAQ,WAAW;EAC5C,cAAc,KAAK,QAAQ,YAAY;EACvC,UAAU,KAAK,IAAI,GAAG,QAAQ,QAAQ;EACtC,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,WAAW,KAAK,QAAQ,SAAS;EACjC,YAAY,KAAK,IAAI,GAAG,QAAQ,UAAU;EAC1C,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,cAAc,KAAK,IAAI,KAAM,QAAQ,YAAY;CACnD;AACF;;AAGA,SAAgB,aAAa,SAAuC;CAClE,OAAO,QAAQ,cAAc,KAAK,QAAQ,eAAe;AAC3D"}
@@ -0,0 +1,45 @@
1
+ export interface PlusOptions {
2
+ /** Colour of the signs. Any CSS colour. */
3
+ color: string;
4
+ /** Opacity of the signs, from `0` to `1`. Multiplies any alpha in the colour. */
5
+ opacity: number;
6
+ /** Length of each arm from the centre, in CSS pixels. */
7
+ size: number;
8
+ /** Stroke weight of the arms, in CSS pixels. */
9
+ weight: number;
10
+ /**
11
+ * Distance between neighbouring signs in CSS pixels. The grid also keeps at least half of
12
+ * this as empty space along every edge, so signs at the edges aren't clipped.
13
+ */
14
+ spacing: number;
15
+ /** How far each sign wanders around its place, in CSS pixels. `0` = still. */
16
+ jitter: number;
17
+ /** How fast the signs wander, in cycles per second. `0` = still. */
18
+ jitterSpeed: number;
19
+ /**
20
+ * How fully the signs turn to face the pointer while it's over the background, from `0` (not at all)
21
+ * to `1` (an arm of every sign points straight at the pointer).
22
+ */
23
+ pointerAlign: number;
24
+ /**
25
+ * How smoothly signs turn, in seconds: about how long a sign takes to cover two thirds of a turn.
26
+ * `0` = they snap to their new angle at once.
27
+ */
28
+ turnTime: number;
29
+ /** How fast a click wave travels outwards, in CSS pixels per second. */
30
+ waveSpeed: number;
31
+ /** How fully signs on a click wave's crest turn to face the click, from `0` to `1`. */
32
+ waveAlign: number;
33
+ /** How much heavier a click wave makes the signs it passes: `1` doubles the weight on the crest. */
34
+ waveWeight: number;
35
+ /** Width of a click wave's ring, in CSS pixels. */
36
+ waveWidth: number;
37
+ /** How long a click wave lasts before it has faded out, in seconds. */
38
+ waveDuration: number;
39
+ }
40
+ export declare const plusDefaults: Readonly<PlusOptions>;
41
+ /** Options after clamping: what the renderers consume. */
42
+ export type ResolvedPlusOptions = PlusOptions;
43
+ export declare function resolvePlusOptions(options: PlusOptions): ResolvedPlusOptions;
44
+ /** Clicks start a wave only if it would change something. */
45
+ export declare function wavesEnabled(options: ResolvedPlusOptions): boolean;
@@ -0,0 +1,45 @@
1
+ export interface PlusOptions {
2
+ /** Colour of the signs. Any CSS colour. */
3
+ color: string;
4
+ /** Opacity of the signs, from `0` to `1`. Multiplies any alpha in the colour. */
5
+ opacity: number;
6
+ /** Length of each arm from the centre, in CSS pixels. */
7
+ size: number;
8
+ /** Stroke weight of the arms, in CSS pixels. */
9
+ weight: number;
10
+ /**
11
+ * Distance between neighbouring signs in CSS pixels. The grid also keeps at least half of
12
+ * this as empty space along every edge, so signs at the edges aren't clipped.
13
+ */
14
+ spacing: number;
15
+ /** How far each sign wanders around its place, in CSS pixels. `0` = still. */
16
+ jitter: number;
17
+ /** How fast the signs wander, in cycles per second. `0` = still. */
18
+ jitterSpeed: number;
19
+ /**
20
+ * How fully the signs turn to face the pointer while it's over the background, from `0` (not at all)
21
+ * to `1` (an arm of every sign points straight at the pointer).
22
+ */
23
+ pointerAlign: number;
24
+ /**
25
+ * How smoothly signs turn, in seconds: about how long a sign takes to cover two thirds of a turn.
26
+ * `0` = they snap to their new angle at once.
27
+ */
28
+ turnTime: number;
29
+ /** How fast a click wave travels outwards, in CSS pixels per second. */
30
+ waveSpeed: number;
31
+ /** How fully signs on a click wave's crest turn to face the click, from `0` to `1`. */
32
+ waveAlign: number;
33
+ /** How much heavier a click wave makes the signs it passes: `1` doubles the weight on the crest. */
34
+ waveWeight: number;
35
+ /** Width of a click wave's ring, in CSS pixels. */
36
+ waveWidth: number;
37
+ /** How long a click wave lasts before it has faded out, in seconds. */
38
+ waveDuration: number;
39
+ }
40
+ export declare const plusDefaults: Readonly<PlusOptions>;
41
+ /** Options after clamping: what the renderers consume. */
42
+ export type ResolvedPlusOptions = PlusOptions;
43
+ export declare function resolvePlusOptions(options: PlusOptions): ResolvedPlusOptions;
44
+ /** Clicks start a wave only if it would change something. */
45
+ export declare function wavesEnabled(options: ResolvedPlusOptions): boolean;
@@ -0,0 +1,43 @@
1
+ // src/styles/plus/options.ts
2
+ var plusDefaults = Object.freeze({
3
+ color: "#8b95a5",
4
+ opacity: .6,
5
+ size: 4,
6
+ weight: 1.2,
7
+ spacing: 28,
8
+ jitter: 1,
9
+ jitterSpeed: .35,
10
+ pointerAlign: 1,
11
+ turnTime: .25,
12
+ waveSpeed: 520,
13
+ waveAlign: 1,
14
+ waveWeight: 1.5,
15
+ waveWidth: 60,
16
+ waveDuration: 1.8
17
+ });
18
+ var unit = (value) => Math.min(1, Math.max(0, value));
19
+ function resolvePlusOptions(options) {
20
+ return {
21
+ ...options,
22
+ opacity: unit(options.opacity),
23
+ size: Math.max(.5, options.size),
24
+ weight: Math.max(.1, options.weight),
25
+ spacing: Math.max(4, options.spacing),
26
+ jitter: Math.max(0, options.jitter),
27
+ jitterSpeed: Math.max(0, options.jitterSpeed),
28
+ pointerAlign: unit(options.pointerAlign),
29
+ turnTime: Math.max(0, options.turnTime),
30
+ waveSpeed: Math.max(1, options.waveSpeed),
31
+ waveAlign: unit(options.waveAlign),
32
+ waveWeight: Math.max(0, options.waveWeight),
33
+ waveWidth: Math.max(1, options.waveWidth),
34
+ waveDuration: Math.max(.05, options.waveDuration)
35
+ };
36
+ }
37
+ /** Clicks start a wave only if it would change something. */
38
+ function wavesEnabled(options) {
39
+ return options.waveAlign !== 0 || options.waveWeight !== 0;
40
+ }
41
+ export { plusDefaults, resolvePlusOptions, wavesEnabled };
42
+
43
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../src/styles/plus/options.ts"],"sourcesContent":["export interface PlusOptions {\n /** Colour of the signs. Any CSS colour. */\n color: string;\n /** Opacity of the signs, from `0` to `1`. Multiplies any alpha in the colour. */\n opacity: number;\n /** Length of each arm from the centre, in CSS pixels. */\n size: number;\n /** Stroke weight of the arms, in CSS pixels. */\n weight: number;\n /**\n * Distance between neighbouring signs in CSS pixels. The grid also keeps at least half of\n * this as empty space along every edge, so signs at the edges aren't clipped.\n */\n spacing: number;\n /** How far each sign wanders around its place, in CSS pixels. `0` = still. */\n jitter: number;\n /** How fast the signs wander, in cycles per second. `0` = still. */\n jitterSpeed: number;\n /**\n * How fully the signs turn to face the pointer while it's over the background, from `0` (not at all)\n * to `1` (an arm of every sign points straight at the pointer).\n */\n pointerAlign: number;\n /**\n * How smoothly signs turn, in seconds: about how long a sign takes to cover two thirds of a turn.\n * `0` = they snap to their new angle at once.\n */\n turnTime: number;\n /** How fast a click wave travels outwards, in CSS pixels per second. */\n waveSpeed: number;\n /** How fully signs on a click wave's crest turn to face the click, from `0` to `1`. */\n waveAlign: number;\n /** How much heavier a click wave makes the signs it passes: `1` doubles the weight on the crest. */\n waveWeight: 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 plusDefaults: Readonly<PlusOptions> = Object.freeze({\n color: '#8b95a5',\n opacity: 0.6,\n size: 4,\n weight: 1.2,\n spacing: 28,\n jitter: 1,\n jitterSpeed: 0.35,\n pointerAlign: 1,\n turnTime: 0.25,\n waveSpeed: 520,\n waveAlign: 1,\n waveWeight: 1.5,\n waveWidth: 60,\n waveDuration: 1.8,\n});\n\n/** Options after clamping: what the renderers consume. */\nexport type ResolvedPlusOptions = PlusOptions;\n\nconst unit = (value: number) => Math.min(1, Math.max(0, value));\n\nexport function resolvePlusOptions(options: PlusOptions): ResolvedPlusOptions {\n return {\n ...options,\n opacity: unit(options.opacity),\n size: Math.max(0.5, options.size),\n weight: Math.max(0.1, options.weight),\n spacing: Math.max(4, options.spacing),\n jitter: Math.max(0, options.jitter),\n jitterSpeed: Math.max(0, options.jitterSpeed),\n pointerAlign: unit(options.pointerAlign),\n turnTime: Math.max(0, options.turnTime),\n waveSpeed: Math.max(1, options.waveSpeed),\n waveAlign: unit(options.waveAlign),\n waveWeight: Math.max(0, options.waveWeight),\n waveWidth: Math.max(1, options.waveWidth),\n waveDuration: Math.max(0.05, options.waveDuration),\n };\n}\n\n/** Clicks start a wave only if it would change something. */\nexport function wavesEnabled(options: ResolvedPlusOptions): boolean {\n return options.waveAlign !== 0 || options.waveWeight !== 0;\n}\n"],"mappings":";AAwCA,IAAa,eAAsC,OAAO,OAAO;CAC/D,OAAO;CACP,SAAS;CACT,MAAM;CACN,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,UAAU;CACV,WAAW;CACX,WAAW;CACX,YAAY;CACZ,WAAW;CACX,cAAc;AAChB,CAAC;AAKD,IAAM,QAAQ,UAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAE9D,SAAgB,mBAAmB,SAA2C;CAC5E,OAAO;EACL,GAAG;EACH,SAAS,KAAK,QAAQ,OAAO;EAC7B,MAAM,KAAK,IAAI,IAAK,QAAQ,IAAI;EAChC,QAAQ,KAAK,IAAI,IAAK,QAAQ,MAAM;EACpC,SAAS,KAAK,IAAI,GAAG,QAAQ,OAAO;EACpC,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;EAClC,aAAa,KAAK,IAAI,GAAG,QAAQ,WAAW;EAC5C,cAAc,KAAK,QAAQ,YAAY;EACvC,UAAU,KAAK,IAAI,GAAG,QAAQ,QAAQ;EACtC,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,WAAW,KAAK,QAAQ,SAAS;EACjC,YAAY,KAAK,IAAI,GAAG,QAAQ,UAAU;EAC1C,WAAW,KAAK,IAAI,GAAG,QAAQ,SAAS;EACxC,cAAc,KAAK,IAAI,KAAM,QAAQ,YAAY;CACnD;AACF;;AAGA,SAAgB,aAAa,SAAuC;CAClE,OAAO,QAAQ,cAAc,KAAK,QAAQ,eAAe;AAC3D"}
@@ -0,0 +1,102 @@
1
+ const require_grid = require("../../shared/grid.cjs");
2
+ const require_motion = require("./motion.cjs");
3
+ // src/styles/plus/turns.ts
4
+ var QUARTER = Math.PI / 2;
5
+ /** A sign has finished turning once its arm tips are this close to where they're heading, in CSS pixels. */
6
+ var SETTLED_PX = .05;
7
+ /** The same turn, expressed within ±45° (a "+" looks the same every 90°). */
8
+ function wrap(angle) {
9
+ return angle - QUARTER * Math.round(angle / QUARTER);
10
+ }
11
+ function createSignTurns() {
12
+ let data = /* @__PURE__ */ new Float32Array(0);
13
+ const waveData = /* @__PURE__ */ new Float32Array(32);
14
+ /** Work out each wave's ring radius and envelope once per frame instead of once per sign. */
15
+ function packWaves(waves, speed, duration) {
16
+ for (let k = 0; k < waves.length; k++) {
17
+ const wave = waves[k];
18
+ waveData[k * 4] = wave.x;
19
+ waveData[k * 4 + 1] = wave.y;
20
+ waveData[k * 4 + 2] = speed * wave.age;
21
+ waveData[k * 4 + 3] = require_grid.waveEnvelope(wave.age, duration);
22
+ }
23
+ }
24
+ let changed = false;
25
+ let settling = false;
26
+ let lastX = NaN;
27
+ let lastY = NaN;
28
+ let lastAlign = NaN;
29
+ let lastOriginX = NaN;
30
+ let lastOriginY = NaN;
31
+ let lastOptions = null;
32
+ let hadWaves = false;
33
+ return {
34
+ get data() {
35
+ return data;
36
+ },
37
+ get changed() {
38
+ return changed;
39
+ },
40
+ get settling() {
41
+ return settling;
42
+ },
43
+ update(frame, options, grid, waves) {
44
+ const { cols, rows, originX, originY } = grid;
45
+ const { spacing, waveSpeed, waveWidth, waveDuration, waveAlign } = options;
46
+ const resized = data.length !== cols * rows * 2;
47
+ if (resized) data = new Float32Array(cols * rows * 2);
48
+ const align = options.pointerAlign * frame.pointer.influence;
49
+ const { x: px, y: py } = frame.pointer;
50
+ const unchanged = !resized && !settling && !hadWaves && waves.length === 0 && align === lastAlign && (align === 0 || px === lastX && py === lastY && originX === lastOriginX && originY === lastOriginY && options === lastOptions);
51
+ hadWaves = waves.length > 0;
52
+ if (unchanged) {
53
+ changed = false;
54
+ return;
55
+ }
56
+ lastX = px;
57
+ lastY = py;
58
+ lastAlign = align;
59
+ lastOriginX = originX;
60
+ lastOriginY = originY;
61
+ lastOptions = options;
62
+ const waveCount = waves.length;
63
+ packWaves(waves, waveSpeed, waveDuration);
64
+ const waveReach = 3 * waveWidth;
65
+ const settled = SETTLED_PX / options.size;
66
+ const ease = options.turnTime > 0 ? 1 - Math.exp(-frame.dt / options.turnTime) : 1;
67
+ settling = false;
68
+ for (let j = 0; j < rows; j++) {
69
+ const restY = originY + j * spacing;
70
+ for (let i = 0; i < cols; i++) {
71
+ const restX = originX + i * spacing;
72
+ let target = 0;
73
+ if (align !== 0) target = align * require_motion.facingAngle(restX - px, restY - py);
74
+ let ring = 0;
75
+ for (let w = 0; w < waveCount * 4; w += 4) {
76
+ const dx = restX - waveData[w];
77
+ const dy = restY - waveData[w + 1];
78
+ const outer = waveData[w + 2] + waveReach;
79
+ if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;
80
+ const distance = Math.sqrt(dx * dx + dy * dy);
81
+ if (Math.abs(distance - waveData[w + 2]) > waveReach) continue;
82
+ const height = require_grid.waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];
83
+ ring += height;
84
+ target += waveAlign * Math.min(1, height) * require_motion.facingAngle(dx, dy);
85
+ }
86
+ const k = (j * cols + i) * 2;
87
+ const remaining = wrap(target - data[k]);
88
+ if (Math.abs(remaining) < settled) data[k] = wrap(target);
89
+ else {
90
+ data[k] = wrap(data[k] + remaining * ease);
91
+ settling = true;
92
+ }
93
+ data[k + 1] = ring;
94
+ }
95
+ }
96
+ changed = true;
97
+ }
98
+ };
99
+ }
100
+ exports.createSignTurns = createSignTurns;
101
+
102
+ //# sourceMappingURL=turns.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turns.cjs","names":["waveEnvelope","facingAngle","waveRing"],"sources":["../../../src/styles/plus/turns.ts"],"sourcesContent":["import type { Frame } from '../../core/style';\nimport { MAX_WAVES, waveEnvelope, waveRing, type Grid, type Wave } from '../../shared/grid';\nimport { facingAngle } from './motion';\nimport type { ResolvedPlusOptions } from './options';\n\nconst QUARTER = Math.PI / 2;\n/** A sign has finished turning once its arm tips are this close to where they're heading, in CSS pixels. */\nconst SETTLED_PX = 0.05;\n\n/** The same turn, expressed within ±45° (a \"+\" looks the same every 90°). */\nfunction wrap(angle: number): number {\n return angle - QUARTER * Math.round(angle / QUARTER);\n}\n\n/**\n * Each sign's angle and wave-crest height, kept between frames so signs ease\n * towards the angle they want instead of jumping to it. Both renderers use it.\n */\nexport interface SignTurns {\n /** Angle (radians) and wave-crest height of every sign, row-major, as pairs. */\n readonly data: Float32Array<ArrayBuffer>;\n /** Whether `data` changed in the last update. */\n readonly changed: boolean;\n /** Whether any sign is still turning towards its target. */\n readonly settling: boolean;\n update(frame: Frame, options: ResolvedPlusOptions, grid: Grid, waves: readonly Wave[]): void;\n}\n\nexport function createSignTurns(): SignTurns {\n let data = new Float32Array(0);\n const waveData = new Float32Array(MAX_WAVES * 4);\n\n /** Work out each wave's ring radius and envelope once per frame instead of once per sign. */\n function packWaves(waves: readonly Wave[], speed: number, duration: number): void {\n for (let k = 0; k < waves.length; k++) {\n const wave = waves[k];\n waveData[k * 4] = wave.x;\n waveData[k * 4 + 1] = wave.y;\n waveData[k * 4 + 2] = speed * wave.age;\n waveData[k * 4 + 3] = waveEnvelope(wave.age, duration);\n }\n }\n let changed = false;\n let settling = false;\n // What the last update computed from: if none of it changes, neither do the angles.\n let lastX = NaN;\n let lastY = NaN;\n let lastAlign = NaN;\n let lastOriginX = NaN;\n let lastOriginY = NaN;\n let lastOptions: ResolvedPlusOptions | null = null;\n let hadWaves = false;\n\n return {\n get data() {\n return data;\n },\n get changed() {\n return changed;\n },\n get settling() {\n return settling;\n },\n update(frame, options, grid, waves) {\n const { cols, rows, originX, originY } = grid;\n const { spacing, waveSpeed, waveWidth, waveDuration, waveAlign } = options;\n const resized = data.length !== cols * rows * 2;\n if (resized) data = new Float32Array(cols * rows * 2);\n\n const align = options.pointerAlign * frame.pointer.influence;\n const { x: px, y: py } = frame.pointer;\n // Nothing is turning and nothing it depends on has moved: the angles are already right.\n // With no pointer, every sign is upright whatever the grid or options.\n const unchanged =\n !resized &&\n !settling &&\n !hadWaves &&\n waves.length === 0 &&\n align === lastAlign &&\n (align === 0 ||\n (px === lastX && py === lastY && originX === lastOriginX && originY === lastOriginY && options === lastOptions));\n hadWaves = waves.length > 0;\n if (unchanged) {\n changed = false;\n return;\n }\n lastX = px;\n lastY = py;\n lastAlign = align;\n lastOriginX = originX;\n lastOriginY = originY;\n lastOptions = options;\n\n // Each wave as x, y, ring radius, envelope. Further than 3 widths from its ring a wave is below e⁻⁹: skipped.\n const waveCount = waves.length;\n packWaves(waves, waveSpeed, waveDuration);\n const waveReach = 3 * waveWidth;\n const settled = SETTLED_PX / options.size;\n const ease = options.turnTime > 0 ? 1 - Math.exp(-frame.dt / options.turnTime) : 1;\n settling = false;\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 restX = originX + i * spacing;\n\n let target = 0;\n // While the pointer is over the background, every sign turns to face it.\n if (align !== 0) target = align * facingAngle(restX - px, restY - py);\n\n let ring = 0;\n for (let w = 0; w < waveCount * 4; w += 4) {\n const dx = restX - waveData[w];\n const dy = restY - waveData[w + 1];\n const outer = waveData[w + 2] + waveReach;\n if (Math.abs(dx) > outer || Math.abs(dy) > outer) continue;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (Math.abs(distance - waveData[w + 2]) > waveReach) continue;\n const height = waveRing(distance, waveData[w + 2], waveWidth) * waveData[w + 3];\n ring += height;\n // On the crest, signs turn to face the click.\n target += waveAlign * Math.min(1, height) * facingAngle(dx, dy);\n }\n\n // Ease towards the target the short way round, so a sign never spins more than 45°.\n const k = (j * cols + i) * 2;\n const remaining = wrap(target - data[k]);\n if (Math.abs(remaining) < settled) {\n data[k] = wrap(target);\n } else {\n data[k] = wrap(data[k] + remaining * ease);\n settling = true;\n }\n data[k + 1] = ring;\n }\n }\n changed = true;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Frame } from '../../core/style.cjs';
2
+ import { type Grid, type Wave } from '../../shared/grid.cjs';
3
+ import type { ResolvedPlusOptions } from './options.cjs';
4
+ /**
5
+ * Each sign's angle and wave-crest height, kept between frames so signs ease
6
+ * towards the angle they want instead of jumping to it. Both renderers use it.
7
+ */
8
+ export interface SignTurns {
9
+ /** Angle (radians) and wave-crest height of every sign, row-major, as pairs. */
10
+ readonly data: Float32Array<ArrayBuffer>;
11
+ /** Whether `data` changed in the last update. */
12
+ readonly changed: boolean;
13
+ /** Whether any sign is still turning towards its target. */
14
+ readonly settling: boolean;
15
+ update(frame: Frame, options: ResolvedPlusOptions, grid: Grid, waves: readonly Wave[]): void;
16
+ }
17
+ export declare function createSignTurns(): SignTurns;
@@ -0,0 +1,17 @@
1
+ import type { Frame } from '../../core/style.js';
2
+ import { type Grid, type Wave } from '../../shared/grid.js';
3
+ import type { ResolvedPlusOptions } from './options.js';
4
+ /**
5
+ * Each sign's angle and wave-crest height, kept between frames so signs ease
6
+ * towards the angle they want instead of jumping to it. Both renderers use it.
7
+ */
8
+ export interface SignTurns {
9
+ /** Angle (radians) and wave-crest height of every sign, row-major, as pairs. */
10
+ readonly data: Float32Array<ArrayBuffer>;
11
+ /** Whether `data` changed in the last update. */
12
+ readonly changed: boolean;
13
+ /** Whether any sign is still turning towards its target. */
14
+ readonly settling: boolean;
15
+ update(frame: Frame, options: ResolvedPlusOptions, grid: Grid, waves: readonly Wave[]): void;
16
+ }
17
+ export declare function createSignTurns(): SignTurns;