@sarmal/core 0.8.0 → 0.9.1

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 (81) hide show
  1. package/dist/auto-init.cjs +209 -103
  2. package/dist/auto-init.cjs.map +1 -1
  3. package/dist/auto-init.d.cts +1 -0
  4. package/dist/auto-init.d.ts +1 -0
  5. package/dist/auto-init.js +209 -103
  6. package/dist/auto-init.js.map +1 -1
  7. package/dist/curves/artemis2.cjs +26 -0
  8. package/dist/curves/artemis2.cjs.map +1 -0
  9. package/dist/curves/artemis2.d.cts +9 -0
  10. package/dist/curves/artemis2.d.ts +9 -0
  11. package/dist/curves/artemis2.js +24 -0
  12. package/dist/curves/artemis2.js.map +1 -0
  13. package/dist/curves/astroid.cjs +22 -0
  14. package/dist/curves/astroid.cjs.map +1 -0
  15. package/dist/curves/astroid.d.cts +9 -0
  16. package/dist/curves/astroid.d.ts +9 -0
  17. package/dist/curves/astroid.js +20 -0
  18. package/dist/curves/astroid.js.map +1 -0
  19. package/dist/curves/deltoid.cjs +20 -0
  20. package/dist/curves/deltoid.cjs.map +1 -0
  21. package/dist/curves/deltoid.d.cts +9 -0
  22. package/dist/curves/deltoid.d.ts +9 -0
  23. package/dist/curves/deltoid.js +18 -0
  24. package/dist/curves/deltoid.js.map +1 -0
  25. package/dist/curves/epicycloid3.cjs +20 -0
  26. package/dist/curves/epicycloid3.cjs.map +1 -0
  27. package/dist/curves/epicycloid3.d.cts +9 -0
  28. package/dist/curves/epicycloid3.d.ts +9 -0
  29. package/dist/curves/epicycloid3.js +18 -0
  30. package/dist/curves/epicycloid3.js.map +1 -0
  31. package/dist/curves/epitrochoid7.cjs +29 -0
  32. package/dist/curves/epitrochoid7.cjs.map +1 -0
  33. package/dist/curves/epitrochoid7.d.cts +9 -0
  34. package/dist/curves/epitrochoid7.d.ts +9 -0
  35. package/dist/curves/epitrochoid7.js +27 -0
  36. package/dist/curves/epitrochoid7.js.map +1 -0
  37. package/dist/curves/index.cjs +206 -0
  38. package/dist/curves/index.cjs.map +1 -0
  39. package/dist/curves/index.d.cts +19 -0
  40. package/dist/curves/index.d.ts +19 -0
  41. package/dist/curves/index.js +206 -0
  42. package/dist/curves/index.js.map +1 -0
  43. package/dist/curves/lame.cjs +24 -0
  44. package/dist/curves/lame.cjs.map +1 -0
  45. package/dist/curves/lame.d.cts +9 -0
  46. package/dist/curves/lame.d.ts +9 -0
  47. package/dist/curves/lame.js +22 -0
  48. package/dist/curves/lame.js.map +1 -0
  49. package/dist/curves/lissajous32.cjs +22 -0
  50. package/dist/curves/lissajous32.cjs.map +1 -0
  51. package/dist/curves/lissajous32.d.cts +9 -0
  52. package/dist/curves/lissajous32.d.ts +9 -0
  53. package/dist/curves/lissajous32.js +20 -0
  54. package/dist/curves/lissajous32.js.map +1 -0
  55. package/dist/curves/lissajous43.cjs +22 -0
  56. package/dist/curves/lissajous43.cjs.map +1 -0
  57. package/dist/curves/lissajous43.d.cts +9 -0
  58. package/dist/curves/lissajous43.d.ts +9 -0
  59. package/dist/curves/lissajous43.js +20 -0
  60. package/dist/curves/lissajous43.js.map +1 -0
  61. package/dist/curves/rose3.cjs +21 -0
  62. package/dist/curves/rose3.cjs.map +1 -0
  63. package/dist/curves/rose3.d.cts +9 -0
  64. package/dist/curves/rose3.d.ts +9 -0
  65. package/dist/curves/rose3.js +19 -0
  66. package/dist/curves/rose3.js.map +1 -0
  67. package/dist/curves/rose5.cjs +21 -0
  68. package/dist/curves/rose5.cjs.map +1 -0
  69. package/dist/curves/rose5.d.cts +9 -0
  70. package/dist/curves/rose5.d.ts +9 -0
  71. package/dist/curves/rose5.js +19 -0
  72. package/dist/curves/rose5.js.map +1 -0
  73. package/dist/index.cjs +214 -106
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +105 -0
  76. package/dist/index.d.ts +105 -0
  77. package/dist/index.js +222 -107
  78. package/dist/index.js.map +1 -1
  79. package/dist/types-DX8VfIVK.d.cts +226 -0
  80. package/dist/types-DX8VfIVK.d.ts +226 -0
  81. package/package.json +11 -1
package/dist/auto-init.js CHANGED
@@ -199,6 +199,47 @@ var TRAIL_FADE_CURVE = 1.5;
199
199
  var TRAIL_MAX_OPACITY = 0.88;
200
200
  var TRAIL_MIN_WIDTH = 0.5;
201
201
  var TRAIL_MAX_WIDTH = 2.5;
202
+ var GRADIENT = {
203
+ bard: ["#a855f7", "#3b82f6", "#14b8a6", "#ec4899"],
204
+ sunset: ["#f97316", "#dc2626", "#9333ea", "#f472b6"],
205
+ ocean: ["#1e3a8a", "#06b6d4", "#22d3ee", "#e0f2fe"],
206
+ ice: ["#1e3a8a", "#67e8f9"],
207
+ fire: ["#7f1d1d", "#fbbf24"],
208
+ forest: ["#14532d", "#86efac"],
209
+ };
210
+ var PRESETS = {
211
+ bard: GRADIENT.bard,
212
+ sunset: GRADIENT.sunset,
213
+ ocean: GRADIENT.ocean,
214
+ ice: GRADIENT.ice,
215
+ fire: GRADIENT.fire,
216
+ forest: GRADIENT.forest,
217
+ };
218
+ function hexToRgb(hex) {
219
+ const n = parseInt(hex.slice(1), 16);
220
+ return { r: n >> 16, g: (n >> 8) & 255, b: n & 255 };
221
+ }
222
+ var lerpRgb = (a, b, t) => ({
223
+ r: Math.round(a.r + (b.r - a.r) * t),
224
+ g: Math.round(a.g + (b.g - a.g) * t),
225
+ b: Math.round(a.b + (b.b - a.b) * t),
226
+ });
227
+ function getPaletteColor(palette, position, timeOffset = 0) {
228
+ if (palette.length === 0) return { r: 255, g: 255, b: 255 };
229
+ if (palette.length === 1) return hexToRgb(palette[0]);
230
+ const cyclePos = (position + timeOffset) % 1;
231
+ const scaled = cyclePos * palette.length;
232
+ const idx = Math.floor(scaled);
233
+ const t = scaled - idx;
234
+ const c1 = hexToRgb(palette[idx % palette.length]);
235
+ const c2 = hexToRgb(palette[(idx + 1) % palette.length]);
236
+ return lerpRgb(c1, c2, t);
237
+ }
238
+ function resolvePalette(palette, trailStyle) {
239
+ if (Array.isArray(palette)) return palette;
240
+ if (palette && palette in PRESETS) return PRESETS[palette];
241
+ return trailStyle === "gradient-animated" ? GRADIENT.bard : GRADIENT.ice;
242
+ }
202
243
  function hexToRgbComponents(hex) {
203
244
  const n = parseInt(hex.slice(1), 16);
204
245
  return `${n >> 16},${(n >> 8) & 255},${n & 255}`;
@@ -248,6 +289,8 @@ function createRenderer(options) {
248
289
  headColor: options.headColor ?? "#ffffff",
249
290
  headRadius: options.headRadius ?? DEFAULT_HEAD_RADIUS,
250
291
  };
292
+ const trailStyle = options.trailStyle ?? "default";
293
+ const palette = resolvePalette(options.palette, trailStyle);
251
294
  const trailRgb = hexToRgbComponents(opts.trailColor);
252
295
  const dpr = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
253
296
  function setupCanvas() {
@@ -273,6 +316,7 @@ function createRenderer(options) {
273
316
  let morphResolve = null;
274
317
  let morphDurationMs = DEFAULT_MORPH_DURATION_MS;
275
318
  let morphAlpha = 0;
319
+ let gradientAnimTime = 0;
276
320
  function computeBoundaries(pts) {
277
321
  if (pts.length === 0) return null;
278
322
  const first = pts[0];
@@ -384,7 +428,13 @@ function createRenderer(options) {
384
428
  const l1y = next.y * scale + offsetY + n1.y * halfW1;
385
429
  const r1x = next.x * scale + offsetX - n1.x * halfW1;
386
430
  const r1y = next.y * scale + offsetY - n1.y * halfW1;
387
- ctx.fillStyle = `rgba(${trailRgb},${alpha})`;
431
+ if (trailStyle === "default") {
432
+ ctx.fillStyle = `rgba(${trailRgb},${alpha})`;
433
+ } else {
434
+ const timeOffset = trailStyle === "gradient-animated" ? gradientAnimTime * 5e-4 : 0;
435
+ const color = getPaletteColor(palette, progress, timeOffset);
436
+ ctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${alpha})`;
437
+ }
388
438
  ctx.beginPath();
389
439
  ctx.moveTo(l0x, l0y);
390
440
  ctx.lineTo(l1x, l1y);
@@ -409,6 +459,9 @@ function createRenderer(options) {
409
459
  const now = performance.now();
410
460
  const deltaTime = Math.min((now - lastTime) / 1e3, 1 / 30);
411
461
  lastTime = now;
462
+ if (trailStyle === "gradient-animated") {
463
+ gradientAnimTime += deltaTime * 1e3;
464
+ }
412
465
  if (engine.morphAlpha !== null) {
413
466
  morphAlpha = Math.min(1, morphAlpha + deltaTime / (morphDurationMs / 1e3));
414
467
  engine.setMorphAlpha(morphAlpha);
@@ -497,9 +550,9 @@ function createRenderer(options) {
497
550
  };
498
551
  }
499
552
 
500
- // src/curves.ts
553
+ // src/curves/artemis2.ts
501
554
  var TWO_PI2 = Math.PI * 2;
502
- function artemis2(t, _time, _params) {
555
+ function artemis2Fn(t, _time, _params) {
503
556
  const a = 0.35,
504
557
  b = 0.15,
505
558
  ox = 0.175;
@@ -511,21 +564,16 @@ function artemis2(t, _time, _params) {
511
564
  y: (s * c * (1 + b * c)) / denom,
512
565
  };
513
566
  }
514
- function epitrochoid7(t, _time, _params) {
515
- const d = 1 + 0.55 * Math.sin(t * 0.5);
516
- return {
517
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
518
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
519
- };
520
- }
521
- function epitrochoid7Skeleton(t) {
522
- const d = 1.275;
523
- return {
524
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
525
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
526
- };
527
- }
528
- function astroid(t, _time, _params) {
567
+ var artemis2 = {
568
+ name: "Artemis II",
569
+ fn: artemis2Fn,
570
+ period: TWO_PI2,
571
+ speed: 0.7,
572
+ };
573
+
574
+ // src/curves/astroid.ts
575
+ var TWO_PI3 = Math.PI * 2;
576
+ function astroidFn(t, _time, _params) {
529
577
  const c = Math.cos(t);
530
578
  const s = Math.sin(t);
531
579
  return {
@@ -533,47 +581,104 @@ function astroid(t, _time, _params) {
533
581
  y: s * s * s,
534
582
  };
535
583
  }
536
- function deltoid(t, _time, _params) {
584
+ var astroid = {
585
+ name: "Astroid",
586
+ fn: astroidFn,
587
+ period: TWO_PI3,
588
+ speed: 1.1,
589
+ };
590
+
591
+ // src/curves/deltoid.ts
592
+ var TWO_PI4 = Math.PI * 2;
593
+ function deltoidFn(t, _time, _params) {
537
594
  return {
538
595
  x: 2 * Math.cos(t) + Math.cos(2 * t),
539
596
  y: 2 * Math.sin(t) - Math.sin(2 * t),
540
597
  };
541
598
  }
542
- function rose5(t, _time, _params) {
543
- const r = Math.cos(5 * t);
599
+ var deltoid = {
600
+ name: "Deltoid",
601
+ fn: deltoidFn,
602
+ period: TWO_PI4,
603
+ speed: 0.9,
604
+ };
605
+
606
+ // src/curves/epicycloid3.ts
607
+ var TWO_PI5 = Math.PI * 2;
608
+ function epicycloid3Fn(t, _time, _params) {
544
609
  return {
545
- x: r * Math.cos(t),
546
- y: r * Math.sin(t),
610
+ x: 4 * Math.cos(t) - Math.cos(4 * t),
611
+ y: 4 * Math.sin(t) - Math.sin(4 * t),
547
612
  };
548
613
  }
549
- function rose3(t, _time, _params) {
550
- const r = Math.cos(3 * t);
614
+ var epicycloid3 = {
615
+ name: "Epicycloid (n=3)",
616
+ fn: epicycloid3Fn,
617
+ period: TWO_PI5,
618
+ speed: 0.75,
619
+ };
620
+
621
+ // src/curves/epitrochoid7.ts
622
+ var TWO_PI6 = Math.PI * 2;
623
+ function epitrochoid7Fn(t, _time, _params) {
624
+ const d = 1 + 0.55 * Math.sin(t * 0.5);
551
625
  return {
552
- x: r * Math.cos(t),
553
- y: r * Math.sin(t),
626
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
627
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
628
+ };
629
+ }
630
+ function epitrochoid7SkeletonFn(t) {
631
+ const d = 1.275;
632
+ return {
633
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
634
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
554
635
  };
555
636
  }
556
- function lissajous32(t, time, _params) {
637
+ var epitrochoid7 = {
638
+ name: "Epitrochoid",
639
+ fn: epitrochoid7Fn,
640
+ period: TWO_PI6,
641
+ speed: 1.4,
642
+ skeletonFn: epitrochoid7SkeletonFn,
643
+ };
644
+
645
+ // src/curves/lissajous32.ts
646
+ var TWO_PI7 = Math.PI * 2;
647
+ function lissajous32Fn(t, time, _params) {
557
648
  const phi = time * 0.45;
558
649
  return {
559
650
  x: Math.sin(3 * t + phi),
560
651
  y: Math.sin(2 * t),
561
652
  };
562
653
  }
563
- function lissajous43(t, time, _params) {
654
+ var lissajous32 = {
655
+ name: "Lissajous 3:2",
656
+ fn: lissajous32Fn,
657
+ period: TWO_PI7,
658
+ speed: 2,
659
+ skeleton: "live",
660
+ };
661
+
662
+ // src/curves/lissajous43.ts
663
+ var TWO_PI8 = Math.PI * 2;
664
+ function lissajous43Fn(t, time, _params) {
564
665
  const phi = time * 0.38;
565
666
  return {
566
667
  x: Math.sin(4 * t + phi),
567
668
  y: Math.sin(3 * t),
568
669
  };
569
670
  }
570
- function epicycloid3(t, _time, _params) {
571
- return {
572
- x: 4 * Math.cos(t) - Math.cos(4 * t),
573
- y: 4 * Math.sin(t) - Math.sin(4 * t),
574
- };
575
- }
576
- function lame(t, time, _params) {
671
+ var lissajous43 = {
672
+ name: "Lissajous 4:3",
673
+ fn: lissajous43Fn,
674
+ period: TWO_PI8,
675
+ speed: 1.8,
676
+ skeleton: "live",
677
+ };
678
+
679
+ // src/curves/lame.ts
680
+ var TWO_PI9 = Math.PI * 2;
681
+ function lameFn(t, time, _params) {
577
682
  const p = 1.75 + 1.25 * Math.sin(time * 0.48);
578
683
  const c = Math.cos(t),
579
684
  s = Math.sin(t);
@@ -582,71 +687,58 @@ function lame(t, time, _params) {
582
687
  y: Math.sign(s) * Math.pow(Math.abs(s), p),
583
688
  };
584
689
  }
690
+ var lame = {
691
+ name: "Lam\xE9 Curve",
692
+ fn: lameFn,
693
+ period: TWO_PI9,
694
+ speed: 1,
695
+ skeleton: "live",
696
+ };
697
+
698
+ // src/curves/rose3.ts
699
+ var TWO_PI10 = Math.PI * 2;
700
+ function rose3Fn(t, _time, _params) {
701
+ const r = Math.cos(3 * t);
702
+ return {
703
+ x: r * Math.cos(t),
704
+ y: r * Math.sin(t),
705
+ };
706
+ }
707
+ var rose3 = {
708
+ name: "Rose (n=3)",
709
+ fn: rose3Fn,
710
+ period: TWO_PI10,
711
+ speed: 1.15,
712
+ };
713
+
714
+ // src/curves/rose5.ts
715
+ var TWO_PI11 = Math.PI * 2;
716
+ function rose5Fn(t, _time, _params) {
717
+ const r = Math.cos(5 * t);
718
+ return {
719
+ x: r * Math.cos(t),
720
+ y: r * Math.sin(t),
721
+ };
722
+ }
723
+ var rose5 = {
724
+ name: "Rose (n=5)",
725
+ fn: rose5Fn,
726
+ period: TWO_PI11,
727
+ speed: 1,
728
+ };
729
+
730
+ // src/curves/index.ts
585
731
  var curves = {
586
- artemis2: {
587
- name: "Artemis II",
588
- fn: artemis2,
589
- period: TWO_PI2,
590
- speed: 0.7,
591
- },
592
- epitrochoid7: {
593
- name: "Epitrochoid",
594
- fn: epitrochoid7,
595
- period: TWO_PI2,
596
- speed: 1.4,
597
- skeletonFn: epitrochoid7Skeleton,
598
- },
599
- astroid: {
600
- name: "Astroid",
601
- fn: astroid,
602
- period: TWO_PI2,
603
- speed: 1.1,
604
- },
605
- deltoid: {
606
- name: "Deltoid",
607
- fn: deltoid,
608
- period: TWO_PI2,
609
- speed: 0.9,
610
- },
611
- rose5: {
612
- name: "Rose (n=5)",
613
- fn: rose5,
614
- period: TWO_PI2,
615
- speed: 1,
616
- },
617
- rose3: {
618
- name: "Rose (n=3)",
619
- fn: rose3,
620
- period: TWO_PI2,
621
- speed: 1.15,
622
- },
623
- lissajous32: {
624
- name: "Lissajous 3:2",
625
- fn: lissajous32,
626
- period: TWO_PI2,
627
- speed: 2,
628
- skeleton: "live",
629
- },
630
- lissajous43: {
631
- name: "Lissajous 4:3",
632
- fn: lissajous43,
633
- period: TWO_PI2,
634
- speed: 1.8,
635
- skeleton: "live",
636
- },
637
- epicycloid3: {
638
- name: "Epicycloid (n=3)",
639
- fn: epicycloid3,
640
- period: TWO_PI2,
641
- speed: 0.75,
642
- },
643
- lame: {
644
- name: "Lam\xE9 Curve",
645
- fn: lame,
646
- period: TWO_PI2,
647
- speed: 1,
648
- skeleton: "live",
649
- },
732
+ artemis2,
733
+ epitrochoid7,
734
+ astroid,
735
+ deltoid,
736
+ rose5,
737
+ rose3,
738
+ lissajous32,
739
+ lissajous43,
740
+ epicycloid3,
741
+ lame,
650
742
  };
651
743
 
652
744
  // src/index.ts
@@ -657,6 +749,15 @@ function createSarmal(canvas, curveDef, options) {
657
749
  }
658
750
 
659
751
  // src/auto-init.ts
752
+ function parsePalette(value) {
753
+ try {
754
+ const parsed = JSON.parse(value);
755
+ if (Array.isArray(parsed)) {
756
+ return parsed;
757
+ }
758
+ } catch {}
759
+ return value;
760
+ }
660
761
  function init() {
661
762
  const canvases = document.querySelectorAll("canvas[data-sarmal]");
662
763
  canvases.forEach((canvas) => {
@@ -673,16 +774,21 @@ function init() {
673
774
  ...(canvas.dataset.skeletonColor && { skeletonColor: canvas.dataset.skeletonColor }),
674
775
  ...(canvas.dataset.headColor && { headColor: canvas.dataset.headColor }),
675
776
  ...(canvas.dataset.headRadius && { headRadius: parseFloat(canvas.dataset.headRadius) }),
676
- ...(canvas.dataset.glowSize && { glowSize: parseInt(canvas.dataset.glowSize, 10) }),
677
777
  ...(canvas.dataset.trailLength && { trailLength: parseInt(canvas.dataset.trailLength, 10) }),
778
+ ...(canvas.dataset.trailStyle && {
779
+ trailStyle: canvas.dataset.trailStyle,
780
+ }),
781
+ ...(canvas.dataset.palette && { palette: parsePalette(canvas.dataset.palette) }),
678
782
  });
679
783
  sarmal.start();
680
784
  });
681
785
  }
682
786
  if (document.readyState === "loading") {
683
- document.addEventListener("DOMContentLoaded", init);
787
+ document.addEventListener("DOMContentLoaded", () => {
788
+ requestAnimationFrame(init);
789
+ });
684
790
  } else {
685
- init();
791
+ requestAnimationFrame(init);
686
792
  }
687
793
  //# sourceMappingURL=auto-init.js.map
688
794
  //# sourceMappingURL=auto-init.js.map