@rehover/icons 0.1.0-beta.1 → 0.1.0-beta.2

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 (3) hide show
  1. package/dist/cli/index.js +343 -105
  2. package/dist/index.js +340 -102
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -450,7 +450,7 @@ function compileSpec(spec, paths) {
450
450
  }
451
451
 
452
452
  // lib/generators/runtime-template.generated.ts
453
- var FLUX_RUNTIME_TS = '/**\r\n * Rehover animation runtime \u2014 framework-agnostic, dependency-free, and safe to\r\n * copy into your project. Every generated icon (Vue/Svelte/Angular/Astro) ships\r\n * its SVG markup with `data-flux` targets plus a compiled `plan`, then calls\r\n * `animateIcon(root, plan, props)` from here. All trigger behavior lives in this\r\n * one file, so it is identical across frameworks.\r\n *\r\n * This file has no imports on purpose: it is emitted verbatim next to your icons\r\n * (as `flux-runtime.ts`) so nothing has to be installed. Tweak it freely.\r\n */\r\n\r\n/** What event starts an icon\'s animation. */\r\nexport type AnimationTrigger =\r\n | "hover"\r\n | "hoverHold"\r\n | "click"\r\n | "inView"\r\n | "autoplay"\r\n | "none";\r\n\r\n/** One element\'s compiled animation, keyed by its `data-flux` target. */\r\nexport interface StepAnimation {\r\n /** Matches the `data-flux` attribute on the element this animates. */\r\n key: string;\r\n /** Full keyframes (round-trip or destination) for hover/click/inView/autoplay. */\r\n active: Keyframe[];\r\n /** Rest \u2192 peak keyframes for `hoverHold` (the return is the reverse of this). */\r\n hold: Keyframe[];\r\n /** Base duration in seconds (before the `speed` prop divides it). */\r\n duration: number;\r\n /** Base delay in seconds (before `speed`; the `delay` prop is added at runtime). */\r\n delay: number;\r\n /** CSS timing-function string. */\r\n easing: string;\r\n /** Loops regardless of the `loop` prop (continuous/`repeat` steps). */\r\n alwaysLoop: boolean;\r\n}\r\n\r\n/** What the runtime needs from a compiled plan. */\r\nexport interface RuntimePlan {\r\n /** Per-element animations. */\r\n animations: StepAnimation[];\r\n /** Whether the icon autostarts (continuous specs). */\r\n continuous: boolean;\r\n}\r\n\r\n/** The runtime-tunable props that map to the icon\'s public API. */\r\nexport interface IconRuntimeProps {\r\n trigger: AnimationTrigger;\r\n speed: number;\r\n loop: boolean;\r\n delay: number;\r\n}\r\n\r\n/** Handle returned by {@link animateIcon} for prop updates and teardown. */\r\nexport interface IconController {\r\n /** Re-wire for new props (e.g. the playground changing `trigger`). */\r\n update(props: IconRuntimeProps): void;\r\n /** Remove all listeners/observers and cancel running animations. */\r\n destroy(): void;\r\n}\r\n\r\ntype Variant = "active" | "hold";\r\n\r\ninterface Bound {\r\n anim: StepAnimation;\r\n el: Element;\r\n}\r\n\r\n/** Attach the animation runtime to an already-rendered icon root. */\r\nexport function animateIcon(\r\n root: SVGSVGElement,\r\n plan: RuntimePlan,\r\n initialProps: IconRuntimeProps,\r\n): IconController {\r\n let props = initialProps;\r\n\r\n // Resolve each animation\'s DOM target once.\r\n const bound: Bound[] = [];\r\n for (const anim of plan.animations) {\r\n const el = root.querySelector(`[data-flux="${anim.key}"]`);\r\n if (el) bound.push({ anim, el });\r\n }\r\n\r\n // The currently-playing Animation per target (for restart/reverse).\r\n const current = new Map<string, Animation>();\r\n const cleanups: Array<() => void> = [];\r\n let observer: IntersectionObserver | null = null;\r\n\r\n function makeAnimation(b: Bound, variant: Variant): Animation {\r\n const { anim } = b;\r\n const keyframes = variant === "hold" ? anim.hold : anim.active;\r\n const loops = variant === "active" && (anim.alwaysLoop || props.loop);\r\n return b.el.animate(keyframes, {\r\n duration: (anim.duration / props.speed) * 1000,\r\n delay: ((anim.delay + props.delay) / props.speed) * 1000,\r\n easing: anim.easing,\r\n fill: "forwards",\r\n iterations: loops ? Infinity : 1,\r\n });\r\n }\r\n\r\n /** (Re)start a variant on every target, cancelling any in-flight run. */\r\n function play(variant: Variant): void {\r\n for (const b of bound) {\r\n current.get(b.anim.key)?.cancel();\r\n current.set(b.anim.key, makeAnimation(b, variant));\r\n }\r\n }\r\n\r\n /** Reverse the held pose back to rest (smooth, from the current position). */\r\n function reverseToRest(): void {\r\n for (const b of bound) {\r\n const running = current.get(b.anim.key);\r\n if (running) running.reverse();\r\n }\r\n }\r\n\r\n function on(type: string, handler: EventListener): void {\r\n root.addEventListener(type, handler);\r\n cleanups.push(() => root.removeEventListener(type, handler));\r\n }\r\n\r\n /** Tear down listeners/observers and stop animations (keeps final pose). */\r\n function teardown(): void {\r\n for (const c of cleanups) c();\r\n cleanups.length = 0;\r\n observer?.disconnect();\r\n observer = null;\r\n }\r\n\r\n function setup(): void {\r\n teardown();\r\n\r\n // Accessibility reflects interactivity and stays in sync with `trigger`.\r\n if (props.trigger === "click") {\r\n root.setAttribute("role", "button");\r\n root.setAttribute("tabindex", "0");\r\n } else {\r\n root.setAttribute("role", "img");\r\n root.removeAttribute("tabindex");\r\n }\r\n\r\n // Continuous specs and autoplay start immediately.\r\n if (plan.continuous || props.trigger === "autoplay") play("active");\r\n\r\n switch (props.trigger) {\r\n case "hover":\r\n on("mouseenter", () => play("active"));\r\n on("focus", () => play("active"));\r\n break;\r\n case "hoverHold":\r\n on("mouseenter", () => play("hold"));\r\n on("mouseleave", () => reverseToRest());\r\n on("focus", () => play("hold"));\r\n on("blur", () => reverseToRest());\r\n break;\r\n case "click":\r\n on("click", () => play("active"));\r\n on("keydown", (e) => {\r\n const key = (e as KeyboardEvent).key;\r\n if (key === "Enter" || key === " ") {\r\n e.preventDefault();\r\n play("active");\r\n }\r\n });\r\n break;\r\n case "inView":\r\n observer = new IntersectionObserver(\r\n (entries) => {\r\n if (entries.some((entry) => entry.isIntersecting)) {\r\n play("active");\r\n observer?.disconnect();\r\n observer = null;\r\n }\r\n },\r\n { threshold: 0.5 },\r\n );\r\n observer.observe(root);\r\n break;\r\n }\r\n }\r\n\r\n setup();\r\n\r\n return {\r\n update(next: IconRuntimeProps) {\r\n props = next;\r\n // Reset every target to rest before re-wiring for the new props.\r\n for (const a of current.values()) a.cancel();\r\n current.clear();\r\n setup();\r\n },\r\n destroy() {\r\n teardown();\r\n for (const a of current.values()) a.cancel();\r\n current.clear();\r\n },\r\n };\r\n}\r\n';
453
+ var REHOVER_RUNTIME_TS = '/**\r\n * Rehover animation runtime \u2014 framework-agnostic, dependency-free, and safe to\r\n * copy into your project. Every generated icon (Vue/Svelte/Angular/Astro) ships\r\n * its SVG markup with `data-rehover` targets plus a compiled `plan`, then calls\r\n * `animateIcon(root, plan, props)` from here. All trigger behavior lives in this\r\n * one file, so it is identical across frameworks.\r\n *\r\n * This file has no imports on purpose: it is emitted verbatim next to your icons\r\n * (as `rehover-runtime.ts`) so nothing has to be installed. Tweak it freely.\r\n */\r\n\r\n/** What event starts an icon\'s animation. */\r\nexport type AnimationTrigger =\r\n | "hover"\r\n | "hoverHold"\r\n | "click"\r\n | "inView"\r\n | "autoplay"\r\n | "none";\r\n\r\n/** One element\'s compiled animation, keyed by its `data-rehover` target. */\r\nexport interface StepAnimation {\r\n /** Matches the `data-rehover` attribute on the element this animates. */\r\n key: string;\r\n /** Full keyframes (round-trip or destination) for hover/click/inView/autoplay. */\r\n active: Keyframe[];\r\n /** Rest \u2192 peak keyframes for `hoverHold` (the return is the reverse of this). */\r\n hold: Keyframe[];\r\n /** Base duration in seconds (before the `speed` prop divides it). */\r\n duration: number;\r\n /** Base delay in seconds (before `speed`; the `delay` prop is added at runtime). */\r\n delay: number;\r\n /** CSS timing-function string. */\r\n easing: string;\r\n /** Loops regardless of the `loop` prop (continuous/`repeat` steps). */\r\n alwaysLoop: boolean;\r\n}\r\n\r\n/** What the runtime needs from a compiled plan. */\r\nexport interface RuntimePlan {\r\n /** Per-element animations. */\r\n animations: StepAnimation[];\r\n /** Whether the icon autostarts (continuous specs). */\r\n continuous: boolean;\r\n}\r\n\r\n/** The runtime-tunable props that map to the icon\'s public API. */\r\nexport interface IconRuntimeProps {\r\n trigger: AnimationTrigger;\r\n speed: number;\r\n loop: boolean;\r\n delay: number;\r\n}\r\n\r\n/** Handle returned by {@link animateIcon} for prop updates and teardown. */\r\nexport interface IconController {\r\n /** Re-wire for new props (e.g. the playground changing `trigger`). */\r\n update(props: IconRuntimeProps): void;\r\n /** Remove all listeners/observers and cancel running animations. */\r\n destroy(): void;\r\n}\r\n\r\ntype Variant = "active" | "hold";\r\n\r\ninterface Bound {\r\n anim: StepAnimation;\r\n el: Element;\r\n}\r\n\r\n/** Attach the animation runtime to an already-rendered icon root. */\r\nexport function animateIcon(\r\n root: SVGSVGElement,\r\n plan: RuntimePlan,\r\n initialProps: IconRuntimeProps,\r\n): IconController {\r\n let props = initialProps;\r\n\r\n // Resolve each animation\'s DOM target once.\r\n const bound: Bound[] = [];\r\n for (const anim of plan.animations) {\r\n const el = root.querySelector(`[data-rehover="${anim.key}"]`);\r\n if (el) bound.push({ anim, el });\r\n }\r\n\r\n // The currently-playing Animation per target (for restart/reverse).\r\n const current = new Map<string, Animation>();\r\n const cleanups: Array<() => void> = [];\r\n let observer: IntersectionObserver | null = null;\r\n\r\n function makeAnimation(b: Bound, variant: Variant): Animation {\r\n const { anim } = b;\r\n const keyframes = variant === "hold" ? anim.hold : anim.active;\r\n const loops = variant === "active" && (anim.alwaysLoop || props.loop);\r\n return b.el.animate(keyframes, {\r\n duration: (anim.duration / props.speed) * 1000,\r\n delay: ((anim.delay + props.delay) / props.speed) * 1000,\r\n easing: anim.easing,\r\n fill: "forwards",\r\n iterations: loops ? Infinity : 1,\r\n });\r\n }\r\n\r\n /** (Re)start a variant on every target, cancelling any in-flight run. */\r\n function play(variant: Variant): void {\r\n for (const b of bound) {\r\n current.get(b.anim.key)?.cancel();\r\n current.set(b.anim.key, makeAnimation(b, variant));\r\n }\r\n }\r\n\r\n /** Reverse the held pose back to rest (smooth, from the current position). */\r\n function reverseToRest(): void {\r\n for (const b of bound) {\r\n const running = current.get(b.anim.key);\r\n if (running) running.reverse();\r\n }\r\n }\r\n\r\n function on(type: string, handler: EventListener): void {\r\n root.addEventListener(type, handler);\r\n cleanups.push(() => root.removeEventListener(type, handler));\r\n }\r\n\r\n /** Tear down listeners/observers and stop animations (keeps final pose). */\r\n function teardown(): void {\r\n for (const c of cleanups) c();\r\n cleanups.length = 0;\r\n observer?.disconnect();\r\n observer = null;\r\n }\r\n\r\n function setup(): void {\r\n teardown();\r\n\r\n // Accessibility reflects interactivity and stays in sync with `trigger`.\r\n if (props.trigger === "click") {\r\n root.setAttribute("role", "button");\r\n root.setAttribute("tabindex", "0");\r\n } else {\r\n root.setAttribute("role", "img");\r\n root.removeAttribute("tabindex");\r\n }\r\n\r\n // Continuous specs and autoplay start immediately.\r\n if (plan.continuous || props.trigger === "autoplay") play("active");\r\n\r\n switch (props.trigger) {\r\n case "hover":\r\n on("mouseenter", () => play("active"));\r\n on("focus", () => play("active"));\r\n break;\r\n case "hoverHold":\r\n on("mouseenter", () => play("hold"));\r\n on("mouseleave", () => reverseToRest());\r\n on("focus", () => play("hold"));\r\n on("blur", () => reverseToRest());\r\n break;\r\n case "click":\r\n on("click", () => play("active"));\r\n on("keydown", (e) => {\r\n const key = (e as KeyboardEvent).key;\r\n if (key === "Enter" || key === " ") {\r\n e.preventDefault();\r\n play("active");\r\n }\r\n });\r\n break;\r\n case "inView":\r\n observer = new IntersectionObserver(\r\n (entries) => {\r\n if (entries.some((entry) => entry.isIntersecting)) {\r\n play("active");\r\n observer?.disconnect();\r\n observer = null;\r\n }\r\n },\r\n { threshold: 0.5 },\r\n );\r\n observer.observe(root);\r\n break;\r\n }\r\n }\r\n\r\n setup();\r\n\r\n return {\r\n update(next: IconRuntimeProps) {\r\n props = next;\r\n // Reset every target to rest before re-wiring for the new props.\r\n for (const a of current.values()) a.cancel();\r\n current.clear();\r\n setup();\r\n },\r\n destroy() {\r\n teardown();\r\n for (const a of current.values()) a.cancel();\r\n current.clear();\r\n },\r\n };\r\n}\r\n';
454
454
 
455
455
  // lib/generators/vue.ts
456
456
  var DEFAULT_VUE_IMPORT_PATH = "@/components/icons";
@@ -518,7 +518,7 @@ function styleAttr(style) {
518
518
  return s ? ` style="${s}"` : "";
519
519
  }
520
520
  function shapeMarkup(node) {
521
- const draw = node.drawKey ? ` data-flux="${node.drawKey}" pathLength="1" style="stroke-dasharray: 1"` : "";
521
+ const draw = node.drawKey ? ` data-rehover="${node.drawKey}" pathLength="1" style="stroke-dasharray: 1"` : "";
522
522
  const d = node.data;
523
523
  switch (d.type) {
524
524
  case "path":
@@ -534,7 +534,7 @@ function shapeMarkup(node) {
534
534
  function nodeMarkup(node, indent) {
535
535
  if (node.kind === "shape") return shapeMarkup(node);
536
536
  const child = nodeMarkup(node.child, `${indent} `);
537
- return `<g data-flux="${node.key}"${styleAttr(node.style)}>
537
+ return `<g data-rehover="${node.key}"${styleAttr(node.style)}>
538
538
  ${indent} ${child}
539
539
  ${indent}</g>`;
540
540
  }
@@ -639,7 +639,7 @@ onUnmounted(() => controller?.destroy())
639
639
  importStatement: `import ${name} from '@/components/icons/${name}.vue';`,
640
640
  usageSnippet: `<${name} />`,
641
641
  dependencies: "none \u2014 self-contained (no npm install)",
642
- runtime: { filename: `${RUNTIME_FILENAME}.ts`, code: FLUX_RUNTIME_TS }
642
+ runtime: { filename: `${RUNTIME_FILENAME}.ts`, code: REHOVER_RUNTIME_TS }
643
643
  };
644
644
  }
645
645
  };
@@ -807,6 +807,200 @@ var metadata3 = {
807
807
  animationDescription: "The bell rocks back and forth around its top mount, settling to center."
808
808
  };
809
809
 
810
+ // icons/brain/paths.ts
811
+ var brainPaths = {
812
+ leftHalf: {
813
+ type: "path",
814
+ d: "M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"
815
+ },
816
+ rightHalf: {
817
+ type: "path",
818
+ d: "M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"
819
+ },
820
+ veinCenter: { type: "path", d: "M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4" },
821
+ veinTopRight: { type: "path", d: "M17.599 6.5A3 3 0 0 0 13.6 3.4" },
822
+ veinTopLeft: { type: "path", d: "M6.4 6.5A3 3 0 0 1 10.4 3.4" },
823
+ veinMiddleRight: { type: "path", d: "M18.5 10.5A2.5 2.5 0 0 0 15 9" },
824
+ veinMiddleLeft: { type: "path", d: "M5.5 10.5A2.5 2.5 0 0 1 9 9" },
825
+ veinBottomRight: { type: "path", d: "M16.5 15.5A2.5 2.5 0 0 0 13 16" },
826
+ veinBottomLeft: { type: "path", d: "M7.5 15.5A2.5 2.5 0 0 1 11 16" }
827
+ };
828
+
829
+ // icons/brain/animation.spec.ts
830
+ var brainSpec = {
831
+ elements: {
832
+ leftHalf: { id: "brain-left-half", description: "Left hemisphere outline" },
833
+ rightHalf: {
834
+ id: "brain-right-half",
835
+ description: "Right hemisphere outline"
836
+ },
837
+ veinCenter: {
838
+ id: "brain-vein-center",
839
+ description: "Central neural pathway"
840
+ },
841
+ veinTopLeft: {
842
+ id: "brain-vein-top-left",
843
+ description: "Top left neural pathway"
844
+ },
845
+ veinTopRight: {
846
+ id: "brain-vein-top-right",
847
+ description: "Top right neural pathway"
848
+ },
849
+ veinMiddleLeft: {
850
+ id: "brain-vein-middle-left",
851
+ description: "Middle left neural pathway"
852
+ },
853
+ veinMiddleRight: {
854
+ id: "brain-vein-middle-right",
855
+ description: "Middle right neural pathway"
856
+ },
857
+ veinBottomLeft: {
858
+ id: "brain-vein-bottom-left",
859
+ description: "Bottom left neural pathway"
860
+ },
861
+ veinBottomRight: {
862
+ id: "brain-vein-bottom-right",
863
+ description: "Bottom right neural pathway"
864
+ }
865
+ },
866
+ sequences: {
867
+ trigger: [
868
+ {
869
+ element: "veinCenter",
870
+ property: "pathLength",
871
+ values: [1, 0, 1],
872
+ duration: 1.5,
873
+ ease: "easeInOut"
874
+ },
875
+ {
876
+ element: "veinCenter",
877
+ property: "opacity",
878
+ values: [1, 0.2, 1],
879
+ duration: 1.5,
880
+ ease: "easeInOut"
881
+ },
882
+ {
883
+ element: "veinTopRight",
884
+ property: "pathLength",
885
+ values: [1, 0, 1],
886
+ duration: 1.5,
887
+ delay: 0.3,
888
+ ease: "easeInOut"
889
+ },
890
+ {
891
+ element: "veinTopRight",
892
+ property: "opacity",
893
+ values: [1, 0.2, 1],
894
+ duration: 1.5,
895
+ delay: 0.3,
896
+ ease: "easeInOut"
897
+ },
898
+ {
899
+ element: "veinTopLeft",
900
+ property: "pathLength",
901
+ values: [1, 0, 1],
902
+ duration: 1.5,
903
+ delay: 0.3,
904
+ ease: "easeInOut"
905
+ },
906
+ {
907
+ element: "veinTopLeft",
908
+ property: "opacity",
909
+ values: [1, 0.2, 1],
910
+ duration: 1.5,
911
+ delay: 0.3,
912
+ ease: "easeInOut"
913
+ },
914
+ {
915
+ element: "veinMiddleRight",
916
+ property: "pathLength",
917
+ values: [1, 0, 1],
918
+ duration: 1.5,
919
+ delay: 0.6,
920
+ ease: "easeInOut"
921
+ },
922
+ {
923
+ element: "veinMiddleRight",
924
+ property: "opacity",
925
+ values: [1, 0.2, 1],
926
+ duration: 1.5,
927
+ delay: 0.6,
928
+ ease: "easeInOut"
929
+ },
930
+ {
931
+ element: "veinMiddleLeft",
932
+ property: "pathLength",
933
+ values: [1, 0, 1],
934
+ duration: 1.5,
935
+ delay: 0.6,
936
+ ease: "easeInOut"
937
+ },
938
+ {
939
+ element: "veinMiddleLeft",
940
+ property: "opacity",
941
+ values: [1, 0.2, 1],
942
+ duration: 1.5,
943
+ delay: 0.6,
944
+ ease: "easeInOut"
945
+ },
946
+ {
947
+ element: "veinBottomRight",
948
+ property: "pathLength",
949
+ values: [1, 0, 1],
950
+ duration: 1.5,
951
+ delay: 0.9,
952
+ ease: "easeInOut"
953
+ },
954
+ {
955
+ element: "veinBottomRight",
956
+ property: "opacity",
957
+ values: [1, 0.2, 1],
958
+ duration: 1.5,
959
+ delay: 0.9,
960
+ ease: "easeInOut"
961
+ },
962
+ {
963
+ element: "veinBottomLeft",
964
+ property: "pathLength",
965
+ values: [1, 0, 1],
966
+ duration: 1.5,
967
+ delay: 0.9,
968
+ ease: "easeInOut"
969
+ },
970
+ {
971
+ element: "veinBottomLeft",
972
+ property: "opacity",
973
+ values: [1, 0.2, 1],
974
+ duration: 1.5,
975
+ delay: 0.9,
976
+ ease: "easeInOut"
977
+ }
978
+ ]
979
+ },
980
+ defaultTrigger: "inView",
981
+ defaultLoop: true
982
+ };
983
+ var animation_spec_default4 = brainSpec;
984
+
985
+ // icons/brain/metadata.ts
986
+ var metadata4 = {
987
+ name: "Brain",
988
+ slug: "brain",
989
+ category: "Technology",
990
+ tags: [
991
+ "brain",
992
+ "ai",
993
+ "artificial intelligence",
994
+ "mind",
995
+ "neural",
996
+ "thinking",
997
+ "machine learning"
998
+ ],
999
+ featured: false,
1000
+ description: "A brain symbolizing artificial intelligence and neural networks.",
1001
+ animationDescription: "The internal neural pathways sequentially pulse and redraw, representing active thinking and data processing."
1002
+ };
1003
+
810
1004
  // icons/card-flip/paths.ts
811
1005
  var cardFlipPaths = {
812
1006
  // Rounded card outline spanning x:4–20, y:6–18.
@@ -850,10 +1044,10 @@ var cardFlipSpec = {
850
1044
  defaultTrigger: "hoverHold",
851
1045
  perspective: 500
852
1046
  };
853
- var animation_spec_default4 = cardFlipSpec;
1047
+ var animation_spec_default5 = cardFlipSpec;
854
1048
 
855
1049
  // icons/card-flip/metadata.ts
856
- var metadata4 = {
1050
+ var metadata5 = {
857
1051
  name: "CardFlip",
858
1052
  slug: "card-flip",
859
1053
  category: "Objects",
@@ -897,10 +1091,10 @@ var checkSpec = {
897
1091
  },
898
1092
  defaultTrigger: "hover"
899
1093
  };
900
- var animation_spec_default5 = checkSpec;
1094
+ var animation_spec_default6 = checkSpec;
901
1095
 
902
1096
  // icons/check/metadata.ts
903
- var metadata5 = {
1097
+ var metadata6 = {
904
1098
  name: "Check",
905
1099
  slug: "check",
906
1100
  category: "Status",
@@ -945,10 +1139,10 @@ var clockSpec = {
945
1139
  },
946
1140
  defaultTrigger: "hoverHold"
947
1141
  };
948
- var animation_spec_default6 = clockSpec;
1142
+ var animation_spec_default7 = clockSpec;
949
1143
 
950
1144
  // icons/clock/metadata.ts
951
- var metadata6 = {
1145
+ var metadata7 = {
952
1146
  name: "Clock",
953
1147
  slug: "clock",
954
1148
  category: "Time",
@@ -960,75 +1154,48 @@ var metadata6 = {
960
1154
 
961
1155
  // icons/creating-file/paths.ts
962
1156
  var creatingFilePaths = {
963
- file: {
964
- type: "path",
965
- d: "M8 3h6l5 5v13H8a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2Z"
966
- },
967
- fold: {
968
- type: "path",
969
- d: "M10 11l1-.8 1.2 1.4 1-.9 1.2 1"
970
- },
971
- lineTop: {
972
- type: "path",
973
- d: "M10 11l1-.7 1.1 1.2 1-.8 1.2.9H16"
974
- },
975
- lineMiddle: {
976
- type: "path",
977
- d: "M10 14l.9-.5 1.2 1.5 1-.9 1.1.6H15"
978
- },
979
- lineBottom: {
980
- type: "path",
981
- d: "M10 17l1-.6 1 1 1.1-.7 1.1.8H16"
982
- }
1157
+ outline: { type: "path", d: "M6 4L14 4L18 8L18 20L6 20L6 4" },
1158
+ fold: { type: "path", d: "M14 4L14 8L18 8" },
1159
+ line1: { type: "path", d: "M9 10L15 10" },
1160
+ line2: { type: "path", d: "M9 13L15 13" },
1161
+ line3: { type: "path", d: "M9 16L12 16" }
983
1162
  };
984
1163
 
985
1164
  // icons/creating-file/animation.spec.ts
986
1165
  var creatingFileSpec = {
987
1166
  elements: {
988
- file: {
989
- id: "creating-file-file",
990
- description: "Document outline"
991
- },
992
- fold: {
993
- id: "creating-file-fold",
994
- description: "Folded page corner"
1167
+ outline: {
1168
+ id: "creating-file-outline",
1169
+ description: "File outline with folded corner"
995
1170
  },
996
- lineTop: {
997
- id: "creating-file-lineTop",
998
- description: "Top content line"
999
- },
1000
- lineMiddle: {
1001
- id: "creating-file-lineMiddle",
1002
- description: "Middle content line"
1003
- },
1004
- lineBottom: {
1005
- id: "creating-file-lineBottom",
1006
- description: "Bottom content line"
1007
- }
1171
+ fold: { id: "creating-file-fold", description: "Folded corner detail" },
1172
+ line1: { id: "creating-file-line1", description: "First text line" },
1173
+ line2: { id: "creating-file-line2", description: "Second text line" },
1174
+ line3: { id: "creating-file-line3", description: "Third text line" }
1008
1175
  },
1009
1176
  sequences: {
1010
1177
  trigger: [
1011
1178
  {
1012
- element: "lineTop",
1179
+ element: "line1",
1013
1180
  property: "opacity",
1014
- values: [0.3, 1, 0.3],
1015
- duration: 0.35,
1181
+ values: [1, 0.3, 1],
1182
+ duration: 0.6,
1016
1183
  ease: "easeInOut"
1017
1184
  },
1018
1185
  {
1019
- element: "lineMiddle",
1186
+ element: "line2",
1020
1187
  property: "opacity",
1021
- values: [0.3, 1, 0.3],
1022
- duration: 0.35,
1023
- delay: 0.12,
1188
+ values: [1, 0.3, 1],
1189
+ duration: 0.6,
1190
+ delay: 0.2,
1024
1191
  ease: "easeInOut"
1025
1192
  },
1026
1193
  {
1027
- element: "lineBottom",
1194
+ element: "line3",
1028
1195
  property: "opacity",
1029
- values: [0.3, 1, 0.3],
1030
- duration: 0.35,
1031
- delay: 0.24,
1196
+ values: [1, 0.3, 1],
1197
+ duration: 0.6,
1198
+ delay: 0.4,
1032
1199
  ease: "easeInOut"
1033
1200
  }
1034
1201
  ]
@@ -1036,10 +1203,10 @@ var creatingFileSpec = {
1036
1203
  defaultTrigger: "inView",
1037
1204
  defaultLoop: true
1038
1205
  };
1039
- var animation_spec_default7 = creatingFileSpec;
1206
+ var animation_spec_default8 = creatingFileSpec;
1040
1207
 
1041
1208
  // icons/creating-file/metadata.ts
1042
- var metadata7 = {
1209
+ var metadata8 = {
1043
1210
  name: "CreatingFile",
1044
1211
  slug: "creating-file",
1045
1212
  category: "AI",
@@ -1100,10 +1267,10 @@ var doorSpec = {
1100
1267
  defaultTrigger: "hoverHold",
1101
1268
  perspective: 500
1102
1269
  };
1103
- var animation_spec_default8 = doorSpec;
1270
+ var animation_spec_default9 = doorSpec;
1104
1271
 
1105
1272
  // icons/door/metadata.ts
1106
- var metadata8 = {
1273
+ var metadata9 = {
1107
1274
  name: "Door",
1108
1275
  slug: "door",
1109
1276
  category: "Objects",
@@ -1154,10 +1321,10 @@ var downloadSpec = {
1154
1321
  },
1155
1322
  defaultTrigger: "hoverHold"
1156
1323
  };
1157
- var animation_spec_default9 = downloadSpec;
1324
+ var animation_spec_default10 = downloadSpec;
1158
1325
 
1159
1326
  // icons/download/metadata.ts
1160
- var metadata9 = {
1327
+ var metadata10 = {
1161
1328
  name: "Download",
1162
1329
  slug: "download",
1163
1330
  category: "Actions",
@@ -1235,10 +1402,10 @@ var externalLinkSpec = {
1235
1402
  },
1236
1403
  defaultTrigger: "hoverHold"
1237
1404
  };
1238
- var animation_spec_default10 = externalLinkSpec;
1405
+ var animation_spec_default11 = externalLinkSpec;
1239
1406
 
1240
1407
  // icons/external-link/metadata.ts
1241
- var metadata10 = {
1408
+ var metadata11 = {
1242
1409
  name: "ExternalLink",
1243
1410
  slug: "external-link",
1244
1411
  category: "Uncategorized",
@@ -1282,10 +1449,10 @@ var eyeSpec = {
1282
1449
  },
1283
1450
  defaultTrigger: "hoverHold"
1284
1451
  };
1285
- var animation_spec_default11 = eyeSpec;
1452
+ var animation_spec_default12 = eyeSpec;
1286
1453
 
1287
1454
  // icons/eye/metadata.ts
1288
- var metadata11 = {
1455
+ var metadata12 = {
1289
1456
  name: "Eye",
1290
1457
  slug: "eye",
1291
1458
  category: "Visibility",
@@ -1322,10 +1489,10 @@ var heartSpec = {
1322
1489
  },
1323
1490
  defaultTrigger: "hover"
1324
1491
  };
1325
- var animation_spec_default12 = heartSpec;
1492
+ var animation_spec_default13 = heartSpec;
1326
1493
 
1327
1494
  // icons/heart/metadata.ts
1328
- var metadata12 = {
1495
+ var metadata13 = {
1329
1496
  name: "Heart",
1330
1497
  slug: "heart",
1331
1498
  category: "Social",
@@ -1373,10 +1540,10 @@ var helpSpec = {
1373
1540
  },
1374
1541
  defaultTrigger: "hover"
1375
1542
  };
1376
- var animation_spec_default13 = helpSpec;
1543
+ var animation_spec_default14 = helpSpec;
1377
1544
 
1378
1545
  // icons/help/metadata.ts
1379
- var metadata13 = {
1546
+ var metadata14 = {
1380
1547
  name: "Help",
1381
1548
  slug: "help",
1382
1549
  category: "Interface",
@@ -1450,10 +1617,10 @@ var layersSpec = {
1450
1617
  },
1451
1618
  defaultTrigger: "hover"
1452
1619
  };
1453
- var animation_spec_default14 = layersSpec;
1620
+ var animation_spec_default15 = layersSpec;
1454
1621
 
1455
1622
  // icons/layers/metadata.ts
1456
- var metadata14 = {
1623
+ var metadata15 = {
1457
1624
  name: "Layers",
1458
1625
  slug: "layers",
1459
1626
  category: "Interface",
@@ -1490,10 +1657,10 @@ var refreshSpec = {
1490
1657
  },
1491
1658
  defaultTrigger: "hover"
1492
1659
  };
1493
- var animation_spec_default15 = refreshSpec;
1660
+ var animation_spec_default16 = refreshSpec;
1494
1661
 
1495
1662
  // icons/refresh/metadata.ts
1496
- var metadata15 = {
1663
+ var metadata16 = {
1497
1664
  name: "Refresh",
1498
1665
  slug: "refresh",
1499
1666
  category: "Interface",
@@ -1549,10 +1716,10 @@ var searchSpec = {
1549
1716
  },
1550
1717
  defaultTrigger: "hover"
1551
1718
  };
1552
- var animation_spec_default16 = searchSpec;
1719
+ var animation_spec_default17 = searchSpec;
1553
1720
 
1554
1721
  // icons/search/metadata.ts
1555
- var metadata16 = {
1722
+ var metadata17 = {
1556
1723
  name: "Search",
1557
1724
  slug: "search",
1558
1725
  category: "Interface",
@@ -1616,10 +1783,10 @@ var signalSpec = {
1616
1783
  },
1617
1784
  defaultTrigger: "hover"
1618
1785
  };
1619
- var animation_spec_default17 = signalSpec;
1786
+ var animation_spec_default18 = signalSpec;
1620
1787
 
1621
1788
  // icons/signal/metadata.ts
1622
- var metadata17 = {
1789
+ var metadata18 = {
1623
1790
  name: "Signal",
1624
1791
  slug: "signal",
1625
1792
  category: "Communication",
@@ -1629,6 +1796,75 @@ var metadata17 = {
1629
1796
  animationDescription: "The bars compress and spring back in a staggered cascade, like a pulse sweeping across the signal."
1630
1797
  };
1631
1798
 
1799
+ // icons/syncing/paths.ts
1800
+ var syncingPaths = {
1801
+ arrowOuter: {
1802
+ type: "path",
1803
+ d: "M 21 12 A 9 9 0 1 1 12 3 C 14.52 3 16.93 4 18.74 5.74 L 21 8 M 21 3 v 5 h -5"
1804
+ },
1805
+ arrowInner: {
1806
+ type: "path",
1807
+ d: "M 7 12 A 5 5 0 1 0 12 17 C 10.6 17 9.26 16.44 8.26 15.47 L 7 14 M 12 14 h -5 v 5"
1808
+ }
1809
+ };
1810
+
1811
+ // icons/syncing/animation.spec.ts
1812
+ var syncingSpec = {
1813
+ elements: {
1814
+ arrowOuter: {
1815
+ id: "syncing-arrow-outer",
1816
+ description: "Outer clockwise arrow"
1817
+ },
1818
+ arrowInner: {
1819
+ id: "syncing-arrow-inner",
1820
+ description: "Inner counter-clockwise arrow"
1821
+ }
1822
+ },
1823
+ sequences: {
1824
+ trigger: [
1825
+ {
1826
+ element: "arrowOuter",
1827
+ property: "rotate",
1828
+ values: [0, 360, 360],
1829
+ duration: 2.2,
1830
+ ease: "easeInOut",
1831
+ origin: { x: 12, y: 12 }
1832
+ },
1833
+ {
1834
+ element: "arrowInner",
1835
+ property: "rotate",
1836
+ values: [0, -360, -360],
1837
+ duration: 2.2,
1838
+ ease: "easeInOut",
1839
+ origin: { x: 12, y: 12 }
1840
+ }
1841
+ ]
1842
+ },
1843
+ defaultTrigger: "inView",
1844
+ defaultLoop: true
1845
+ };
1846
+ var animation_spec_default19 = syncingSpec;
1847
+
1848
+ // icons/syncing/metadata.ts
1849
+ var metadata19 = {
1850
+ name: "Syncing",
1851
+ slug: "syncing",
1852
+ category: "System",
1853
+ tags: [
1854
+ "sync",
1855
+ "syncing",
1856
+ "refresh",
1857
+ "update",
1858
+ "loading",
1859
+ "process",
1860
+ "arrows",
1861
+ "cycle"
1862
+ ],
1863
+ featured: false,
1864
+ description: "Two concentric arrows indicating synchronization or background processing.",
1865
+ animationDescription: "The two circular arrows rotate around a shared center in opposite directions, then align briefly before continuing."
1866
+ };
1867
+
1632
1868
  // icons/user/paths.ts
1633
1869
  var userPaths = {
1634
1870
  shape: {
@@ -1666,10 +1902,10 @@ var userSpec = {
1666
1902
  },
1667
1903
  defaultTrigger: "hover"
1668
1904
  };
1669
- var animation_spec_default18 = userSpec;
1905
+ var animation_spec_default20 = userSpec;
1670
1906
 
1671
1907
  // icons/user/metadata.ts
1672
- var metadata18 = {
1908
+ var metadata20 = {
1673
1909
  name: "User",
1674
1910
  slug: "user",
1675
1911
  category: "Uncategorized",
@@ -1720,10 +1956,10 @@ var wifiSpec = {
1720
1956
  },
1721
1957
  defaultTrigger: "hover"
1722
1958
  };
1723
- var animation_spec_default19 = wifiSpec;
1959
+ var animation_spec_default21 = wifiSpec;
1724
1960
 
1725
1961
  // icons/wifi/metadata.ts
1726
- var metadata19 = {
1962
+ var metadata21 = {
1727
1963
  name: "Wifi",
1728
1964
  slug: "wifi",
1729
1965
  category: "Connectivity",
@@ -1738,22 +1974,24 @@ var ICON_SOURCES = {
1738
1974
  "badge-check": { paths: badgeCheckPaths, spec: animation_spec_default, metadata },
1739
1975
  "ball": { paths: ballPaths, spec: animation_spec_default2, metadata: metadata2 },
1740
1976
  "bell": { paths: bellPaths, spec: animation_spec_default3, metadata: metadata3 },
1741
- "card-flip": { paths: cardFlipPaths, spec: animation_spec_default4, metadata: metadata4 },
1742
- "check": { paths: checkPaths, spec: animation_spec_default5, metadata: metadata5 },
1743
- "clock": { paths: clockPaths, spec: animation_spec_default6, metadata: metadata6 },
1744
- "creating-file": { paths: creatingFilePaths, spec: animation_spec_default7, metadata: metadata7 },
1745
- "door": { paths: doorPaths, spec: animation_spec_default8, metadata: metadata8 },
1746
- "download": { paths: downloadPaths, spec: animation_spec_default9, metadata: metadata9 },
1747
- "external-link": { paths: externalLinkPaths, spec: animation_spec_default10, metadata: metadata10 },
1748
- "eye": { paths: eyePaths, spec: animation_spec_default11, metadata: metadata11 },
1749
- "heart": { paths: heartPaths, spec: animation_spec_default12, metadata: metadata12 },
1750
- "help": { paths: helpPaths, spec: animation_spec_default13, metadata: metadata13 },
1751
- "layers": { paths: layersPaths, spec: animation_spec_default14, metadata: metadata14 },
1752
- "refresh": { paths: refreshPaths, spec: animation_spec_default15, metadata: metadata15 },
1753
- "search": { paths: searchPaths, spec: animation_spec_default16, metadata: metadata16 },
1754
- "signal": { paths: signalPaths, spec: animation_spec_default17, metadata: metadata17 },
1755
- "user": { paths: userPaths, spec: animation_spec_default18, metadata: metadata18 },
1756
- "wifi": { paths: wifiPaths, spec: animation_spec_default19, metadata: metadata19 }
1977
+ "brain": { paths: brainPaths, spec: animation_spec_default4, metadata: metadata4 },
1978
+ "card-flip": { paths: cardFlipPaths, spec: animation_spec_default5, metadata: metadata5 },
1979
+ "check": { paths: checkPaths, spec: animation_spec_default6, metadata: metadata6 },
1980
+ "clock": { paths: clockPaths, spec: animation_spec_default7, metadata: metadata7 },
1981
+ "creating-file": { paths: creatingFilePaths, spec: animation_spec_default8, metadata: metadata8 },
1982
+ "door": { paths: doorPaths, spec: animation_spec_default9, metadata: metadata9 },
1983
+ "download": { paths: downloadPaths, spec: animation_spec_default10, metadata: metadata10 },
1984
+ "external-link": { paths: externalLinkPaths, spec: animation_spec_default11, metadata: metadata11 },
1985
+ "eye": { paths: eyePaths, spec: animation_spec_default12, metadata: metadata12 },
1986
+ "heart": { paths: heartPaths, spec: animation_spec_default13, metadata: metadata13 },
1987
+ "help": { paths: helpPaths, spec: animation_spec_default14, metadata: metadata14 },
1988
+ "layers": { paths: layersPaths, spec: animation_spec_default15, metadata: metadata15 },
1989
+ "refresh": { paths: refreshPaths, spec: animation_spec_default16, metadata: metadata16 },
1990
+ "search": { paths: searchPaths, spec: animation_spec_default17, metadata: metadata17 },
1991
+ "signal": { paths: signalPaths, spec: animation_spec_default18, metadata: metadata18 },
1992
+ "syncing": { paths: syncingPaths, spec: animation_spec_default19, metadata: metadata19 },
1993
+ "user": { paths: userPaths, spec: animation_spec_default20, metadata: metadata20 },
1994
+ "wifi": { paths: wifiPaths, spec: animation_spec_default21, metadata: metadata21 }
1757
1995
  };
1758
1996
 
1759
1997
  // lib/icon-sources.ts