@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/index.cjs CHANGED
@@ -201,6 +201,47 @@ var TRAIL_FADE_CURVE = 1.5;
201
201
  var TRAIL_MAX_OPACITY = 0.88;
202
202
  var TRAIL_MIN_WIDTH = 0.5;
203
203
  var TRAIL_MAX_WIDTH = 2.5;
204
+ var GRADIENT = {
205
+ bard: ["#a855f7", "#3b82f6", "#14b8a6", "#ec4899"],
206
+ sunset: ["#f97316", "#dc2626", "#9333ea", "#f472b6"],
207
+ ocean: ["#1e3a8a", "#06b6d4", "#22d3ee", "#e0f2fe"],
208
+ ice: ["#1e3a8a", "#67e8f9"],
209
+ fire: ["#7f1d1d", "#fbbf24"],
210
+ forest: ["#14532d", "#86efac"],
211
+ };
212
+ var PRESETS = {
213
+ bard: GRADIENT.bard,
214
+ sunset: GRADIENT.sunset,
215
+ ocean: GRADIENT.ocean,
216
+ ice: GRADIENT.ice,
217
+ fire: GRADIENT.fire,
218
+ forest: GRADIENT.forest,
219
+ };
220
+ function hexToRgb(hex) {
221
+ const n = parseInt(hex.slice(1), 16);
222
+ return { r: n >> 16, g: (n >> 8) & 255, b: n & 255 };
223
+ }
224
+ var lerpRgb = (a, b, t) => ({
225
+ r: Math.round(a.r + (b.r - a.r) * t),
226
+ g: Math.round(a.g + (b.g - a.g) * t),
227
+ b: Math.round(a.b + (b.b - a.b) * t),
228
+ });
229
+ function getPaletteColor(palette, position, timeOffset = 0) {
230
+ if (palette.length === 0) return { r: 255, g: 255, b: 255 };
231
+ if (palette.length === 1) return hexToRgb(palette[0]);
232
+ const cyclePos = (position + timeOffset) % 1;
233
+ const scaled = cyclePos * palette.length;
234
+ const idx = Math.floor(scaled);
235
+ const t = scaled - idx;
236
+ const c1 = hexToRgb(palette[idx % palette.length]);
237
+ const c2 = hexToRgb(palette[(idx + 1) % palette.length]);
238
+ return lerpRgb(c1, c2, t);
239
+ }
240
+ function resolvePalette(palette, trailStyle) {
241
+ if (Array.isArray(palette)) return palette;
242
+ if (palette && palette in PRESETS) return PRESETS[palette];
243
+ return trailStyle === "gradient-animated" ? GRADIENT.bard : GRADIENT.ice;
244
+ }
204
245
  function hexToRgbComponents(hex) {
205
246
  const n = parseInt(hex.slice(1), 16);
206
247
  return `${n >> 16},${(n >> 8) & 255},${n & 255}`;
@@ -250,6 +291,8 @@ function createRenderer(options) {
250
291
  headColor: options.headColor ?? "#ffffff",
251
292
  headRadius: options.headRadius ?? DEFAULT_HEAD_RADIUS,
252
293
  };
294
+ const trailStyle = options.trailStyle ?? "default";
295
+ const palette = resolvePalette(options.palette, trailStyle);
253
296
  const trailRgb = hexToRgbComponents(opts.trailColor);
254
297
  const dpr = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
255
298
  function setupCanvas() {
@@ -275,6 +318,7 @@ function createRenderer(options) {
275
318
  let morphResolve = null;
276
319
  let morphDurationMs = DEFAULT_MORPH_DURATION_MS;
277
320
  let morphAlpha = 0;
321
+ let gradientAnimTime = 0;
278
322
  function computeBoundaries(pts) {
279
323
  if (pts.length === 0) return null;
280
324
  const first = pts[0];
@@ -386,7 +430,13 @@ function createRenderer(options) {
386
430
  const l1y = next.y * scale + offsetY + n1.y * halfW1;
387
431
  const r1x = next.x * scale + offsetX - n1.x * halfW1;
388
432
  const r1y = next.y * scale + offsetY - n1.y * halfW1;
389
- ctx.fillStyle = `rgba(${trailRgb},${alpha})`;
433
+ if (trailStyle === "default") {
434
+ ctx.fillStyle = `rgba(${trailRgb},${alpha})`;
435
+ } else {
436
+ const timeOffset = trailStyle === "gradient-animated" ? gradientAnimTime * 5e-4 : 0;
437
+ const color = getPaletteColor(palette, progress, timeOffset);
438
+ ctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${alpha})`;
439
+ }
390
440
  ctx.beginPath();
391
441
  ctx.moveTo(l0x, l0y);
392
442
  ctx.lineTo(l1x, l1y);
@@ -411,6 +461,9 @@ function createRenderer(options) {
411
461
  const now = performance.now();
412
462
  const deltaTime = Math.min((now - lastTime) / 1e3, 1 / 30);
413
463
  lastTime = now;
464
+ if (trailStyle === "gradient-animated") {
465
+ gradientAnimTime += deltaTime * 1e3;
466
+ }
414
467
  if (engine.morphAlpha !== null) {
415
468
  morphAlpha = Math.min(1, morphAlpha + deltaTime / (morphDurationMs / 1e3));
416
469
  engine.setMorphAlpha(morphAlpha);
@@ -599,19 +652,25 @@ function createSVGRenderer(options) {
599
652
  offsetY = (height - h * scale) / 2 - minY * scale;
600
653
  }
601
654
  function px(p) {
602
- return (p.x * scale + offsetX).toFixed(2);
655
+ return p.x * scale + offsetX;
603
656
  }
604
657
  function py(p) {
605
- return (p.y * scale + offsetY).toFixed(2);
658
+ return p.y * scale + offsetY;
659
+ }
660
+ function pxStr(p) {
661
+ return px(p).toFixed(2);
662
+ }
663
+ function pyStr(p) {
664
+ return py(p).toFixed(2);
606
665
  }
607
666
  function updateSkeleton(skeleton2) {
608
667
  if (skeleton2.length < 2) {
609
668
  skeletonPath.setAttribute("d", "");
610
669
  return;
611
670
  }
612
- let d = `M${px(skeleton2[0])} ${py(skeleton2[0])}`;
671
+ let d = `M${pxStr(skeleton2[0])} ${pyStr(skeleton2[0])}`;
613
672
  for (let i = 1; i < skeleton2.length; i++) {
614
- d += ` L${px(skeleton2[i])} ${py(skeleton2[i])}`;
673
+ d += ` L${pxStr(skeleton2[i])} ${pyStr(skeleton2[i])}`;
615
674
  }
616
675
  d += " Z";
617
676
  skeletonPath.setAttribute("d", d);
@@ -663,8 +722,8 @@ function createSVGRenderer(options) {
663
722
  const head = trail[trailCount - 1];
664
723
  const x = px(head);
665
724
  const y = py(head);
666
- headCircle.setAttribute("cx", x);
667
- headCircle.setAttribute("cy", y);
725
+ headCircle.setAttribute("cx", String(x));
726
+ headCircle.setAttribute("cy", String(y));
668
727
  }
669
728
  let animationId = null;
670
729
  let lastTime = 0;
@@ -817,9 +876,9 @@ function createSarmalSVG(container, curveDef, options) {
817
876
  return createSVGRenderer({ container, engine, ...rendererOpts });
818
877
  }
819
878
 
820
- // src/curves.ts
879
+ // src/curves/artemis2.ts
821
880
  var TWO_PI2 = Math.PI * 2;
822
- function artemis2(t, _time, _params) {
881
+ function artemis2Fn(t, _time, _params) {
823
882
  const a = 0.35,
824
883
  b = 0.15,
825
884
  ox = 0.175;
@@ -831,21 +890,16 @@ function artemis2(t, _time, _params) {
831
890
  y: (s * c * (1 + b * c)) / denom,
832
891
  };
833
892
  }
834
- function epitrochoid7(t, _time, _params) {
835
- const d = 1 + 0.55 * Math.sin(t * 0.5);
836
- return {
837
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
838
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
839
- };
840
- }
841
- function epitrochoid7Skeleton(t) {
842
- const d = 1.275;
843
- return {
844
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
845
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
846
- };
847
- }
848
- function astroid(t, _time, _params) {
893
+ var artemis2 = {
894
+ name: "Artemis II",
895
+ fn: artemis2Fn,
896
+ period: TWO_PI2,
897
+ speed: 0.7,
898
+ };
899
+
900
+ // src/curves/astroid.ts
901
+ var TWO_PI3 = Math.PI * 2;
902
+ function astroidFn(t, _time, _params) {
849
903
  const c = Math.cos(t);
850
904
  const s = Math.sin(t);
851
905
  return {
@@ -853,47 +907,104 @@ function astroid(t, _time, _params) {
853
907
  y: s * s * s,
854
908
  };
855
909
  }
856
- function deltoid(t, _time, _params) {
910
+ var astroid = {
911
+ name: "Astroid",
912
+ fn: astroidFn,
913
+ period: TWO_PI3,
914
+ speed: 1.1,
915
+ };
916
+
917
+ // src/curves/deltoid.ts
918
+ var TWO_PI4 = Math.PI * 2;
919
+ function deltoidFn(t, _time, _params) {
857
920
  return {
858
921
  x: 2 * Math.cos(t) + Math.cos(2 * t),
859
922
  y: 2 * Math.sin(t) - Math.sin(2 * t),
860
923
  };
861
924
  }
862
- function rose5(t, _time, _params) {
863
- const r = Math.cos(5 * t);
925
+ var deltoid = {
926
+ name: "Deltoid",
927
+ fn: deltoidFn,
928
+ period: TWO_PI4,
929
+ speed: 0.9,
930
+ };
931
+
932
+ // src/curves/epicycloid3.ts
933
+ var TWO_PI5 = Math.PI * 2;
934
+ function epicycloid3Fn(t, _time, _params) {
864
935
  return {
865
- x: r * Math.cos(t),
866
- y: r * Math.sin(t),
936
+ x: 4 * Math.cos(t) - Math.cos(4 * t),
937
+ y: 4 * Math.sin(t) - Math.sin(4 * t),
867
938
  };
868
939
  }
869
- function rose3(t, _time, _params) {
870
- const r = Math.cos(3 * t);
940
+ var epicycloid3 = {
941
+ name: "Epicycloid (n=3)",
942
+ fn: epicycloid3Fn,
943
+ period: TWO_PI5,
944
+ speed: 0.75,
945
+ };
946
+
947
+ // src/curves/epitrochoid7.ts
948
+ var TWO_PI6 = Math.PI * 2;
949
+ function epitrochoid7Fn(t, _time, _params) {
950
+ const d = 1 + 0.55 * Math.sin(t * 0.5);
871
951
  return {
872
- x: r * Math.cos(t),
873
- y: r * Math.sin(t),
952
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
953
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
954
+ };
955
+ }
956
+ function epitrochoid7SkeletonFn(t) {
957
+ const d = 1.275;
958
+ return {
959
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
960
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
874
961
  };
875
962
  }
876
- function lissajous32(t, time, _params) {
963
+ var epitrochoid7 = {
964
+ name: "Epitrochoid",
965
+ fn: epitrochoid7Fn,
966
+ period: TWO_PI6,
967
+ speed: 1.4,
968
+ skeletonFn: epitrochoid7SkeletonFn,
969
+ };
970
+
971
+ // src/curves/lissajous32.ts
972
+ var TWO_PI7 = Math.PI * 2;
973
+ function lissajous32Fn(t, time, _params) {
877
974
  const phi = time * 0.45;
878
975
  return {
879
976
  x: Math.sin(3 * t + phi),
880
977
  y: Math.sin(2 * t),
881
978
  };
882
979
  }
883
- function lissajous43(t, time, _params) {
980
+ var lissajous32 = {
981
+ name: "Lissajous 3:2",
982
+ fn: lissajous32Fn,
983
+ period: TWO_PI7,
984
+ speed: 2,
985
+ skeleton: "live",
986
+ };
987
+
988
+ // src/curves/lissajous43.ts
989
+ var TWO_PI8 = Math.PI * 2;
990
+ function lissajous43Fn(t, time, _params) {
884
991
  const phi = time * 0.38;
885
992
  return {
886
993
  x: Math.sin(4 * t + phi),
887
994
  y: Math.sin(3 * t),
888
995
  };
889
996
  }
890
- function epicycloid3(t, _time, _params) {
891
- return {
892
- x: 4 * Math.cos(t) - Math.cos(4 * t),
893
- y: 4 * Math.sin(t) - Math.sin(4 * t),
894
- };
895
- }
896
- function lame(t, time, _params) {
997
+ var lissajous43 = {
998
+ name: "Lissajous 4:3",
999
+ fn: lissajous43Fn,
1000
+ period: TWO_PI8,
1001
+ speed: 1.8,
1002
+ skeleton: "live",
1003
+ };
1004
+
1005
+ // src/curves/lame.ts
1006
+ var TWO_PI9 = Math.PI * 2;
1007
+ function lameFn(t, time, _params) {
897
1008
  const p = 1.75 + 1.25 * Math.sin(time * 0.48);
898
1009
  const c = Math.cos(t),
899
1010
  s = Math.sin(t);
@@ -902,71 +1013,58 @@ function lame(t, time, _params) {
902
1013
  y: Math.sign(s) * Math.pow(Math.abs(s), p),
903
1014
  };
904
1015
  }
1016
+ var lame = {
1017
+ name: "Lam\xE9 Curve",
1018
+ fn: lameFn,
1019
+ period: TWO_PI9,
1020
+ speed: 1,
1021
+ skeleton: "live",
1022
+ };
1023
+
1024
+ // src/curves/rose3.ts
1025
+ var TWO_PI10 = Math.PI * 2;
1026
+ function rose3Fn(t, _time, _params) {
1027
+ const r = Math.cos(3 * t);
1028
+ return {
1029
+ x: r * Math.cos(t),
1030
+ y: r * Math.sin(t),
1031
+ };
1032
+ }
1033
+ var rose3 = {
1034
+ name: "Rose (n=3)",
1035
+ fn: rose3Fn,
1036
+ period: TWO_PI10,
1037
+ speed: 1.15,
1038
+ };
1039
+
1040
+ // src/curves/rose5.ts
1041
+ var TWO_PI11 = Math.PI * 2;
1042
+ function rose5Fn(t, _time, _params) {
1043
+ const r = Math.cos(5 * t);
1044
+ return {
1045
+ x: r * Math.cos(t),
1046
+ y: r * Math.sin(t),
1047
+ };
1048
+ }
1049
+ var rose5 = {
1050
+ name: "Rose (n=5)",
1051
+ fn: rose5Fn,
1052
+ period: TWO_PI11,
1053
+ speed: 1,
1054
+ };
1055
+
1056
+ // src/curves/index.ts
905
1057
  var curves = {
906
- artemis2: {
907
- name: "Artemis II",
908
- fn: artemis2,
909
- period: TWO_PI2,
910
- speed: 0.7,
911
- },
912
- epitrochoid7: {
913
- name: "Epitrochoid",
914
- fn: epitrochoid7,
915
- period: TWO_PI2,
916
- speed: 1.4,
917
- skeletonFn: epitrochoid7Skeleton,
918
- },
919
- astroid: {
920
- name: "Astroid",
921
- fn: astroid,
922
- period: TWO_PI2,
923
- speed: 1.1,
924
- },
925
- deltoid: {
926
- name: "Deltoid",
927
- fn: deltoid,
928
- period: TWO_PI2,
929
- speed: 0.9,
930
- },
931
- rose5: {
932
- name: "Rose (n=5)",
933
- fn: rose5,
934
- period: TWO_PI2,
935
- speed: 1,
936
- },
937
- rose3: {
938
- name: "Rose (n=3)",
939
- fn: rose3,
940
- period: TWO_PI2,
941
- speed: 1.15,
942
- },
943
- lissajous32: {
944
- name: "Lissajous 3:2",
945
- fn: lissajous32,
946
- period: TWO_PI2,
947
- speed: 2,
948
- skeleton: "live",
949
- },
950
- lissajous43: {
951
- name: "Lissajous 4:3",
952
- fn: lissajous43,
953
- period: TWO_PI2,
954
- speed: 1.8,
955
- skeleton: "live",
956
- },
957
- epicycloid3: {
958
- name: "Epicycloid (n=3)",
959
- fn: epicycloid3,
960
- period: TWO_PI2,
961
- speed: 0.75,
962
- },
963
- lame: {
964
- name: "Lam\xE9 Curve",
965
- fn: lame,
966
- period: TWO_PI2,
967
- speed: 1,
968
- skeleton: "live",
969
- },
1058
+ artemis2,
1059
+ epitrochoid7,
1060
+ astroid,
1061
+ deltoid,
1062
+ rose5,
1063
+ rose3,
1064
+ lissajous32,
1065
+ lissajous43,
1066
+ epicycloid3,
1067
+ lame,
970
1068
  };
971
1069
 
972
1070
  // src/index.ts
@@ -976,11 +1074,21 @@ function createSarmal(canvas, curveDef, options) {
976
1074
  return createRenderer({ canvas, engine, ...rendererOpts });
977
1075
  }
978
1076
 
1077
+ exports.artemis2 = artemis2;
1078
+ exports.astroid = astroid;
979
1079
  exports.createEngine = createEngine;
980
1080
  exports.createRenderer = createRenderer;
981
1081
  exports.createSVGRenderer = createSVGRenderer;
982
1082
  exports.createSarmal = createSarmal;
983
1083
  exports.createSarmalSVG = createSarmalSVG;
984
1084
  exports.curves = curves;
1085
+ exports.deltoid = deltoid;
1086
+ exports.epicycloid3 = epicycloid3;
1087
+ exports.epitrochoid7 = epitrochoid7;
1088
+ exports.lame = lame;
1089
+ exports.lissajous32 = lissajous32;
1090
+ exports.lissajous43 = lissajous43;
1091
+ exports.rose3 = rose3;
1092
+ exports.rose5 = rose5;
985
1093
  //# sourceMappingURL=index.cjs.map
986
1094
  //# sourceMappingURL=index.cjs.map