@sarmal/core 0.10.0 → 0.12.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/index.ts"],"names":["TWO_PI"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(t: number, _time: number, _params: Record<string, number>) {\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(t) + Math.cos(2 * t),\n y: 2 * Math.sin(t) - Math.sin(2 * t),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(t) - Math.cos(4 * t),\n y: 4 * Math.sin(t) - Math.sin(4 * t),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(t: number, _time: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(t * 0.5);\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\nfunction epitrochoid7SkeletonFn(t: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.45;\n return {\n x: Math.sin(3 * t + phi),\n y: Math.sin(2 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.38;\n return {\n x: Math.sin(4 * t + phi),\n y: Math.sin(3 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(3 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(5 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\n\n// Bulk export for convenience\nimport type { CurveDef } from \"../types\";\nimport { artemis2 } from \"./artemis2\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves: Record<string, CurveDef> = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose5,\n rose3,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n};\n"]}
1
+ {"version":3,"sources":["../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/index.ts"],"names":["TWO_PI"],"mappings":";;;AAEA,IAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AASzB,SAAS,UAAA,CAAW,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC7E,EAAA,MAAM,CAAA,GAAI,IAAA,EACR,CAAA,GAAI,IAAA,EACJ,EAAA,GAAK,KAAA;AACP,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAClB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,CAAA,EAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,KAAM,KAAA,GAAQ,EAAA;AAAA,IAC/B,CAAA,EAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,CAAA,GAAM;AAAA,GAC7B;AACF;AAMO,IAAM,QAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,UAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO;AACT;;;AC/BA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,SAAA,CAAU,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC5E,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACpB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACpB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,IACX,CAAA,EAAG,IAAI,CAAA,GAAI;AAAA,GACb;AACF;AAMO,IAAM,OAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,SAAA;AAAA,EACN,EAAA,EAAI,SAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO;AACT;;;ACpBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,SAAA,CAAU,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC5E,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAAA,IACnC,CAAA,EAAG,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACrC;AACF;AAMO,IAAM,OAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,SAAA;AAAA,EACN,EAAA,EAAI,SAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO;AACT;;;AClBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,aAAA,CAAc,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAChF,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAAA,IACnC,CAAA,EAAG,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACrC;AACF;AAMO,IAAM,WAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,kBAAA;AAAA,EACN,EAAA,EAAI,aAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO;AACT;;;AClBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,cAAA,CAAe,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AACjF,EAAA,MAAM,IAAI,CAAA,GAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAAA,IACvC,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACzC;AACF;AAEA,SAAS,uBAAuB,CAAA,EAAkB;AAEhD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAAA,IACvC,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACzC;AACF;AAMO,IAAM,YAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,aAAA;AAAA,EACN,EAAA,EAAI,cAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,UAAA,EAAY;AACd;;;AC7BA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,aAAA,CAAc,CAAA,EAAW,IAAA,EAAc,OAAA,EAAiC;AAC/E,EAAA,MAAM,MAAM,IAAA,GAAO,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,IACvB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACnB;AACF;AAMO,IAAM,WAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,eAAA;AAAA,EACN,EAAA,EAAI,aAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU;AACZ;;;ACpBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,aAAA,CAAc,CAAA,EAAW,IAAA,EAAc,OAAA,EAAiC;AAC/E,EAAA,MAAM,MAAM,IAAA,GAAO,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,IACvB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,GACnB;AACF;AAMO,IAAM,WAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,eAAA;AAAA,EACN,EAAA,EAAI,aAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,QAAA,EAAU;AACZ;;;ACpBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,MAAA,CAAO,CAAA,EAAW,IAAA,EAAc,OAAA,EAAiC;AACxE,EAAA,MAAM,IAAI,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAClB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAChB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACzC,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC;AAAA,GAC3C;AACF;AAMO,IAAM,IAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,eAAA;AAAA,EACN,EAAA,EAAI,MAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU;AACZ;;;ACtBA,IAAMA,OAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,OAAA,CAAQ,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC1E,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACxB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,IACjB,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC;AAAA,GACnB;AACF;AAMO,IAAM,KAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,OAAA;AAAA,EACJ,MAAA,EAAQA,OAAAA;AAAA,EACR,KAAA,EAAO;AACT;;;ACnBA,IAAMA,QAAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAEzB,SAAS,OAAA,CAAQ,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC1E,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACxB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,IACjB,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC;AAAA,GACnB;AACF;AAMO,IAAM,KAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,OAAA;AAAA,EACJ,MAAA,EAAQA,QAAAA;AAAA,EACR,KAAA,EAAO;AACT;;;ACSO,IAAM,MAAA,GAAS;AAAA,EACpB,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF","file":"index.cjs","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(t: number, _time: number, _params: Record<string, number>) {\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(t) + Math.cos(2 * t),\n y: 2 * Math.sin(t) - Math.sin(2 * t),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(t) - Math.cos(4 * t),\n y: 4 * Math.sin(t) - Math.sin(4 * t),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(t: number, _time: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(t * 0.5);\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\nfunction epitrochoid7SkeletonFn(t: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.45;\n return {\n x: Math.sin(3 * t + phi),\n y: Math.sin(2 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.38;\n return {\n x: Math.sin(4 * t + phi),\n y: Math.sin(3 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(3 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(5 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\n\n// Bulk export for convenience\n// >> Standard\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\n// >> Iconic\nimport { artemis2 } from \"./artemis2\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose5,\n rose3,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n} as const;\nexport type CurveName = keyof typeof curves;\n"]}
@@ -1,3 +1,4 @@
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
1
2
  export { artemis2 } from './artemis2.cjs';
2
3
  export { astroid } from './astroid.cjs';
3
4
  export { deltoid } from './deltoid.cjs';
@@ -8,12 +9,23 @@ export { lissajous43 } from './lissajous43.cjs';
8
9
  export { lame } from './lame.cjs';
9
10
  export { rose3 } from './rose3.cjs';
10
11
  export { rose5 } from './rose5.cjs';
11
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
12
12
 
13
13
  /**
14
14
  * Collection of all built-in sarmal curves
15
15
  * Import individual curves for better tree-shaking
16
16
  */
17
- declare const curves: Record<string, CurveDef>;
17
+ declare const curves: {
18
+ readonly artemis2: CurveDef;
19
+ readonly epitrochoid7: CurveDef;
20
+ readonly astroid: CurveDef;
21
+ readonly deltoid: CurveDef;
22
+ readonly rose5: CurveDef;
23
+ readonly rose3: CurveDef;
24
+ readonly lissajous32: CurveDef;
25
+ readonly lissajous43: CurveDef;
26
+ readonly epicycloid3: CurveDef;
27
+ readonly lame: CurveDef;
28
+ };
29
+ type CurveName = keyof typeof curves;
18
30
 
19
- export { curves };
31
+ export { type CurveName, curves };
@@ -1,3 +1,4 @@
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
1
2
  export { artemis2 } from './artemis2.js';
2
3
  export { astroid } from './astroid.js';
3
4
  export { deltoid } from './deltoid.js';
@@ -8,12 +9,23 @@ export { lissajous43 } from './lissajous43.js';
8
9
  export { lame } from './lame.js';
9
10
  export { rose3 } from './rose3.js';
10
11
  export { rose5 } from './rose5.js';
11
- import { C as CurveDef } from '../types-DcyISvnH.js';
12
12
 
13
13
  /**
14
14
  * Collection of all built-in sarmal curves
15
15
  * Import individual curves for better tree-shaking
16
16
  */
17
- declare const curves: Record<string, CurveDef>;
17
+ declare const curves: {
18
+ readonly artemis2: CurveDef;
19
+ readonly epitrochoid7: CurveDef;
20
+ readonly astroid: CurveDef;
21
+ readonly deltoid: CurveDef;
22
+ readonly rose5: CurveDef;
23
+ readonly rose3: CurveDef;
24
+ readonly lissajous32: CurveDef;
25
+ readonly lissajous43: CurveDef;
26
+ readonly epicycloid3: CurveDef;
27
+ readonly lame: CurveDef;
28
+ };
29
+ type CurveName = keyof typeof curves;
18
30
 
19
- export { curves };
31
+ export { type CurveName, curves };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/index.ts"],"names":["TWO_PI"],"mappings":"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","file":"index.js","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(t: number, _time: number, _params: Record<string, number>) {\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(t) + Math.cos(2 * t),\n y: 2 * Math.sin(t) - Math.sin(2 * t),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(t) - Math.cos(4 * t),\n y: 4 * Math.sin(t) - Math.sin(4 * t),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(t: number, _time: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(t * 0.5);\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\nfunction epitrochoid7SkeletonFn(t: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.45;\n return {\n x: Math.sin(3 * t + phi),\n y: Math.sin(2 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.38;\n return {\n x: Math.sin(4 * t + phi),\n y: Math.sin(3 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(3 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(5 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\n\n// Bulk export for convenience\nimport type { CurveDef } from \"../types\";\nimport { artemis2 } from \"./artemis2\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves: Record<string, CurveDef> = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose5,\n rose3,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n};\n"]}
1
+ {"version":3,"sources":["../../src/curves/artemis2.ts","../../src/curves/astroid.ts","../../src/curves/deltoid.ts","../../src/curves/epicycloid3.ts","../../src/curves/epitrochoid7.ts","../../src/curves/lissajous32.ts","../../src/curves/lissajous43.ts","../../src/curves/lame.ts","../../src/curves/rose3.ts","../../src/curves/rose5.ts","../../src/curves/index.ts"],"names":["TWO_PI"],"mappings":"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","file":"index.js","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction astroidFn(t: number, _time: number, _params: Record<string, number>) {\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: c * c * c,\n y: s * s * s,\n };\n}\n\n/**\n * Astroid curve - a 4-cusped hypocycloid\n * Creates a star-like shape with four sharp corners\n */\nexport const astroid: CurveDef = {\n name: \"Astroid\",\n fn: astroidFn,\n period: TWO_PI,\n speed: 1.1,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction deltoidFn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 2 * Math.cos(t) + Math.cos(2 * t),\n y: 2 * Math.sin(t) - Math.sin(2 * t),\n };\n}\n\n/**\n * Deltoid curve - a 3-cusped hypocycloid\n * Creates a triangular shape with curved sides\n */\nexport const deltoid: CurveDef = {\n name: \"Deltoid\",\n fn: deltoidFn,\n period: TWO_PI,\n speed: 0.9,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epicycloid3Fn(t: number, _time: number, _params: Record<string, number>) {\n return {\n x: 4 * Math.cos(t) - Math.cos(4 * t),\n y: 4 * Math.sin(t) - Math.sin(4 * t),\n };\n}\n\n/**\n * Epicycloid with 3 cusps\n * Creates a three-pointed star shape\n */\nexport const epicycloid3: CurveDef = {\n name: \"Epicycloid (n=3)\",\n fn: epicycloid3Fn,\n period: TWO_PI,\n speed: 0.75,\n};\n","import type { CurveDef, Point } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction epitrochoid7Fn(t: number, _time: number, _params: Record<string, number>) {\n const d = 1.0 + 0.55 * Math.sin(t * 0.5);\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\nfunction epitrochoid7SkeletonFn(t: number): Point {\n // average of the oscillating range for a stable base shape\n const d = 1.275;\n return {\n x: 7 * Math.cos(t) - d * Math.cos(7 * t),\n y: 7 * Math.sin(t) - d * Math.sin(7 * t),\n };\n}\n\n/**\n * Epitrochoid with 7 lobes and dynamic variation\n * Creates a flower-like pattern with undulating petals\n */\nexport const epitrochoid7: CurveDef = {\n name: \"Epitrochoid\",\n fn: epitrochoid7Fn,\n period: TWO_PI,\n speed: 1.4,\n skeletonFn: epitrochoid7SkeletonFn,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous32Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.45;\n return {\n x: Math.sin(3 * t + phi),\n y: Math.sin(2 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 3:2\n * Creates a figure-eight-like pattern with live skeleton\n */\nexport const lissajous32: CurveDef = {\n name: \"Lissajous 3:2\",\n fn: lissajous32Fn,\n period: TWO_PI,\n speed: 2.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lissajous43Fn(t: number, time: number, _params: Record<string, number>) {\n const phi = time * 0.38;\n return {\n x: Math.sin(4 * t + phi),\n y: Math.sin(3 * t),\n };\n}\n\n/**\n * Lissajous curve with frequency ratio 4:3\n * Creates a complex interweaving pattern with live skeleton\n */\nexport const lissajous43: CurveDef = {\n name: \"Lissajous 4:3\",\n fn: lissajous43Fn,\n period: TWO_PI,\n speed: 1.8,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction lameFn(t: number, time: number, _params: Record<string, number>) {\n const p = 1.75 + 1.25 * Math.sin(time * 0.48);\n const c = Math.cos(t),\n s = Math.sin(t);\n return {\n x: Math.sign(c) * Math.pow(Math.abs(c), p),\n y: Math.sign(s) * Math.pow(Math.abs(s), p),\n };\n}\n\n/**\n * Lamé curve (superellipse) with time-varying exponent\n * Creates a squircle-like shape that morphs over time\n */\nexport const lame: CurveDef = {\n name: \"Lamé Curve\",\n fn: lameFn,\n period: TWO_PI,\n speed: 1.0,\n skeleton: \"live\",\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose3Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(3 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 3 petals\n * Creates a three-petaled flower pattern\n */\nexport const rose3: CurveDef = {\n name: \"Rose (n=3)\",\n fn: rose3Fn,\n period: TWO_PI,\n speed: 1.15,\n};\n","import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\nfunction rose5Fn(t: number, _time: number, _params: Record<string, number>) {\n const r = Math.cos(5 * t);\n return {\n x: r * Math.cos(t),\n y: r * Math.sin(t),\n };\n}\n\n/**\n * Rose curve with 5 petals\n * Creates a five-petaled flower pattern\n */\nexport const rose5: CurveDef = {\n name: \"Rose (n=5)\",\n fn: rose5Fn,\n period: TWO_PI,\n speed: 1.0,\n};\n","// Individual curve exports for tree-shaking\nexport { artemis2 } from \"./artemis2\";\nexport { astroid } from \"./astroid\";\nexport { deltoid } from \"./deltoid\";\nexport { epicycloid3 } from \"./epicycloid3\";\nexport { epitrochoid7 } from \"./epitrochoid7\";\nexport { lissajous32 } from \"./lissajous32\";\nexport { lissajous43 } from \"./lissajous43\";\nexport { lame } from \"./lame\";\nexport { rose3 } from \"./rose3\";\nexport { rose5 } from \"./rose5\";\n\n// Bulk export for convenience\n// >> Standard\nimport { rose3 } from \"./rose3\";\nimport { rose5 } from \"./rose5\";\nimport { astroid } from \"./astroid\";\nimport { deltoid } from \"./deltoid\";\nimport { epicycloid3 } from \"./epicycloid3\";\nimport { epitrochoid7 } from \"./epitrochoid7\";\nimport { lissajous32 } from \"./lissajous32\";\nimport { lissajous43 } from \"./lissajous43\";\nimport { lame } from \"./lame\";\n// >> Iconic\nimport { artemis2 } from \"./artemis2\";\n\n/**\n * Collection of all built-in sarmal curves\n * Import individual curves for better tree-shaking\n */\nexport const curves = {\n artemis2,\n epitrochoid7,\n astroid,\n deltoid,\n rose5,\n rose3,\n lissajous32,\n lissajous43,\n epicycloid3,\n lame,\n} as const;\nexport type CurveName = keyof typeof curves;\n"]}
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
2
2
 
3
3
  /**
4
4
  * Lamé curve (superellipse) with time-varying exponent
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.js';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
2
2
 
3
3
  /**
4
4
  * Lamé curve (superellipse) with time-varying exponent
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
2
2
 
3
3
  /**
4
4
  * Lissajous curve with frequency ratio 3:2
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.js';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
2
2
 
3
3
  /**
4
4
  * Lissajous curve with frequency ratio 3:2
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
2
2
 
3
3
  /**
4
4
  * Lissajous curve with frequency ratio 4:3
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.js';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
2
2
 
3
3
  /**
4
4
  * Lissajous curve with frequency ratio 4:3
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
2
2
 
3
3
  /**
4
4
  * Rose curve with 3 petals
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.js';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
2
2
 
3
3
  /**
4
4
  * Rose curve with 3 petals
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.cjs';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.cjs';
2
2
 
3
3
  /**
4
4
  * Rose curve with 5 petals
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-DcyISvnH.js';
1
+ import { C as CurveDef } from '../types-BzgdhxE0.js';
2
2
 
3
3
  /**
4
4
  * Rose curve with 5 petals
package/dist/index.cjs CHANGED
@@ -76,9 +76,11 @@ function createEngine(curveDef, trailLength = 120) {
76
76
  const trail = new CircularBuffer(trailLength);
77
77
  let t = 0;
78
78
  let actualTime = 0;
79
+ let userSpeedOverride = null;
79
80
  let morphCurveB = null;
80
81
  let _morphAlpha = null;
81
82
  let _morphStrategy = "normalized";
83
+ let _speedTransition = null;
82
84
  function sampleSkeleton(c, sampleT) {
83
85
  if (c.skeletonFn) {
84
86
  return c.skeletonFn(sampleT);
@@ -90,9 +92,19 @@ function createEngine(curveDef, trailLength = 120) {
90
92
  }
91
93
  return {
92
94
  tick(deltaTime) {
93
- let effectiveSpeed = curve.speed;
95
+ if (_speedTransition !== null) {
96
+ _speedTransition.elapsed += deltaTime * 1e3;
97
+ const alpha = Math.min(_speedTransition.elapsed / _speedTransition.duration, 1);
98
+ userSpeedOverride = lerp(_speedTransition.from, _speedTransition.to, alpha);
99
+ if (alpha >= 1) {
100
+ userSpeedOverride = _speedTransition.to;
101
+ _speedTransition.resolve();
102
+ _speedTransition = null;
103
+ }
104
+ }
105
+ let effectiveSpeed = userSpeedOverride ?? curve.speed;
94
106
  if (morphCurveB !== null && _morphAlpha !== null) {
95
- effectiveSpeed = lerp(curve.speed, morphCurveB.speed, _morphAlpha);
107
+ effectiveSpeed = lerp(effectiveSpeed, morphCurveB.speed, _morphAlpha);
96
108
  }
97
109
  t = (t + effectiveSpeed * deltaTime) % curve.period;
98
110
  actualTime += deltaTime;
@@ -202,6 +214,44 @@ function createEngine(curveDef, trailLength = 120) {
202
214
  points[i] = sampleSkeleton(curve, sampleT);
203
215
  }
204
216
  return points;
217
+ },
218
+ setSpeed(speed) {
219
+ if (!Number.isFinite(speed)) {
220
+ throw new Error("speed must be a finite number");
221
+ }
222
+ if (_speedTransition !== null) {
223
+ _speedTransition.reject(new Error("Speed transition cancelled"));
224
+ _speedTransition = null;
225
+ }
226
+ userSpeedOverride = speed;
227
+ },
228
+ getSpeed() {
229
+ return userSpeedOverride ?? curve.speed;
230
+ },
231
+ resetSpeed() {
232
+ userSpeedOverride = null;
233
+ },
234
+ setSpeedOver(speed, duration) {
235
+ if (!Number.isFinite(speed)) {
236
+ throw new Error("speed must be a finite number");
237
+ }
238
+ if (!Number.isFinite(duration) || duration <= 0) {
239
+ throw new Error("duration must be a finite number greater than 0");
240
+ }
241
+ if (_speedTransition !== null) {
242
+ _speedTransition.reject(new Error("Speed transition cancelled"));
243
+ _speedTransition = null;
244
+ }
245
+ const from = userSpeedOverride ?? curve.speed;
246
+ return new Promise((resolve, reject) => {
247
+ _speedTransition = { from, to: speed, elapsed: 0, duration, resolve, reject };
248
+ });
249
+ },
250
+ cancelSpeedTransition() {
251
+ if (_speedTransition !== null) {
252
+ _speedTransition.reject(new Error("Speed transition cancelled"));
253
+ _speedTransition = null;
254
+ }
205
255
  }
206
256
  };
207
257
  }
@@ -301,9 +351,18 @@ function computeBoundaries(pts, logicalWidth, logicalHeight) {
301
351
  offsetY: (logicalHeight - h * scale) / 2 - minY * scale
302
352
  };
303
353
  }
354
+ function enginePassthroughs(engine) {
355
+ return {
356
+ jump: engine.jump,
357
+ seek: engine.seek,
358
+ setSpeed: engine.setSpeed,
359
+ getSpeed: engine.getSpeed,
360
+ resetSpeed: engine.resetSpeed,
361
+ setSpeedOver: engine.setSpeedOver
362
+ };
363
+ }
304
364
 
305
365
  // src/renderer.ts
306
- var DEFAULT_HEAD_RADIUS = 4;
307
366
  var DEFAULT_SKELETON_COLOR = "#ffffff";
308
367
  var GRADIENT = {
309
368
  bard: ["#a855f7", "#3b82f6", "#14b8a6", "#ec4899"],
@@ -363,14 +422,21 @@ function createRenderer(options) {
363
422
  }
364
423
  const ctx = canvas.getContext("2d");
365
424
  const engine = options.engine;
425
+ const trailStyle = options.trailStyle ?? "default";
426
+ const trailColor = options.trailColor ?? "#ffffff";
427
+ const palette = resolvePalette(options.palette, trailStyle);
428
+ function defaultHeadColor() {
429
+ if (trailStyle !== "default") {
430
+ const { r, g, b } = getPaletteColor(palette, 1);
431
+ return `rgb(${r},${g},${b})`;
432
+ }
433
+ return trailColor;
434
+ }
366
435
  const opts = {
367
436
  skeletonColor: options.skeletonColor ?? DEFAULT_SKELETON_COLOR,
368
- trailColor: options.trailColor ?? "#ffffff",
369
- headColor: options.headColor ?? "#ffffff",
370
- headRadius: options.headRadius ?? DEFAULT_HEAD_RADIUS
437
+ trailColor,
438
+ headColor: options.headColor ?? defaultHeadColor()
371
439
  };
372
- const trailStyle = options.trailStyle ?? "default";
373
- const palette = resolvePalette(options.palette, trailStyle);
374
440
  const trailRgb = hexToRgbComponents(opts.trailColor);
375
441
  const dpr = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
376
442
  function setupCanvas() {
@@ -494,9 +560,10 @@ function createRenderer(options) {
494
560
  }
495
561
  const x = head.x * scale + offsetX;
496
562
  const y = head.y * scale + offsetY;
563
+ const r = options.headRadius ?? Math.max(2, 3 * Math.sqrt(Math.min(logicalWidth, logicalHeight) / 160));
497
564
  ctx.fillStyle = opts.headColor;
498
565
  ctx.beginPath();
499
- ctx.arc(x, y, opts.headRadius, 0, Math.PI * 2);
566
+ ctx.arc(x, y, r, 0, Math.PI * 2);
500
567
  ctx.fill();
501
568
  }
502
569
  function render() {
@@ -559,6 +626,7 @@ function createRenderer(options) {
559
626
  }
560
627
  cancelAnimationFrame(animationId);
561
628
  animationId = null;
629
+ engine.cancelSpeedTransition();
562
630
  },
563
631
  reset() {
564
632
  engine.reset();
@@ -571,12 +639,7 @@ function createRenderer(options) {
571
639
  animationId = null;
572
640
  }
573
641
  },
574
- jump(t, options2) {
575
- engine.jump(t, options2);
576
- },
577
- seek(t, options2) {
578
- engine.seek(t, options2);
579
- },
642
+ ...enginePassthroughs(engine),
580
643
  morphTo(target, options2) {
581
644
  if (morphResolve !== null) {
582
645
  engine.completeMorph();
@@ -622,16 +685,17 @@ function el(tag) {
622
685
  }
623
686
  function createSVGRenderer(options) {
624
687
  const { container, engine } = options;
688
+ const trailColor = options.trailColor ?? "#ffffff";
625
689
  const opts = {
626
690
  skeletonColor: options.skeletonColor ?? "#ffffff",
627
- trailColor: options.trailColor ?? "#ffffff",
628
- headColor: options.headColor ?? "#ffffff",
629
- headRadius: options.headRadius ?? 4,
691
+ trailColor,
692
+ headColor: options.headColor ?? trailColor,
630
693
  ariaLabel: options.ariaLabel ?? "Loading"
631
694
  };
632
695
  const rect = container.getBoundingClientRect();
633
696
  const width = rect.width || 200;
634
697
  const height = rect.height || 200;
698
+ const headRadius = options.headRadius ?? Math.max(2, 3 * Math.sqrt(Math.min(width, height) / 160));
635
699
  const svg = el("svg");
636
700
  svg.setAttribute("width", String(width));
637
701
  svg.setAttribute("height", String(height));
@@ -670,7 +734,7 @@ function createSVGRenderer(options) {
670
734
  }
671
735
  const headCircle = el("circle");
672
736
  headCircle.setAttribute("fill", opts.headColor);
673
- headCircle.setAttribute("r", String(opts.headRadius));
737
+ headCircle.setAttribute("r", String(headRadius));
674
738
  svg.appendChild(headCircle);
675
739
  container.appendChild(svg);
676
740
  let scale = 1;
@@ -800,6 +864,7 @@ function createSVGRenderer(options) {
800
864
  }
801
865
  cancelAnimationFrame(animationId);
802
866
  animationId = null;
867
+ engine.cancelSpeedTransition();
803
868
  },
804
869
  reset() {
805
870
  engine.reset();
@@ -811,12 +876,7 @@ function createSVGRenderer(options) {
811
876
  }
812
877
  svg.remove();
813
878
  },
814
- jump(t, options2) {
815
- engine.jump(t, options2);
816
- },
817
- seek(t, options2) {
818
- engine.seek(t, options2);
819
- },
879
+ ...enginePassthroughs(engine),
820
880
  morphTo(target, options2) {
821
881
  if (morphResolve !== null) {
822
882
  engine.completeMorph();