@sarmal/core 0.24.0 → 0.25.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 (51) hide show
  1. package/dist/auto-init.cjs +113 -44
  2. package/dist/auto-init.cjs.map +1 -1
  3. package/dist/auto-init.js +113 -44
  4. package/dist/auto-init.js.map +1 -1
  5. package/dist/curves/artemis2.cjs +79 -11
  6. package/dist/curves/artemis2.cjs.map +1 -1
  7. package/dist/curves/artemis2.d.cts +1 -5
  8. package/dist/curves/artemis2.d.ts +1 -5
  9. package/dist/curves/artemis2.js +79 -11
  10. package/dist/curves/artemis2.js.map +1 -1
  11. package/dist/curves/astroid.d.cts +1 -1
  12. package/dist/curves/astroid.d.ts +1 -1
  13. package/dist/curves/deltoid.d.cts +1 -1
  14. package/dist/curves/deltoid.d.ts +1 -1
  15. package/dist/curves/epicycloid3.d.cts +1 -1
  16. package/dist/curves/epicycloid3.d.ts +1 -1
  17. package/dist/curves/epitrochoid7.d.cts +1 -1
  18. package/dist/curves/epitrochoid7.d.ts +1 -1
  19. package/dist/curves/index.cjs +103 -35
  20. package/dist/curves/index.cjs.map +1 -1
  21. package/dist/curves/index.d.cts +1 -1
  22. package/dist/curves/index.d.ts +1 -1
  23. package/dist/curves/index.js +103 -35
  24. package/dist/curves/index.js.map +1 -1
  25. package/dist/curves/lame.d.cts +1 -1
  26. package/dist/curves/lame.d.ts +1 -1
  27. package/dist/curves/lissajous32.d.cts +1 -1
  28. package/dist/curves/lissajous32.d.ts +1 -1
  29. package/dist/curves/lissajous43.d.cts +1 -1
  30. package/dist/curves/lissajous43.d.ts +1 -1
  31. package/dist/curves/rose3.d.cts +1 -1
  32. package/dist/curves/rose3.d.ts +1 -1
  33. package/dist/curves/rose5.d.cts +1 -1
  34. package/dist/curves/rose5.d.ts +1 -1
  35. package/dist/curves/rose52.d.cts +1 -1
  36. package/dist/curves/rose52.d.ts +1 -1
  37. package/dist/curves/star.d.cts +1 -1
  38. package/dist/curves/star.d.ts +1 -1
  39. package/dist/curves/star4.d.cts +1 -1
  40. package/dist/curves/star4.d.ts +1 -1
  41. package/dist/curves/star7.d.cts +1 -1
  42. package/dist/curves/star7.d.ts +1 -1
  43. package/dist/index.cjs +114 -87
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +25 -7
  46. package/dist/index.d.ts +25 -7
  47. package/dist/index.js +114 -88
  48. package/dist/index.js.map +1 -1
  49. package/dist/{types-CknrlCAf.d.cts → types-BZpzgNau.d.cts} +19 -1
  50. package/dist/{types-CknrlCAf.d.ts → types-BZpzgNau.d.ts} +19 -1
  51. package/package.json +1 -1
package/dist/auto-init.js CHANGED
@@ -196,25 +196,25 @@ function createEngine(curveDef, trailLength = 120) {
196
196
  },
197
197
  getSarmalSkeleton() {
198
198
  const steps = Math.ceil(curve.period * POINTS_PER_PERIOD_UNIT);
199
- const points = new Array(steps);
199
+ const points2 = new Array(steps);
200
200
  if (morphCurveB !== null && _morphAlpha !== null) {
201
201
  for (let i = 0; i < steps; i++) {
202
202
  const sampleT = i / (steps - 1) * curve.period;
203
203
  const a = sampleSkeleton(curve, sampleT);
204
204
  const tB = _morphStrategy === "normalized" ? sampleT / curve.period * morphCurveB.period : sampleT;
205
205
  const b = sampleSkeleton(morphCurveB, tB);
206
- points[i] = {
206
+ points2[i] = {
207
207
  x: a.x + (b.x - a.x) * _morphAlpha,
208
208
  y: a.y + (b.y - a.y) * _morphAlpha
209
209
  };
210
210
  }
211
- return points;
211
+ return points2;
212
212
  }
213
213
  for (let i = 0; i < steps; i++) {
214
214
  const sampleT = i / (steps - 1) * curve.period;
215
- points[i] = sampleSkeleton(curve, sampleT);
215
+ points2[i] = sampleSkeleton(curve, sampleT);
216
216
  }
217
- return points;
217
+ return points2;
218
218
  },
219
219
  setSpeed(speed) {
220
220
  if (!Number.isFinite(speed)) {
@@ -319,7 +319,7 @@ function computeTrailQuad(trail, i, trailCount, toX, toY, minWidth = TRAIL_MIN_W
319
319
  progress
320
320
  };
321
321
  }
322
- function computeBoundaries(pts, logicalWidth, logicalHeight) {
322
+ function computeBoundaries(pts, logicalWidth, logicalHeight, minPaddingPx = FIT_PADDING_MIN) {
323
323
  if (pts.length === 0) return null;
324
324
  const first = pts[0];
325
325
  let minX = first.x, maxX = first.x, minY = first.y, maxY = first.y;
@@ -346,8 +346,8 @@ function computeBoundaries(pts, logicalWidth, logicalHeight) {
346
346
  }
347
347
  const scaleXProportional = logicalWidth / (w * (1 + FIT_PADDING * 2));
348
348
  const scaleYProportional = logicalHeight / (h * (1 + FIT_PADDING * 2));
349
- const scaleXMinPadding = (logicalWidth - FIT_PADDING_MIN * 2) / w;
350
- const scaleYMinPadding = (logicalHeight - FIT_PADDING_MIN * 2) / h;
349
+ const scaleXMinPadding = (logicalWidth - minPaddingPx * 2) / w;
350
+ const scaleYMinPadding = (logicalHeight - minPaddingPx * 2) / h;
351
351
  const scale = Math.min(
352
352
  scaleXProportional,
353
353
  scaleYProportional,
@@ -367,7 +367,8 @@ function enginePassthroughs(engine) {
367
367
  setSpeed: engine.setSpeed,
368
368
  getSpeed: engine.getSpeed,
369
369
  resetSpeed: engine.resetSpeed,
370
- setSpeedOver: engine.setSpeedOver
370
+ setSpeedOver: engine.setSpeedOver,
371
+ getSarmalSkeleton: engine.getSarmalSkeleton
371
372
  };
372
373
  }
373
374
  function hexToRgb(hex) {
@@ -1224,26 +1225,94 @@ function createSarmalSVG(container, curveDef, options) {
1224
1225
  return createSVGRenderer({ container, engine, ...rendererOpts });
1225
1226
  }
1226
1227
 
1227
- // src/curves/artemis2.ts
1228
- var TWO_PI2 = Math.PI * 2;
1229
- function artemis2Fn(t, _time, _params) {
1230
- const a = 0.35, b = 0.15, ox = 0.175;
1231
- const s = Math.sin(t), c = Math.cos(t);
1232
- const denom = 1 + s * s;
1228
+ // src/catmull-rom.ts
1229
+ var PERIOD = 2 * Math.PI;
1230
+ function catmullRom1D(p0, p1, p2, p3, u) {
1231
+ const u2 = u * u;
1232
+ const u3 = u2 * u;
1233
+ return 0.5 * (2 * p1 + (-p0 + p2) * u + (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 + (-p0 + 3 * p1 - 3 * p2 + p3) * u3);
1234
+ }
1235
+ function evaluateCatmullRom(points2, t) {
1236
+ const N = points2.length;
1237
+ if (N === 0) {
1238
+ return { x: 0, y: 0 };
1239
+ }
1240
+ if (N === 1) {
1241
+ return { x: points2[0][0], y: points2[0][1] };
1242
+ }
1243
+ t = (t % PERIOD + PERIOD) % PERIOD;
1244
+ const segmentSize = PERIOD / N;
1245
+ let i = Math.floor(t / segmentSize);
1246
+ if (i >= N) {
1247
+ i = N - 1;
1248
+ }
1249
+ let u = (t - i * segmentSize) / segmentSize;
1250
+ u = Math.max(0, Math.min(1, u));
1251
+ const p0 = points2[(i - 1 + N) % N];
1252
+ const p1 = points2[i];
1253
+ const p2 = points2[(i + 1) % N];
1254
+ const p3 = points2[(i + 2) % N];
1255
+ return {
1256
+ x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),
1257
+ y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u)
1258
+ };
1259
+ }
1260
+ function drawCurve(points2, opts) {
1261
+ if (points2.length < 3) {
1262
+ throw new Error(`drawCurve requires at least 3 points, received ${points2.length}.`);
1263
+ }
1264
+ const first = points2[0];
1265
+ if (points2.every((p) => p[0] === first[0] && p[1] === first[1])) {
1266
+ console.warn(
1267
+ "[sarmal].drawCurve: all control points are identical. The curve will be a single point."
1268
+ );
1269
+ }
1270
+ const maxAbs = points2.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);
1271
+ if (maxAbs > 2) {
1272
+ console.warn(
1273
+ `[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`
1274
+ );
1275
+ }
1276
+ const pts = points2.map(([x, y]) => [x, y]);
1233
1277
  return {
1234
- x: c * (1 + a * c) / denom - ox,
1235
- y: s * c * (1 + b * c) / denom
1278
+ name: opts?.name ?? "drawn",
1279
+ fn: (t) => evaluateCatmullRom(pts, t),
1280
+ period: PERIOD,
1281
+ kind: "drawn"
1236
1282
  };
1237
1283
  }
1284
+
1285
+ // src/curves/artemis2.ts
1286
+ var points = [
1287
+ [-0.44, -0.45],
1288
+ [-0.53, -0.77],
1289
+ [-0.82, -0.66],
1290
+ [-0.82, -0.18],
1291
+ [-0.25, -0.04],
1292
+ [0.16, -0.49],
1293
+ [-0.03, -0.87],
1294
+ [-0.68, -0.94],
1295
+ [-0.95, -0.61],
1296
+ [-0.87, -0],
1297
+ [-0.34, 0.21],
1298
+ [0.27, -0.04],
1299
+ [0.87, 0.06],
1300
+ [0.87, 0.57],
1301
+ [0.32, 0.66],
1302
+ [-0.21, -0.43],
1303
+ [-0.43, -0.81],
1304
+ [-0.69, -0.84],
1305
+ [-0.87, -0.66],
1306
+ [-0.9, -0.47],
1307
+ [-0.76, -0.35]
1308
+ ];
1238
1309
  var artemis2 = {
1239
- name: "Artemis II",
1240
- fn: artemis2Fn,
1241
- period: TWO_PI2,
1310
+ ...drawCurve(points, { name: "Artemis II" }),
1242
1311
  speed: 0.7
1243
1312
  };
1244
1313
 
1245
1314
  // src/curves/astroid.ts
1246
- var TWO_PI3 = Math.PI * 2;
1315
+ var TWO_PI2 = Math.PI * 2;
1247
1316
  function astroidFn(t, _time, _params) {
1248
1317
  const c = Math.cos(t);
1249
1318
  const s = Math.sin(t);
@@ -1255,12 +1324,12 @@ function astroidFn(t, _time, _params) {
1255
1324
  var astroid = {
1256
1325
  name: "Astroid",
1257
1326
  fn: astroidFn,
1258
- period: TWO_PI3,
1327
+ period: TWO_PI2,
1259
1328
  speed: 1.1
1260
1329
  };
1261
1330
 
1262
1331
  // src/curves/deltoid.ts
1263
- var TWO_PI4 = Math.PI * 2;
1332
+ var TWO_PI3 = Math.PI * 2;
1264
1333
  function deltoidFn(t, _time, _params) {
1265
1334
  return {
1266
1335
  x: 2 * Math.cos(t) + Math.cos(2 * t),
@@ -1270,12 +1339,12 @@ function deltoidFn(t, _time, _params) {
1270
1339
  var deltoid = {
1271
1340
  name: "Deltoid",
1272
1341
  fn: deltoidFn,
1273
- period: TWO_PI4,
1342
+ period: TWO_PI3,
1274
1343
  speed: 0.9
1275
1344
  };
1276
1345
 
1277
1346
  // src/curves/epicycloid3.ts
1278
- var TWO_PI5 = Math.PI * 2;
1347
+ var TWO_PI4 = Math.PI * 2;
1279
1348
  function epicycloid3Fn(t, _time, _params) {
1280
1349
  return {
1281
1350
  x: 4 * Math.cos(t) - Math.cos(4 * t),
@@ -1285,12 +1354,12 @@ function epicycloid3Fn(t, _time, _params) {
1285
1354
  var epicycloid3 = {
1286
1355
  name: "Epicycloid (n=3)",
1287
1356
  fn: epicycloid3Fn,
1288
- period: TWO_PI5,
1357
+ period: TWO_PI4,
1289
1358
  speed: 0.75
1290
1359
  };
1291
1360
 
1292
1361
  // src/curves/epitrochoid7.ts
1293
- var TWO_PI6 = Math.PI * 2;
1362
+ var TWO_PI5 = Math.PI * 2;
1294
1363
  function epitrochoid7Fn(t, _time, _params) {
1295
1364
  const d = 1 + 0.55 * Math.sin(t * 0.5);
1296
1365
  return {
@@ -1308,13 +1377,13 @@ function epitrochoid7SkeletonFn(t) {
1308
1377
  var epitrochoid7 = {
1309
1378
  name: "Epitrochoid",
1310
1379
  fn: epitrochoid7Fn,
1311
- period: TWO_PI6,
1380
+ period: TWO_PI5,
1312
1381
  speed: 1.4,
1313
1382
  skeletonFn: epitrochoid7SkeletonFn
1314
1383
  };
1315
1384
 
1316
1385
  // src/curves/lissajous32.ts
1317
- var TWO_PI7 = Math.PI * 2;
1386
+ var TWO_PI6 = Math.PI * 2;
1318
1387
  function lissajous32Fn(t, time, _params) {
1319
1388
  const phi = time * 0.45;
1320
1389
  return {
@@ -1325,13 +1394,13 @@ function lissajous32Fn(t, time, _params) {
1325
1394
  var lissajous32 = {
1326
1395
  name: "Lissajous 3:2",
1327
1396
  fn: lissajous32Fn,
1328
- period: TWO_PI7,
1397
+ period: TWO_PI6,
1329
1398
  speed: 2,
1330
1399
  skeleton: "live"
1331
1400
  };
1332
1401
 
1333
1402
  // src/curves/lissajous43.ts
1334
- var TWO_PI8 = Math.PI * 2;
1403
+ var TWO_PI7 = Math.PI * 2;
1335
1404
  function lissajous43Fn(t, time, _params) {
1336
1405
  const phi = time * 0.38;
1337
1406
  return {
@@ -1342,13 +1411,13 @@ function lissajous43Fn(t, time, _params) {
1342
1411
  var lissajous43 = {
1343
1412
  name: "Lissajous 4:3",
1344
1413
  fn: lissajous43Fn,
1345
- period: TWO_PI8,
1414
+ period: TWO_PI7,
1346
1415
  speed: 1.8,
1347
1416
  skeleton: "live"
1348
1417
  };
1349
1418
 
1350
1419
  // src/curves/lame.ts
1351
- var TWO_PI9 = Math.PI * 2;
1420
+ var TWO_PI8 = Math.PI * 2;
1352
1421
  function lameFn(t, time, _params) {
1353
1422
  const p = 1.75 + 1.25 * Math.sin(time * 0.48);
1354
1423
  const c = Math.cos(t), s = Math.sin(t);
@@ -1360,13 +1429,13 @@ function lameFn(t, time, _params) {
1360
1429
  var lame = {
1361
1430
  name: "Lam\xE9 Curve",
1362
1431
  fn: lameFn,
1363
- period: TWO_PI9,
1432
+ period: TWO_PI8,
1364
1433
  speed: 1,
1365
1434
  skeleton: "live"
1366
1435
  };
1367
1436
 
1368
1437
  // src/curves/rose3.ts
1369
- var TWO_PI10 = Math.PI * 2;
1438
+ var TWO_PI9 = Math.PI * 2;
1370
1439
  function rose3Fn(t, _time, _params) {
1371
1440
  const r = Math.cos(3 * t);
1372
1441
  return {
@@ -1377,12 +1446,12 @@ function rose3Fn(t, _time, _params) {
1377
1446
  var rose3 = {
1378
1447
  name: "Rose (n=3)",
1379
1448
  fn: rose3Fn,
1380
- period: TWO_PI10,
1449
+ period: TWO_PI9,
1381
1450
  speed: 1.15
1382
1451
  };
1383
1452
 
1384
1453
  // src/curves/rose5.ts
1385
- var TWO_PI11 = Math.PI * 2;
1454
+ var TWO_PI10 = Math.PI * 2;
1386
1455
  function rose5Fn(t, _time, _params) {
1387
1456
  const r = Math.cos(5 * t);
1388
1457
  return {
@@ -1393,7 +1462,7 @@ function rose5Fn(t, _time, _params) {
1393
1462
  var rose5 = {
1394
1463
  name: "Rose (n=5)",
1395
1464
  fn: rose5Fn,
1396
- period: TWO_PI11,
1465
+ period: TWO_PI10,
1397
1466
  speed: 1
1398
1467
  };
1399
1468
 
@@ -1414,7 +1483,7 @@ var rose52 = {
1414
1483
  };
1415
1484
 
1416
1485
  // src/curves/star.ts
1417
- var TWO_PI12 = Math.PI * 2;
1486
+ var TWO_PI11 = Math.PI * 2;
1418
1487
  function starFn(t, _time, _params) {
1419
1488
  const r = Math.abs(Math.cos(5 / 2 * t)) + 0.35 * Math.abs(Math.cos(15 / 2 * t)) + 0.15 * Math.abs(Math.cos(25 / 2 * t));
1420
1489
  return {
@@ -1425,12 +1494,12 @@ function starFn(t, _time, _params) {
1425
1494
  var star = {
1426
1495
  name: "Star",
1427
1496
  fn: starFn,
1428
- period: TWO_PI12,
1497
+ period: TWO_PI11,
1429
1498
  speed: 1
1430
1499
  };
1431
1500
 
1432
1501
  // src/curves/star4.ts
1433
- var TWO_PI13 = Math.PI * 2;
1502
+ var TWO_PI12 = Math.PI * 2;
1434
1503
  function star4Fn(t, _time, _params) {
1435
1504
  const r = Math.abs(Math.cos(2 * t)) + 0.35 * Math.abs(Math.cos(6 * t)) + 0.15 * Math.abs(Math.cos(10 * t));
1436
1505
  return {
@@ -1441,12 +1510,12 @@ function star4Fn(t, _time, _params) {
1441
1510
  var star4 = {
1442
1511
  name: "Star (4-arm)",
1443
1512
  fn: star4Fn,
1444
- period: TWO_PI13,
1513
+ period: TWO_PI12,
1445
1514
  speed: 1
1446
1515
  };
1447
1516
 
1448
1517
  // src/curves/star7.ts
1449
- var TWO_PI14 = Math.PI * 2;
1518
+ var TWO_PI13 = Math.PI * 2;
1450
1519
  function star7Fn(t, _time, _params) {
1451
1520
  const r = Math.abs(Math.cos(7 / 2 * t)) + 0.35 * Math.abs(Math.cos(21 / 2 * t)) + 0.15 * Math.abs(Math.cos(35 / 2 * t));
1452
1521
  return {
@@ -1457,7 +1526,7 @@ function star7Fn(t, _time, _params) {
1457
1526
  var star7 = {
1458
1527
  name: "Star (7-arm)",
1459
1528
  fn: star7Fn,
1460
- period: TWO_PI14,
1529
+ period: TWO_PI13,
1461
1530
  speed: 1
1462
1531
  };
1463
1532