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