@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.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);
@@ -597,19 +650,25 @@ function createSVGRenderer(options) {
597
650
  offsetY = (height - h * scale) / 2 - minY * scale;
598
651
  }
599
652
  function px(p) {
600
- return (p.x * scale + offsetX).toFixed(2);
653
+ return p.x * scale + offsetX;
601
654
  }
602
655
  function py(p) {
603
- return (p.y * scale + offsetY).toFixed(2);
656
+ return p.y * scale + offsetY;
657
+ }
658
+ function pxStr(p) {
659
+ return px(p).toFixed(2);
660
+ }
661
+ function pyStr(p) {
662
+ return py(p).toFixed(2);
604
663
  }
605
664
  function updateSkeleton(skeleton2) {
606
665
  if (skeleton2.length < 2) {
607
666
  skeletonPath.setAttribute("d", "");
608
667
  return;
609
668
  }
610
- let d = `M${px(skeleton2[0])} ${py(skeleton2[0])}`;
669
+ let d = `M${pxStr(skeleton2[0])} ${pyStr(skeleton2[0])}`;
611
670
  for (let i = 1; i < skeleton2.length; i++) {
612
- d += ` L${px(skeleton2[i])} ${py(skeleton2[i])}`;
671
+ d += ` L${pxStr(skeleton2[i])} ${pyStr(skeleton2[i])}`;
613
672
  }
614
673
  d += " Z";
615
674
  skeletonPath.setAttribute("d", d);
@@ -661,8 +720,8 @@ function createSVGRenderer(options) {
661
720
  const head = trail[trailCount - 1];
662
721
  const x = px(head);
663
722
  const y = py(head);
664
- headCircle.setAttribute("cx", x);
665
- headCircle.setAttribute("cy", y);
723
+ headCircle.setAttribute("cx", String(x));
724
+ headCircle.setAttribute("cy", String(y));
666
725
  }
667
726
  let animationId = null;
668
727
  let lastTime = 0;
@@ -815,9 +874,9 @@ function createSarmalSVG(container, curveDef, options) {
815
874
  return createSVGRenderer({ container, engine, ...rendererOpts });
816
875
  }
817
876
 
818
- // src/curves.ts
877
+ // src/curves/artemis2.ts
819
878
  var TWO_PI2 = Math.PI * 2;
820
- function artemis2(t, _time, _params) {
879
+ function artemis2Fn(t, _time, _params) {
821
880
  const a = 0.35,
822
881
  b = 0.15,
823
882
  ox = 0.175;
@@ -829,21 +888,16 @@ function artemis2(t, _time, _params) {
829
888
  y: (s * c * (1 + b * c)) / denom,
830
889
  };
831
890
  }
832
- function epitrochoid7(t, _time, _params) {
833
- const d = 1 + 0.55 * Math.sin(t * 0.5);
834
- return {
835
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
836
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
837
- };
838
- }
839
- function epitrochoid7Skeleton(t) {
840
- const d = 1.275;
841
- return {
842
- x: 7 * Math.cos(t) - d * Math.cos(7 * t),
843
- y: 7 * Math.sin(t) - d * Math.sin(7 * t),
844
- };
845
- }
846
- function astroid(t, _time, _params) {
891
+ var artemis2 = {
892
+ name: "Artemis II",
893
+ fn: artemis2Fn,
894
+ period: TWO_PI2,
895
+ speed: 0.7,
896
+ };
897
+
898
+ // src/curves/astroid.ts
899
+ var TWO_PI3 = Math.PI * 2;
900
+ function astroidFn(t, _time, _params) {
847
901
  const c = Math.cos(t);
848
902
  const s = Math.sin(t);
849
903
  return {
@@ -851,47 +905,104 @@ function astroid(t, _time, _params) {
851
905
  y: s * s * s,
852
906
  };
853
907
  }
854
- function deltoid(t, _time, _params) {
908
+ var astroid = {
909
+ name: "Astroid",
910
+ fn: astroidFn,
911
+ period: TWO_PI3,
912
+ speed: 1.1,
913
+ };
914
+
915
+ // src/curves/deltoid.ts
916
+ var TWO_PI4 = Math.PI * 2;
917
+ function deltoidFn(t, _time, _params) {
855
918
  return {
856
919
  x: 2 * Math.cos(t) + Math.cos(2 * t),
857
920
  y: 2 * Math.sin(t) - Math.sin(2 * t),
858
921
  };
859
922
  }
860
- function rose5(t, _time, _params) {
861
- const r = Math.cos(5 * t);
923
+ var deltoid = {
924
+ name: "Deltoid",
925
+ fn: deltoidFn,
926
+ period: TWO_PI4,
927
+ speed: 0.9,
928
+ };
929
+
930
+ // src/curves/epicycloid3.ts
931
+ var TWO_PI5 = Math.PI * 2;
932
+ function epicycloid3Fn(t, _time, _params) {
862
933
  return {
863
- x: r * Math.cos(t),
864
- y: r * Math.sin(t),
934
+ x: 4 * Math.cos(t) - Math.cos(4 * t),
935
+ y: 4 * Math.sin(t) - Math.sin(4 * t),
865
936
  };
866
937
  }
867
- function rose3(t, _time, _params) {
868
- const r = Math.cos(3 * t);
938
+ var epicycloid3 = {
939
+ name: "Epicycloid (n=3)",
940
+ fn: epicycloid3Fn,
941
+ period: TWO_PI5,
942
+ speed: 0.75,
943
+ };
944
+
945
+ // src/curves/epitrochoid7.ts
946
+ var TWO_PI6 = Math.PI * 2;
947
+ function epitrochoid7Fn(t, _time, _params) {
948
+ const d = 1 + 0.55 * Math.sin(t * 0.5);
869
949
  return {
870
- x: r * Math.cos(t),
871
- y: r * Math.sin(t),
950
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
951
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
952
+ };
953
+ }
954
+ function epitrochoid7SkeletonFn(t) {
955
+ const d = 1.275;
956
+ return {
957
+ x: 7 * Math.cos(t) - d * Math.cos(7 * t),
958
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
872
959
  };
873
960
  }
874
- function lissajous32(t, time, _params) {
961
+ var epitrochoid7 = {
962
+ name: "Epitrochoid",
963
+ fn: epitrochoid7Fn,
964
+ period: TWO_PI6,
965
+ speed: 1.4,
966
+ skeletonFn: epitrochoid7SkeletonFn,
967
+ };
968
+
969
+ // src/curves/lissajous32.ts
970
+ var TWO_PI7 = Math.PI * 2;
971
+ function lissajous32Fn(t, time, _params) {
875
972
  const phi = time * 0.45;
876
973
  return {
877
974
  x: Math.sin(3 * t + phi),
878
975
  y: Math.sin(2 * t),
879
976
  };
880
977
  }
881
- function lissajous43(t, time, _params) {
978
+ var lissajous32 = {
979
+ name: "Lissajous 3:2",
980
+ fn: lissajous32Fn,
981
+ period: TWO_PI7,
982
+ speed: 2,
983
+ skeleton: "live",
984
+ };
985
+
986
+ // src/curves/lissajous43.ts
987
+ var TWO_PI8 = Math.PI * 2;
988
+ function lissajous43Fn(t, time, _params) {
882
989
  const phi = time * 0.38;
883
990
  return {
884
991
  x: Math.sin(4 * t + phi),
885
992
  y: Math.sin(3 * t),
886
993
  };
887
994
  }
888
- function epicycloid3(t, _time, _params) {
889
- return {
890
- x: 4 * Math.cos(t) - Math.cos(4 * t),
891
- y: 4 * Math.sin(t) - Math.sin(4 * t),
892
- };
893
- }
894
- function lame(t, time, _params) {
995
+ var lissajous43 = {
996
+ name: "Lissajous 4:3",
997
+ fn: lissajous43Fn,
998
+ period: TWO_PI8,
999
+ speed: 1.8,
1000
+ skeleton: "live",
1001
+ };
1002
+
1003
+ // src/curves/lame.ts
1004
+ var TWO_PI9 = Math.PI * 2;
1005
+ function lameFn(t, time, _params) {
895
1006
  const p = 1.75 + 1.25 * Math.sin(time * 0.48);
896
1007
  const c = Math.cos(t),
897
1008
  s = Math.sin(t);
@@ -900,71 +1011,58 @@ function lame(t, time, _params) {
900
1011
  y: Math.sign(s) * Math.pow(Math.abs(s), p),
901
1012
  };
902
1013
  }
1014
+ var lame = {
1015
+ name: "Lam\xE9 Curve",
1016
+ fn: lameFn,
1017
+ period: TWO_PI9,
1018
+ speed: 1,
1019
+ skeleton: "live",
1020
+ };
1021
+
1022
+ // src/curves/rose3.ts
1023
+ var TWO_PI10 = Math.PI * 2;
1024
+ function rose3Fn(t, _time, _params) {
1025
+ const r = Math.cos(3 * t);
1026
+ return {
1027
+ x: r * Math.cos(t),
1028
+ y: r * Math.sin(t),
1029
+ };
1030
+ }
1031
+ var rose3 = {
1032
+ name: "Rose (n=3)",
1033
+ fn: rose3Fn,
1034
+ period: TWO_PI10,
1035
+ speed: 1.15,
1036
+ };
1037
+
1038
+ // src/curves/rose5.ts
1039
+ var TWO_PI11 = Math.PI * 2;
1040
+ function rose5Fn(t, _time, _params) {
1041
+ const r = Math.cos(5 * t);
1042
+ return {
1043
+ x: r * Math.cos(t),
1044
+ y: r * Math.sin(t),
1045
+ };
1046
+ }
1047
+ var rose5 = {
1048
+ name: "Rose (n=5)",
1049
+ fn: rose5Fn,
1050
+ period: TWO_PI11,
1051
+ speed: 1,
1052
+ };
1053
+
1054
+ // src/curves/index.ts
903
1055
  var curves = {
904
- artemis2: {
905
- name: "Artemis II",
906
- fn: artemis2,
907
- period: TWO_PI2,
908
- speed: 0.7,
909
- },
910
- epitrochoid7: {
911
- name: "Epitrochoid",
912
- fn: epitrochoid7,
913
- period: TWO_PI2,
914
- speed: 1.4,
915
- skeletonFn: epitrochoid7Skeleton,
916
- },
917
- astroid: {
918
- name: "Astroid",
919
- fn: astroid,
920
- period: TWO_PI2,
921
- speed: 1.1,
922
- },
923
- deltoid: {
924
- name: "Deltoid",
925
- fn: deltoid,
926
- period: TWO_PI2,
927
- speed: 0.9,
928
- },
929
- rose5: {
930
- name: "Rose (n=5)",
931
- fn: rose5,
932
- period: TWO_PI2,
933
- speed: 1,
934
- },
935
- rose3: {
936
- name: "Rose (n=3)",
937
- fn: rose3,
938
- period: TWO_PI2,
939
- speed: 1.15,
940
- },
941
- lissajous32: {
942
- name: "Lissajous 3:2",
943
- fn: lissajous32,
944
- period: TWO_PI2,
945
- speed: 2,
946
- skeleton: "live",
947
- },
948
- lissajous43: {
949
- name: "Lissajous 4:3",
950
- fn: lissajous43,
951
- period: TWO_PI2,
952
- speed: 1.8,
953
- skeleton: "live",
954
- },
955
- epicycloid3: {
956
- name: "Epicycloid (n=3)",
957
- fn: epicycloid3,
958
- period: TWO_PI2,
959
- speed: 0.75,
960
- },
961
- lame: {
962
- name: "Lam\xE9 Curve",
963
- fn: lame,
964
- period: TWO_PI2,
965
- speed: 1,
966
- skeleton: "live",
967
- },
1056
+ artemis2,
1057
+ epitrochoid7,
1058
+ astroid,
1059
+ deltoid,
1060
+ rose5,
1061
+ rose3,
1062
+ lissajous32,
1063
+ lissajous43,
1064
+ epicycloid3,
1065
+ lame,
968
1066
  };
969
1067
 
970
1068
  // src/index.ts
@@ -974,6 +1072,23 @@ function createSarmal(canvas, curveDef, options) {
974
1072
  return createRenderer({ canvas, engine, ...rendererOpts });
975
1073
  }
976
1074
 
977
- export { createEngine, createRenderer, createSVGRenderer, createSarmal, createSarmalSVG, curves };
1075
+ export {
1076
+ artemis2,
1077
+ astroid,
1078
+ createEngine,
1079
+ createRenderer,
1080
+ createSVGRenderer,
1081
+ createSarmal,
1082
+ createSarmalSVG,
1083
+ curves,
1084
+ deltoid,
1085
+ epicycloid3,
1086
+ epitrochoid7,
1087
+ lame,
1088
+ lissajous32,
1089
+ lissajous43,
1090
+ rose3,
1091
+ rose5,
1092
+ };
978
1093
  //# sourceMappingURL=index.js.map
979
1094
  //# sourceMappingURL=index.js.map