@sarmal/core 0.25.1 → 0.26.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 (105) hide show
  1. package/dist/auto-init.cjs +170 -206
  2. package/dist/auto-init.cjs.map +1 -1
  3. package/dist/auto-init.js +169 -205
  4. package/dist/auto-init.js.map +1 -1
  5. package/dist/curves/artemis2.cjs +14 -20
  6. package/dist/curves/artemis2.cjs.map +1 -1
  7. package/dist/curves/artemis2.d.cts +1 -1
  8. package/dist/curves/artemis2.d.ts +1 -1
  9. package/dist/curves/artemis2.js +13 -19
  10. package/dist/curves/artemis2.js.map +1 -1
  11. package/dist/curves/astroid.cjs +7 -7
  12. package/dist/curves/astroid.cjs.map +1 -1
  13. package/dist/curves/astroid.d.cts +1 -1
  14. package/dist/curves/astroid.d.ts +1 -1
  15. package/dist/curves/astroid.js +6 -6
  16. package/dist/curves/astroid.js.map +1 -1
  17. package/dist/curves/deltoid.cjs +6 -6
  18. package/dist/curves/deltoid.cjs.map +1 -1
  19. package/dist/curves/deltoid.d.cts +1 -1
  20. package/dist/curves/deltoid.d.ts +1 -1
  21. package/dist/curves/deltoid.js +5 -5
  22. package/dist/curves/deltoid.js.map +1 -1
  23. package/dist/curves/epicycloid3.cjs +6 -6
  24. package/dist/curves/epicycloid3.cjs.map +1 -1
  25. package/dist/curves/epicycloid3.d.cts +1 -1
  26. package/dist/curves/epicycloid3.d.ts +1 -1
  27. package/dist/curves/epicycloid3.js +5 -5
  28. package/dist/curves/epicycloid3.js.map +1 -1
  29. package/dist/curves/epitrochoid7.cjs +10 -10
  30. package/dist/curves/epitrochoid7.cjs.map +1 -1
  31. package/dist/curves/epitrochoid7.d.cts +1 -1
  32. package/dist/curves/epitrochoid7.d.ts +1 -1
  33. package/dist/curves/epitrochoid7.js +9 -9
  34. package/dist/curves/epitrochoid7.js.map +1 -1
  35. package/dist/curves/index.cjs +81 -97
  36. package/dist/curves/index.cjs.map +1 -1
  37. package/dist/curves/index.d.cts +29 -29
  38. package/dist/curves/index.d.ts +29 -29
  39. package/dist/curves/index.js +81 -113
  40. package/dist/curves/index.js.map +1 -1
  41. package/dist/curves/lame.cjs +7 -8
  42. package/dist/curves/lame.cjs.map +1 -1
  43. package/dist/curves/lame.d.cts +1 -1
  44. package/dist/curves/lame.d.ts +1 -1
  45. package/dist/curves/lame.js +6 -7
  46. package/dist/curves/lame.js.map +1 -1
  47. package/dist/curves/lissajous32.cjs +7 -7
  48. package/dist/curves/lissajous32.cjs.map +1 -1
  49. package/dist/curves/lissajous32.d.cts +1 -1
  50. package/dist/curves/lissajous32.d.ts +1 -1
  51. package/dist/curves/lissajous32.js +6 -6
  52. package/dist/curves/lissajous32.js.map +1 -1
  53. package/dist/curves/lissajous43.cjs +7 -7
  54. package/dist/curves/lissajous43.cjs.map +1 -1
  55. package/dist/curves/lissajous43.d.cts +1 -1
  56. package/dist/curves/lissajous43.d.ts +1 -1
  57. package/dist/curves/lissajous43.js +6 -6
  58. package/dist/curves/lissajous43.js.map +1 -1
  59. package/dist/curves/rose3.cjs +7 -7
  60. package/dist/curves/rose3.cjs.map +1 -1
  61. package/dist/curves/rose3.d.cts +1 -1
  62. package/dist/curves/rose3.d.ts +1 -1
  63. package/dist/curves/rose3.js +6 -6
  64. package/dist/curves/rose3.js.map +1 -1
  65. package/dist/curves/rose5.cjs +7 -7
  66. package/dist/curves/rose5.cjs.map +1 -1
  67. package/dist/curves/rose5.d.cts +1 -1
  68. package/dist/curves/rose5.d.ts +1 -1
  69. package/dist/curves/rose5.js +6 -6
  70. package/dist/curves/rose5.js.map +1 -1
  71. package/dist/curves/rose52.cjs +7 -7
  72. package/dist/curves/rose52.cjs.map +1 -1
  73. package/dist/curves/rose52.d.cts +1 -1
  74. package/dist/curves/rose52.d.ts +1 -1
  75. package/dist/curves/rose52.js +6 -6
  76. package/dist/curves/rose52.js.map +1 -1
  77. package/dist/curves/star.cjs +7 -10
  78. package/dist/curves/star.cjs.map +1 -1
  79. package/dist/curves/star.d.cts +1 -1
  80. package/dist/curves/star.d.ts +1 -1
  81. package/dist/curves/star.js +6 -9
  82. package/dist/curves/star.js.map +1 -1
  83. package/dist/curves/star4.cjs +7 -10
  84. package/dist/curves/star4.cjs.map +1 -1
  85. package/dist/curves/star4.d.cts +2 -2
  86. package/dist/curves/star4.d.ts +2 -2
  87. package/dist/curves/star4.js +6 -9
  88. package/dist/curves/star4.js.map +1 -1
  89. package/dist/curves/star7.cjs +7 -10
  90. package/dist/curves/star7.cjs.map +1 -1
  91. package/dist/curves/star7.d.cts +2 -2
  92. package/dist/curves/star7.d.ts +2 -2
  93. package/dist/curves/star7.js +6 -9
  94. package/dist/curves/star7.js.map +1 -1
  95. package/dist/index.cjs +158 -192
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.d.cts +43 -95
  98. package/dist/index.d.ts +43 -95
  99. package/dist/index.js +158 -213
  100. package/dist/index.js.map +1 -1
  101. package/dist/types-zbxUgcmZ.d.cts +325 -0
  102. package/dist/types-zbxUgcmZ.d.ts +325 -0
  103. package/package.json +1 -1
  104. package/dist/types-Z9i1_AQZ.d.cts +0 -339
  105. package/dist/types-Z9i1_AQZ.d.ts +0 -339
@@ -1,38 +1,38 @@
1
- import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
- export { artemis2 } from "./artemis2.js";
3
- export { astroid } from "./astroid.js";
4
- export { deltoid } from "./deltoid.js";
5
- export { epicycloid3 } from "./epicycloid3.js";
6
- export { epitrochoid7 } from "./epitrochoid7.js";
7
- export { lissajous32 } from "./lissajous32.js";
8
- export { lissajous43 } from "./lissajous43.js";
9
- export { lame } from "./lame.js";
10
- export { rose3 } from "./rose3.js";
11
- export { rose5 } from "./rose5.js";
12
- export { rose52 } from "./rose52.js";
13
- export { star } from "./star.js";
14
- export { star4 } from "./star4.js";
15
- export { star7 } from "./star7.js";
1
+ import { C as CurveDef } from '../types-zbxUgcmZ.js';
2
+ export { artemis2 } from './artemis2.js';
3
+ export { astroid } from './astroid.js';
4
+ export { deltoid } from './deltoid.js';
5
+ export { epicycloid3 } from './epicycloid3.js';
6
+ export { epitrochoid7 } from './epitrochoid7.js';
7
+ export { lissajous32 } from './lissajous32.js';
8
+ export { lissajous43 } from './lissajous43.js';
9
+ export { lame } from './lame.js';
10
+ export { rose3 } from './rose3.js';
11
+ export { rose5 } from './rose5.js';
12
+ export { rose52 } from './rose52.js';
13
+ export { star } from './star.js';
14
+ export { star4 } from './star4.js';
15
+ export { star7 } from './star7.js';
16
16
 
17
17
  /**
18
18
  * Collection of all built-in sarmal curves
19
19
  * Import individual curves for better tree-shaking
20
20
  */
21
21
  declare const curves: {
22
- readonly artemis2: CurveDef;
23
- readonly epitrochoid7: CurveDef;
24
- readonly astroid: CurveDef;
25
- readonly deltoid: CurveDef;
26
- readonly rose3: CurveDef;
27
- readonly rose5: CurveDef;
28
- readonly rose52: CurveDef;
29
- readonly star: CurveDef;
30
- readonly star4: CurveDef;
31
- readonly star7: CurveDef;
32
- readonly lissajous32: CurveDef;
33
- readonly lissajous43: CurveDef;
34
- readonly epicycloid3: CurveDef;
35
- readonly lame: CurveDef;
22
+ readonly artemis2: CurveDef;
23
+ readonly epitrochoid7: CurveDef;
24
+ readonly astroid: CurveDef;
25
+ readonly deltoid: CurveDef;
26
+ readonly rose3: CurveDef;
27
+ readonly rose5: CurveDef;
28
+ readonly rose52: CurveDef;
29
+ readonly star: CurveDef;
30
+ readonly star4: CurveDef;
31
+ readonly star7: CurveDef;
32
+ readonly lissajous32: CurveDef;
33
+ readonly lissajous43: CurveDef;
34
+ readonly epicycloid3: CurveDef;
35
+ readonly lame: CurveDef;
36
36
  };
37
37
  type CurveName = keyof typeof curves;
38
38
 
@@ -3,15 +3,9 @@ var PERIOD = 2 * Math.PI;
3
3
  function catmullRom1D(p0, p1, p2, p3, u) {
4
4
  const u2 = u * u;
5
5
  const u3 = u2 * u;
6
- return (
7
- 0.5 *
8
- (2 * p1 +
9
- (-p0 + p2) * u +
10
- (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +
11
- (-p0 + 3 * p1 - 3 * p2 + p3) * u3)
12
- );
6
+ return 0.5 * (2 * p1 + (-p0 + p2) * u + (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 + (-p0 + 3 * p1 - 3 * p2 + p3) * u3);
13
7
  }
14
- function evaluateCatmullRom(points2, t) {
8
+ function evaluateCatmullRom(points2, phase) {
15
9
  const N = points2.length;
16
10
  if (N === 0) {
17
11
  return { x: 0, y: 0 };
@@ -19,13 +13,13 @@ function evaluateCatmullRom(points2, t) {
19
13
  if (N === 1) {
20
14
  return { x: points2[0][0], y: points2[0][1] };
21
15
  }
22
- t = ((t % PERIOD) + PERIOD) % PERIOD;
16
+ phase = (phase % PERIOD + PERIOD) % PERIOD;
23
17
  const segmentSize = PERIOD / N;
24
- let i = Math.floor(t / segmentSize);
18
+ let i = Math.floor(phase / segmentSize);
25
19
  if (i >= N) {
26
20
  i = N - 1;
27
21
  }
28
- let u = (t - i * segmentSize) / segmentSize;
22
+ let u = (phase - i * segmentSize) / segmentSize;
29
23
  u = Math.max(0, Math.min(1, u));
30
24
  const p0 = points2[(i - 1 + N) % N];
31
25
  const p1 = points2[i];
@@ -33,7 +27,7 @@ function evaluateCatmullRom(points2, t) {
33
27
  const p3 = points2[(i + 2) % N];
34
28
  return {
35
29
  x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),
36
- y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),
30
+ y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u)
37
31
  };
38
32
  }
39
33
  function drawCurve(points2, opts) {
@@ -43,20 +37,20 @@ function drawCurve(points2, opts) {
43
37
  const first = points2[0];
44
38
  if (points2.every((p) => p[0] === first[0] && p[1] === first[1])) {
45
39
  console.warn(
46
- "[sarmal].drawCurve: all control points are identical. The curve will be a single point.",
40
+ "[sarmal].drawCurve: all control points are identical. The curve will be a single point."
47
41
  );
48
42
  }
49
43
  const maxAbs = points2.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);
50
44
  if (maxAbs > 2) {
51
45
  console.warn(
52
- `[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,
46
+ `[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`
53
47
  );
54
48
  }
55
49
  const pts = points2.map(([x, y]) => [x, y]);
56
50
  return {
57
51
  name: opts?.name ?? "drawn",
58
- fn: (t) => evaluateCatmullRom(pts, t),
59
- period: PERIOD,
52
+ fn: (phase) => evaluateCatmullRom(pts, phase),
53
+ period: PERIOD
60
54
  };
61
55
  }
62
56
 
@@ -82,74 +76,74 @@ var points = [
82
76
  [-0.69, -0.84],
83
77
  [-0.87, -0.66],
84
78
  [-0.9, -0.47],
85
- [-0.76, -0.35],
79
+ [-0.76, -0.35]
86
80
  ];
87
81
  var artemis2 = {
88
82
  ...drawCurve(points, { name: "Artemis II" }),
89
- speed: 0.7,
83
+ speed: 0.7
90
84
  };
91
85
 
92
86
  // src/curves/astroid.ts
93
87
  var TWO_PI = Math.PI * 2;
94
- function astroidFn(t, _time, _params) {
95
- const c = Math.cos(t);
96
- const s = Math.sin(t);
88
+ function astroidFn(phase, _elapsed, _params) {
89
+ const c = Math.cos(phase);
90
+ const s = Math.sin(phase);
97
91
  return {
98
92
  x: c * c * c,
99
- y: s * s * s,
93
+ y: s * s * s
100
94
  };
101
95
  }
102
96
  var astroid = {
103
97
  name: "Astroid",
104
98
  fn: astroidFn,
105
99
  period: TWO_PI,
106
- speed: 1.1,
100
+ speed: 1.1
107
101
  };
108
102
 
109
103
  // src/curves/deltoid.ts
110
104
  var TWO_PI2 = Math.PI * 2;
111
- function deltoidFn(t, _time, _params) {
105
+ function deltoidFn(phase, _elapsed, _params) {
112
106
  return {
113
- x: 2 * Math.cos(t) + Math.cos(2 * t),
114
- y: 2 * Math.sin(t) - Math.sin(2 * t),
107
+ x: 2 * Math.cos(phase) + Math.cos(2 * phase),
108
+ y: 2 * Math.sin(phase) - Math.sin(2 * phase)
115
109
  };
116
110
  }
117
111
  var deltoid = {
118
112
  name: "Deltoid",
119
113
  fn: deltoidFn,
120
114
  period: TWO_PI2,
121
- speed: 0.9,
115
+ speed: 0.9
122
116
  };
123
117
 
124
118
  // src/curves/epicycloid3.ts
125
119
  var TWO_PI3 = Math.PI * 2;
126
- function epicycloid3Fn(t, _time, _params) {
120
+ function epicycloid3Fn(phase, _elapsed, _params) {
127
121
  return {
128
- x: 4 * Math.cos(t) - Math.cos(4 * t),
129
- y: 4 * Math.sin(t) - Math.sin(4 * t),
122
+ x: 4 * Math.cos(phase) - Math.cos(4 * phase),
123
+ y: 4 * Math.sin(phase) - Math.sin(4 * phase)
130
124
  };
131
125
  }
132
126
  var epicycloid3 = {
133
127
  name: "Epicycloid (n=3)",
134
128
  fn: epicycloid3Fn,
135
129
  period: TWO_PI3,
136
- speed: 0.75,
130
+ speed: 0.75
137
131
  };
138
132
 
139
133
  // src/curves/epitrochoid7.ts
140
134
  var TWO_PI4 = Math.PI * 2;
141
- function epitrochoid7Fn(t, _time, _params) {
142
- const d = 1 + 0.55 * Math.sin(t * 0.5);
135
+ function epitrochoid7Fn(phase, _elapsed, _params) {
136
+ const d = 1 + 0.55 * Math.sin(phase * 0.5);
143
137
  return {
144
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
145
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
138
+ x: 7 * Math.cos(phase) - d * Math.cos(7 * phase),
139
+ y: 7 * Math.sin(phase) - d * Math.sin(7 * phase)
146
140
  };
147
141
  }
148
- function epitrochoid7SkeletonFn(t) {
142
+ function epitrochoid7SkeletonFn(phase) {
149
143
  const d = 1.275;
150
144
  return {
151
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
152
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
145
+ x: 7 * Math.cos(phase) - d * Math.cos(7 * phase),
146
+ y: 7 * Math.sin(phase) - d * Math.sin(7 * phase)
153
147
  };
154
148
  }
155
149
  var epitrochoid7 = {
@@ -157,16 +151,16 @@ var epitrochoid7 = {
157
151
  fn: epitrochoid7Fn,
158
152
  period: TWO_PI4,
159
153
  speed: 1.4,
160
- skeletonFn: epitrochoid7SkeletonFn,
154
+ skeletonFn: epitrochoid7SkeletonFn
161
155
  };
162
156
 
163
157
  // src/curves/lissajous32.ts
164
158
  var TWO_PI5 = Math.PI * 2;
165
- function lissajous32Fn(t, time, _params) {
166
- const phi = time * 0.45;
159
+ function lissajous32Fn(phase, elapsed, _params) {
160
+ const phi = elapsed * 0.45;
167
161
  return {
168
- x: Math.sin(3 * t + phi),
169
- y: Math.sin(2 * t),
162
+ x: Math.sin(3 * phase + phi),
163
+ y: Math.sin(2 * phase)
170
164
  };
171
165
  }
172
166
  var lissajous32 = {
@@ -174,16 +168,16 @@ var lissajous32 = {
174
168
  fn: lissajous32Fn,
175
169
  period: TWO_PI5,
176
170
  speed: 2,
177
- skeleton: "live",
171
+ skeleton: "live"
178
172
  };
179
173
 
180
174
  // src/curves/lissajous43.ts
181
175
  var TWO_PI6 = Math.PI * 2;
182
- function lissajous43Fn(t, time, _params) {
183
- const phi = time * 0.38;
176
+ function lissajous43Fn(phase, elapsed, _params) {
177
+ const phi = elapsed * 0.38;
184
178
  return {
185
- x: Math.sin(4 * t + phi),
186
- y: Math.sin(3 * t),
179
+ x: Math.sin(4 * phase + phi),
180
+ y: Math.sin(3 * phase)
187
181
  };
188
182
  }
189
183
  var lissajous43 = {
@@ -191,18 +185,17 @@ var lissajous43 = {
191
185
  fn: lissajous43Fn,
192
186
  period: TWO_PI6,
193
187
  speed: 1.8,
194
- skeleton: "live",
188
+ skeleton: "live"
195
189
  };
196
190
 
197
191
  // src/curves/lame.ts
198
192
  var TWO_PI7 = Math.PI * 2;
199
- function lameFn(t, time, _params) {
200
- const p = 1.75 + 1.25 * Math.sin(time * 0.48);
201
- const c = Math.cos(t),
202
- s = Math.sin(t);
193
+ function lameFn(phase, elapsed, _params) {
194
+ const p = 1.75 + 1.25 * Math.sin(elapsed * 0.48);
195
+ const c = Math.cos(phase), s = Math.sin(phase);
203
196
  return {
204
197
  x: Math.sign(c) * Math.pow(Math.abs(c), p),
205
- y: Math.sign(s) * Math.pow(Math.abs(s), p),
198
+ y: Math.sign(s) * Math.pow(Math.abs(s), p)
206
199
  };
207
200
  }
208
201
  var lame = {
@@ -210,112 +203,103 @@ var lame = {
210
203
  fn: lameFn,
211
204
  period: TWO_PI7,
212
205
  speed: 1,
213
- skeleton: "live",
206
+ skeleton: "live"
214
207
  };
215
208
 
216
209
  // src/curves/rose3.ts
217
210
  var TWO_PI8 = Math.PI * 2;
218
- function rose3Fn(t, _time, _params) {
219
- const r = Math.cos(3 * t);
211
+ function rose3Fn(phase, _elapsed, _params) {
212
+ const r = Math.cos(3 * phase);
220
213
  return {
221
- x: r * Math.cos(t),
222
- y: r * Math.sin(t),
214
+ x: r * Math.cos(phase),
215
+ y: r * Math.sin(phase)
223
216
  };
224
217
  }
225
218
  var rose3 = {
226
219
  name: "Rose (n=3)",
227
220
  fn: rose3Fn,
228
221
  period: TWO_PI8,
229
- speed: 1.15,
222
+ speed: 1.15
230
223
  };
231
224
 
232
225
  // src/curves/rose5.ts
233
226
  var TWO_PI9 = Math.PI * 2;
234
- function rose5Fn(t, _time, _params) {
235
- const r = Math.cos(5 * t);
227
+ function rose5Fn(phase, _elapsed, _params) {
228
+ const r = Math.cos(5 * phase);
236
229
  return {
237
- x: r * Math.cos(t),
238
- y: r * Math.sin(t),
230
+ x: r * Math.cos(phase),
231
+ y: r * Math.sin(phase)
239
232
  };
240
233
  }
241
234
  var rose5 = {
242
235
  name: "Rose (n=5)",
243
236
  fn: rose5Fn,
244
237
  period: TWO_PI9,
245
- speed: 1,
238
+ speed: 1
246
239
  };
247
240
 
248
241
  // src/curves/rose52.ts
249
242
  var FOUR_PI = Math.PI * 4;
250
- function rose52Fn(t, _time, _params) {
251
- const r = Math.cos((5 / 2) * t);
243
+ function rose52Fn(phase, _elapsed, _params) {
244
+ const r = Math.cos(5 / 2 * phase);
252
245
  return {
253
- x: r * Math.cos(t),
254
- y: r * Math.sin(t),
246
+ x: r * Math.cos(phase),
247
+ y: r * Math.sin(phase)
255
248
  };
256
249
  }
257
250
  var rose52 = {
258
251
  name: "Rose (n=5/2)",
259
252
  fn: rose52Fn,
260
253
  period: FOUR_PI,
261
- speed: 0.8,
254
+ speed: 0.8
262
255
  };
263
256
 
264
257
  // src/curves/star.ts
265
258
  var TWO_PI10 = Math.PI * 2;
266
- function starFn(t, _time, _params) {
267
- const r =
268
- Math.abs(Math.cos((5 / 2) * t)) +
269
- 0.35 * Math.abs(Math.cos((15 / 2) * t)) +
270
- 0.15 * Math.abs(Math.cos((25 / 2) * t));
259
+ function starFn(phase, _elapsed, _params) {
260
+ const r = Math.abs(Math.cos(5 / 2 * phase)) + 0.35 * Math.abs(Math.cos(15 / 2 * phase)) + 0.15 * Math.abs(Math.cos(25 / 2 * phase));
271
261
  return {
272
- x: r * Math.cos(t),
273
- y: r * Math.sin(t),
262
+ x: r * Math.cos(phase),
263
+ y: r * Math.sin(phase)
274
264
  };
275
265
  }
276
266
  var star = {
277
267
  name: "Star",
278
268
  fn: starFn,
279
269
  period: TWO_PI10,
280
- speed: 1,
270
+ speed: 1
281
271
  };
282
272
 
283
273
  // src/curves/star4.ts
284
274
  var TWO_PI11 = Math.PI * 2;
285
- function star4Fn(t, _time, _params) {
286
- const r =
287
- Math.abs(Math.cos(2 * t)) +
288
- 0.35 * Math.abs(Math.cos(6 * t)) +
289
- 0.15 * Math.abs(Math.cos(10 * t));
275
+ function star4Fn(phase, _elapsed, _params) {
276
+ const r = Math.abs(Math.cos(2 * phase)) + 0.35 * Math.abs(Math.cos(6 * phase)) + 0.15 * Math.abs(Math.cos(10 * phase));
290
277
  return {
291
- x: r * Math.cos(t),
292
- y: r * Math.sin(t),
278
+ x: r * Math.cos(phase),
279
+ y: r * Math.sin(phase)
293
280
  };
294
281
  }
295
282
  var star4 = {
296
283
  name: "Star (4-arm)",
297
284
  fn: star4Fn,
298
285
  period: TWO_PI11,
299
- speed: 1,
286
+ speed: 1
300
287
  };
301
288
 
302
289
  // src/curves/star7.ts
303
290
  var TWO_PI12 = Math.PI * 2;
304
- function star7Fn(t, _time, _params) {
305
- const r =
306
- Math.abs(Math.cos((7 / 2) * t)) +
307
- 0.35 * Math.abs(Math.cos((21 / 2) * t)) +
308
- 0.15 * Math.abs(Math.cos((35 / 2) * t));
291
+ function star7Fn(phase, _elapsed, _params) {
292
+ const r = Math.abs(Math.cos(7 / 2 * phase)) + 0.35 * Math.abs(Math.cos(21 / 2 * phase)) + 0.15 * Math.abs(Math.cos(35 / 2 * phase));
309
293
  return {
310
- x: r * Math.cos(t),
311
- y: r * Math.sin(t),
294
+ x: r * Math.cos(phase),
295
+ y: r * Math.sin(phase)
312
296
  };
313
297
  }
314
298
  var star7 = {
315
299
  name: "Star (7-arm)",
316
300
  fn: star7Fn,
317
301
  period: TWO_PI12,
318
- speed: 1,
302
+ speed: 1
319
303
  };
320
304
 
321
305
  // src/curves/index.ts
@@ -333,25 +317,9 @@ var curves = {
333
317
  lissajous32,
334
318
  lissajous43,
335
319
  epicycloid3,
336
- lame,
320
+ lame
337
321
  };
338
322
 
339
- export {
340
- artemis2,
341
- astroid,
342
- curves,
343
- deltoid,
344
- epicycloid3,
345
- epitrochoid7,
346
- lame,
347
- lissajous32,
348
- lissajous43,
349
- rose3,
350
- rose5,
351
- rose52,
352
- star,
353
- star4,
354
- star7,
355
- };
356
- //# sourceMappingURL=index.js.map
323
+ export { artemis2, astroid, curves, deltoid, epicycloid3, epitrochoid7, lame, lissajous32, lissajous43, rose3, rose5, rose52, star, star4, star7 };
357
324
  //# sourceMappingURL=index.js.map
325
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/catmull-rom.ts","../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/rose52.ts","../../src/curves/star.ts","../../src/curves/star4.ts","../../src/curves/star7.ts","../../src/curves/index.ts"],"names":["points","TWO_PI"],"mappings":"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","file":"index.js","sourcesContent":["import type { ControlPoint, Point, CurveDef } from \"./types\";\n\n/**\n * One full loop around the spline maps to the parametric interval `[0, 2π)`,\n * matching the convention for built-in curves.\n */\nconst PERIOD = 2 * Math.PI;\n\n/**\n * Evaluates a one-dimensional Catmull-Rom spline segment given four control values.\n * The parameter `u` ranges from 0 (at `p1`) to 1 (at `p2`).\n * `p0` and `p3` are the phantom neighbours that influence the tangent at each endpoint.\n */\nfunction catmullRom1D(p0: number, p1: number, p2: number, p3: number, u: number): number {\n const u2 = u * u;\n const u3 = u2 * u;\n\n // The standard Catmull-Rom matrix form\n return (\n 0.5 *\n (2 * p1 +\n (-p0 + p2) * u +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * u3)\n );\n}\n\n/**\n * Evaluates a closed Catmull-Rom spline through every point in `points`\n *\n * The spline treats `points` as a **closed loop**\n * The last point wraps back to the first,\n * and each segment uses a phantom predecessor / successor so the\n * curve passes exactly through every control point.\n *\n * @param points At least 1 point. An empty array yields `(0, 0)`. A single point returns that point for every `t`\n * @param t Parametric position along the closed loop. Wraps into `[0, 2π)` automatically, so values outside that range are remapped rather than rejected\n * @returns The `(x, y)` position on the spline at time `t`\n */\nexport function evaluateCatmullRom(points: Array<ControlPoint>, t: number): Point {\n const N = points.length;\n\n if (N === 0) {\n return { x: 0, y: 0 };\n }\n\n if (N === 1) {\n return { x: points[0]![0], y: points[0]![1] };\n }\n\n t = ((t % PERIOD) + PERIOD) % PERIOD;\n\n const segmentSize = PERIOD / N;\n let i = Math.floor(t / segmentSize);\n if (i >= N) {\n i = N - 1;\n }\n\n let u = (t - i * segmentSize) / segmentSize;\n u = Math.max(0, Math.min(1, u));\n\n const p0 = points[(i - 1 + N) % N]!;\n const p1 = points[i]!;\n const p2 = points[(i + 1) % N]!;\n const p3 = points[(i + 2) % N]!;\n\n return {\n x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),\n y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),\n };\n}\n\n/**\n * The returned curve definition produces a closed Catmull-Rom spline that\n * passes through every point in order, looping back from the last point to the first.\n *\n * @param points Array of control points in **normalized `[−1, 1]` space**,\n * matching the playground's draw-mode coordinate system.\n * ! Must contain at least 3 points.\n * @param opts Optional overrides for the returned `CurveDef`.\n * @param opts.name Display name for the curve. Defaults to `\"drawn\"`.\n * @returns A `CurveDef` with `period: 2π` and the spline evaluator as its `fn`.\n * @throws If `points` has fewer than 3 entries.\n *\n * @example\n * ```ts\n * import { createSarmal, drawCurve } from '@sarmal/core'\n *\n * const curve = drawCurve([\n * [-0.5, 0.3],\n * [ 0.2, -0.8],\n * [ 0.7, 0.4],\n * ])\n *\n * createSarmal(canvas, curve)\n * ```\n */\nexport function drawCurve(points: Array<ControlPoint>, opts?: { name?: string }): CurveDef {\n if (points.length < 3) {\n throw new Error(`drawCurve requires at least 3 points, received ${points.length}.`);\n }\n\n const first = points[0]!;\n if (points.every((p) => p[0] === first[0] && p[1] === first[1])) {\n console.warn(\n \"[sarmal].drawCurve: all control points are identical. The curve will be a single point.\",\n );\n }\n\n const maxAbs = points.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);\n if (maxAbs > 2) {\n console.warn(\n `[sarmal].drawCurve: control points extend to ±${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,\n );\n }\n\n const pts = points.map(([x, y]) => [x, y] as ControlPoint);\n\n return {\n name: opts?.name ?? \"drawn\",\n fn: (t: number) => evaluateCatmullRom(pts, t),\n period: PERIOD,\n };\n}\n","import type { ControlPoint, CurveDef } from \"../types\";\n\nimport { drawCurve } from \"../catmull-rom\";\n\nconst points: Array<ControlPoint> = [\n [-0.44, -0.45],\n [-0.53, -0.77],\n [-0.82, -0.66],\n [-0.82, -0.18],\n [-0.25, -0.04],\n [0.16, -0.49],\n [-0.03, -0.87],\n [-0.68, -0.94],\n [-0.95, -0.61],\n [-0.87, -0.0],\n [-0.34, 0.21],\n [0.27, -0.04],\n [0.87, 0.06],\n [0.87, 0.57],\n [0.32, 0.66],\n [-0.21, -0.43],\n [-0.43, -0.81],\n [-0.69, -0.84],\n [-0.87, -0.66],\n [-0.9, -0.47],\n [-0.76, -0.35],\n];\n\nexport const artemis2: CurveDef = {\n ...drawCurve(points, { name: \"Artemis II\" }),\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(t: number, _time: number, _params: Record<string, number>) {\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(t) + Math.cos(2 * t),\n y: 2 * Math.sin(t) - Math.sin(2 * t),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(t) - Math.cos(4 * t),\n y: 4 * Math.sin(t) - Math.sin(4 * t),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(t: number, _time: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(t * 0.5);\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\nfunction epitrochoid7SkeletonFn(t: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.45;\n return {\n x: Math.sin(3 * t + phi),\n y: Math.sin(2 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.38;\n return {\n x: Math.sin(4 * t + phi),\n y: Math.sin(3 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(3 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(5 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst FOUR_PI = Math.PI * 4;\n\nfunction rose52Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos((5 / 2) * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with n=5/2 that traces 5 petals over two full revolutions\n * The head passes through the center between petals, creating elegant crossing trails.\n */\nexport const rose52: CurveDef = {\n name: \"Rose (n=5/2)\",\n fn: rose52Fn,\n period: FOUR_PI,\n speed: 0.8,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction starFn(t: number, _time: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos((5 / 2) * t)) +\n 0.35 * Math.abs(Math.cos((15 / 2) * t)) +\n 0.15 * Math.abs(Math.cos((25 / 2) * t));\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * 5-pointed star based on Fourier harmonics.\n */\nexport const star: CurveDef = {\n name: \"Star\",\n fn: starFn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction star4Fn(t: number, _time: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos(2 * t)) +\n 0.35 * Math.abs(Math.cos(6 * t)) +\n 0.15 * Math.abs(Math.cos(10 * t));\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * 4-pointed star based on Fourier harmonics.\n * Same construction as `star` but with base frequency `2t`, producing 4 tips.\n */\nexport const star4: CurveDef = {\n name: \"Star (4-arm)\",\n fn: star4Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction star7Fn(t: number, _time: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos((7 / 2) * t)) +\n 0.35 * Math.abs(Math.cos((21 / 2) * t)) +\n 0.15 * Math.abs(Math.cos((35 / 2) * t));\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * 7-pointed star based on Fourier harmonics.\n * Same construction as `star` but with base frequency `7t/2`, producing 7 tips.\n */\nexport const star7: CurveDef = {\n name: \"Star (7-arm)\",\n fn: star7Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\nexport { rose52 } from \"./rose52\";\nexport { star } from \"./star\";\nexport { star4 } from \"./star4\";\nexport { star7 } from \"./star7\";\n\n// Bulk export for convenience\n// >> Standard\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\nimport { rose52 } from \"./rose52\";\nimport { star } from \"./star\";\nimport { star4 } from \"./star4\";\nimport { star7 } from \"./star7\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\n// >> Iconic\nimport { artemis2 } from \"./artemis2\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose3,\n rose5,\n rose52,\n star,\n star4,\n star7,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n} as const;\nexport type CurveName = keyof typeof curves;\n"]}
1
+ {"version":3,"sources":["../../src/catmull-rom.ts","../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/rose52.ts","../../src/curves/star.ts","../../src/curves/star4.ts","../../src/curves/star7.ts","../../src/curves/index.ts"],"names":["points","TWO_PI"],"mappings":"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","file":"index.js","sourcesContent":["import type { ControlPoint, Point, CurveDef } from \"./types\";\n\n/**\n * One full loop around the spline maps to the parametric interval `[0, 2π)`,\n * matching the convention for built-in curves.\n */\nconst PERIOD = 2 * Math.PI;\n\n/**\n * Evaluates a one-dimensional Catmull-Rom spline segment given four control values.\n * The parameter `u` ranges from 0 (at `p1`) to 1 (at `p2`).\n * `p0` and `p3` are the phantom neighbours that influence the tangent at each endpoint.\n */\nfunction catmullRom1D(p0: number, p1: number, p2: number, p3: number, u: number): number {\n const u2 = u * u;\n const u3 = u2 * u;\n\n // The standard Catmull-Rom matrix form\n return (\n 0.5 *\n (2 * p1 +\n (-p0 + p2) * u +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * u3)\n );\n}\n\n/**\n * Evaluates a closed Catmull-Rom spline through every point in `points`\n *\n * The spline treats `points` as a **closed loop**\n * The last point wraps back to the first,\n * and each segment uses a phantom predecessor / successor so the\n * curve passes exactly through every control point.\n *\n * @param points At least 1 point. An empty array yields `(0, 0)`. A single point returns that point for every `phase`\n * @param phase Parametric position along the closed loop. Wraps into `[0, 2π)` automatically, so values outside that range are remapped rather than rejected\n * @returns The `(x, y)` position on the spline at position `phase`\n */\nexport function evaluateCatmullRom(points: Array<ControlPoint>, phase: number): Point {\n const N = points.length;\n\n if (N === 0) {\n return { x: 0, y: 0 };\n }\n\n if (N === 1) {\n return { x: points[0]![0], y: points[0]![1] };\n }\n\n phase = ((phase % PERIOD) + PERIOD) % PERIOD;\n\n const segmentSize = PERIOD / N;\n let i = Math.floor(phase / segmentSize);\n if (i >= N) {\n i = N - 1;\n }\n\n let u = (phase - i * segmentSize) / segmentSize;\n u = Math.max(0, Math.min(1, u));\n\n const p0 = points[(i - 1 + N) % N]!;\n const p1 = points[i]!;\n const p2 = points[(i + 1) % N]!;\n const p3 = points[(i + 2) % N]!;\n\n return {\n x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),\n y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),\n };\n}\n\n/**\n * The returned curve definition produces a closed Catmull-Rom spline that\n * passes through every point in order, looping back from the last point to the first.\n *\n * @param points Array of control points in **normalized `[−1, 1]` space**,\n * matching the playground's draw-mode coordinate system.\n * ! Must contain at least 3 points.\n * @param opts Optional overrides for the returned `CurveDef`.\n * @param opts.name Display name for the curve. Defaults to `\"drawn\"`.\n * @returns A `CurveDef` with `period: 2π` and the spline evaluator as its `fn`.\n * @throws If `points` has fewer than 3 entries.\n *\n * @example\n * ```ts\n * import { createSarmal, drawCurve } from '@sarmal/core'\n *\n * const curve = drawCurve([\n * [-0.5, 0.3],\n * [ 0.2, -0.8],\n * [ 0.7, 0.4],\n * ])\n *\n * createSarmal(canvas, curve)\n * ```\n */\nexport function drawCurve(points: Array<ControlPoint>, opts?: { name?: string }): CurveDef {\n if (points.length < 3) {\n throw new Error(`drawCurve requires at least 3 points, received ${points.length}.`);\n }\n\n const first = points[0]!;\n if (points.every((p) => p[0] === first[0] && p[1] === first[1])) {\n console.warn(\n \"[sarmal].drawCurve: all control points are identical. The curve will be a single point.\",\n );\n }\n\n const maxAbs = points.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);\n if (maxAbs > 2) {\n console.warn(\n `[sarmal].drawCurve: control points extend to ±${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,\n );\n }\n\n const pts = points.map(([x, y]) => [x, y] as ControlPoint);\n\n return {\n name: opts?.name ?? \"drawn\",\n fn: (phase: number) => evaluateCatmullRom(pts, phase),\n period: PERIOD,\n };\n}\n","import type { ControlPoint, CurveDef } from \"../types\";\n\nimport { drawCurve } from \"../catmull-rom\";\n\nconst points: Array<ControlPoint> = [\n [-0.44, -0.45],\n [-0.53, -0.77],\n [-0.82, -0.66],\n [-0.82, -0.18],\n [-0.25, -0.04],\n [0.16, -0.49],\n [-0.03, -0.87],\n [-0.68, -0.94],\n [-0.95, -0.61],\n [-0.87, -0.0],\n [-0.34, 0.21],\n [0.27, -0.04],\n [0.87, 0.06],\n [0.87, 0.57],\n [0.32, 0.66],\n [-0.21, -0.43],\n [-0.43, -0.81],\n [-0.69, -0.84],\n [-0.87, -0.66],\n [-0.9, -0.47],\n [-0.76, -0.35],\n];\n\nexport const artemis2: CurveDef = {\n ...drawCurve(points, { name: \"Artemis II\" }),\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const c = Math.cos(phase);\n const s = Math.sin(phase);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(phase: number, _elapsed: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(phase) + Math.cos(2 * phase),\n y: 2 * Math.sin(phase) - Math.sin(2 * phase),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(phase) - Math.cos(4 * phase),\n y: 4 * Math.sin(phase) - Math.sin(4 * phase),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(phase * 0.5);\n return {\n x: 7 * Math.cos(phase) - d * Math.cos(7 * phase),\n y: 7 * Math.sin(phase) - d * Math.sin(7 * phase),\n };\n}\n\nfunction epitrochoid7SkeletonFn(phase: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(phase) - d * Math.cos(7 * phase),\n y: 7 * Math.sin(phase) - d * Math.sin(7 * phase),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(phase: number, elapsed: number, _params: Record<string, number>) {\n const phi = elapsed * 0.45;\n return {\n x: Math.sin(3 * phase + phi),\n y: Math.sin(2 * phase),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(phase: number, elapsed: number, _params: Record<string, number>) {\n const phi = elapsed * 0.38;\n return {\n x: Math.sin(4 * phase + phi),\n y: Math.sin(3 * phase),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(phase: number, elapsed: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(elapsed * 0.48);\n const c = Math.cos(phase),\n s = Math.sin(phase);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r = Math.cos(3 * phase);\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r = Math.cos(5 * phase);\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst FOUR_PI = Math.PI * 4;\n\nfunction rose52Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r = Math.cos((5 / 2) * phase);\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * Rose curve with n=5/2 that traces 5 petals over two full revolutions\n * The head passes through the center between petals, creating elegant crossing trails.\n */\nexport const rose52: CurveDef = {\n name: \"Rose (n=5/2)\",\n fn: rose52Fn,\n period: FOUR_PI,\n speed: 0.8,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction starFn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos((5 / 2) * phase)) +\n 0.35 * Math.abs(Math.cos((15 / 2) * phase)) +\n 0.15 * Math.abs(Math.cos((25 / 2) * phase));\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * 5-pointed star based on Fourier harmonics.\n */\nexport const star: CurveDef = {\n name: \"Star\",\n fn: starFn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction star4Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos(2 * phase)) +\n 0.35 * Math.abs(Math.cos(6 * phase)) +\n 0.15 * Math.abs(Math.cos(10 * phase));\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * 4-pointed star based on Fourier harmonics.\n * Same construction as `star` but with base frequency `2*phase`, producing 4 tips.\n */\nexport const star4: CurveDef = {\n name: \"Star (4-arm)\",\n fn: star4Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction star7Fn(phase: number, _elapsed: number, _params: Record<string, number>) {\n const r =\n Math.abs(Math.cos((7 / 2) * phase)) +\n 0.35 * Math.abs(Math.cos((21 / 2) * phase)) +\n 0.15 * Math.abs(Math.cos((35 / 2) * phase));\n return {\n x: r * Math.cos(phase),\n y: r * Math.sin(phase),\n };\n}\n\n/**\n * 7-pointed star based on Fourier harmonics.\n * Same construction as `star` but with base frequency `7*phase/2`, producing 7 tips.\n */\nexport const star7: CurveDef = {\n name: \"Star (7-arm)\",\n fn: star7Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\nexport { rose52 } from \"./rose52\";\nexport { star } from \"./star\";\nexport { star4 } from \"./star4\";\nexport { star7 } from \"./star7\";\n\n// Bulk export for convenience\n// >> Standard\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\nimport { rose52 } from \"./rose52\";\nimport { star } from \"./star\";\nimport { star4 } from \"./star4\";\nimport { star7 } from \"./star7\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\n// >> Iconic\nimport { artemis2 } from \"./artemis2\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose3,\n rose5,\n rose52,\n star,\n star4,\n star7,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n} as const;\nexport type CurveName = keyof typeof curves;\n"]}
@@ -1,14 +1,13 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
3
  // src/curves/lame.ts
4
4
  var TWO_PI = Math.PI * 2;
5
- function lameFn(t, time, _params) {
6
- const p = 1.75 + 1.25 * Math.sin(time * 0.48);
7
- const c = Math.cos(t),
8
- s = Math.sin(t);
5
+ function lameFn(phase, elapsed, _params) {
6
+ const p = 1.75 + 1.25 * Math.sin(elapsed * 0.48);
7
+ const c = Math.cos(phase), s = Math.sin(phase);
9
8
  return {
10
9
  x: Math.sign(c) * Math.pow(Math.abs(c), p),
11
- y: Math.sign(s) * Math.pow(Math.abs(s), p),
10
+ y: Math.sign(s) * Math.pow(Math.abs(s), p)
12
11
  };
13
12
  }
14
13
  var lame = {
@@ -16,9 +15,9 @@ var lame = {
16
15
  fn: lameFn,
17
16
  period: TWO_PI,
18
17
  speed: 1,
19
- skeleton: "live",
18
+ skeleton: "live"
20
19
  };
21
20
 
22
21
  exports.lame = lame;
23
22
  //# sourceMappingURL=lame.cjs.map
24
- //# sourceMappingURL=lame.cjs.map
23
+ //# sourceMappingURL=lame.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/lame.ts"],"names":[],"mappings":";;;AAEA,IAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,MAAA,CAAO,CAAA,EAAW,IAAA,EAAc,OAAA,EAAiC;AACxE,EAAA,MAAM,IAAI,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAClB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAChB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACzC,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC;AAAA,GAC3C;AACF;AAMO,IAAM,IAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,eAAA;AAAA,EACN,EAAA,EAAI,MAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU;AACZ","file":"lame.cjs","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n"]}
1
+ {"version":3,"sources":["../../src/curves/lame.ts"],"names":[],"mappings":";;;AAEA,IAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,MAAA,CAAO,KAAA,EAAe,OAAA,EAAiB,OAAA,EAAiC;AAC/E,EAAA,MAAM,IAAI,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAU,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,KAAK,GACtB,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AACpB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACzC,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC;AAAA,GAC3C;AACF;AAMO,IAAM,IAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,eAAA;AAAA,EACN,EAAA,EAAI,MAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU;AACZ","file":"lame.cjs","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(phase: number, elapsed: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(elapsed * 0.48);\n const c = Math.cos(phase),\n s = Math.sin(phase);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
1
+ import { C as CurveDef } from '../types-zbxUgcmZ.cjs';
2
2
 
3
3
  /**
4
4
  * Lamé curve (superellipse) with time-varying exponent
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from "../types-Z9i1_AQZ.js";
1
+ import { C as CurveDef } from '../types-zbxUgcmZ.js';
2
2
 
3
3
  /**
4
4
  * Lamé curve (superellipse) with time-varying exponent