@zentauri-ui/zentauri-components 1.8.4 → 1.8.42

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 (118) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +73 -63
  4. package/dist/animations/blur-in.js +2 -2
  5. package/dist/animations/blur-in.mjs +1 -1
  6. package/dist/animations/blur-out.js +2 -2
  7. package/dist/animations/blur-out.mjs +1 -1
  8. package/dist/animations/bounce.js +2 -2
  9. package/dist/animations/bounce.mjs +1 -1
  10. package/dist/animations/fade-down.js +2 -2
  11. package/dist/animations/fade-down.mjs +1 -1
  12. package/dist/animations/fade-in.js +2 -2
  13. package/dist/animations/fade-in.mjs +1 -1
  14. package/dist/animations/fade-left.js +2 -2
  15. package/dist/animations/fade-left.mjs +1 -1
  16. package/dist/animations/fade-out.js +2 -2
  17. package/dist/animations/fade-out.mjs +1 -1
  18. package/dist/animations/fade-right.js +2 -2
  19. package/dist/animations/fade-right.mjs +1 -1
  20. package/dist/animations/fade-up.js +2 -2
  21. package/dist/animations/fade-up.mjs +1 -1
  22. package/dist/animations/flip-in.js +2 -2
  23. package/dist/animations/flip-in.mjs +1 -1
  24. package/dist/animations/flip.js +2 -2
  25. package/dist/animations/flip.mjs +1 -1
  26. package/dist/animations/float.js +2 -2
  27. package/dist/animations/float.mjs +1 -1
  28. package/dist/animations/hover-lift.js +2 -2
  29. package/dist/animations/hover-lift.mjs +1 -1
  30. package/dist/animations/hover-scale.js +2 -2
  31. package/dist/animations/hover-scale.mjs +1 -1
  32. package/dist/animations/magnetic.js +2 -2
  33. package/dist/animations/magnetic.mjs +1 -1
  34. package/dist/animations/parallax.js +2 -2
  35. package/dist/animations/parallax.mjs +1 -1
  36. package/dist/animations/ping.js +2 -2
  37. package/dist/animations/ping.mjs +1 -1
  38. package/dist/animations/pop-in.js +2 -2
  39. package/dist/animations/pop-in.mjs +1 -1
  40. package/dist/animations/press.js +2 -2
  41. package/dist/animations/press.mjs +1 -1
  42. package/dist/animations/progress.js +2 -2
  43. package/dist/animations/progress.mjs +1 -1
  44. package/dist/animations/pulse.js +2 -2
  45. package/dist/animations/pulse.mjs +1 -1
  46. package/dist/animations/reorder.js +2 -2
  47. package/dist/animations/reorder.mjs +1 -1
  48. package/dist/animations/reveal-blur.js +2 -2
  49. package/dist/animations/reveal-blur.mjs +1 -1
  50. package/dist/animations/reveal-down.js +2 -2
  51. package/dist/animations/reveal-down.mjs +1 -1
  52. package/dist/animations/reveal-left.js +2 -2
  53. package/dist/animations/reveal-left.mjs +1 -1
  54. package/dist/animations/reveal-right.js +2 -2
  55. package/dist/animations/reveal-right.mjs +1 -1
  56. package/dist/animations/reveal-up.js +2 -2
  57. package/dist/animations/reveal-up.mjs +1 -1
  58. package/dist/animations/rotate-in.js +2 -2
  59. package/dist/animations/rotate-in.mjs +1 -1
  60. package/dist/animations/scale-in.js +2 -2
  61. package/dist/animations/scale-in.mjs +1 -1
  62. package/dist/animations/scale-out.js +2 -2
  63. package/dist/animations/scale-out.mjs +1 -1
  64. package/dist/animations/shake.js +2 -2
  65. package/dist/animations/shake.mjs +1 -1
  66. package/dist/animations/shared/create-motion-animation.d.ts.map +1 -1
  67. package/dist/animations/shared/index.d.ts +1 -1
  68. package/dist/animations/shared/index.d.ts.map +1 -1
  69. package/dist/animations/shared/types.d.ts +3 -1
  70. package/dist/animations/shared/types.d.ts.map +1 -1
  71. package/dist/animations/skeleton-shimmer.js +2 -2
  72. package/dist/animations/skeleton-shimmer.mjs +1 -1
  73. package/dist/animations/slide-down.js +2 -2
  74. package/dist/animations/slide-down.mjs +1 -1
  75. package/dist/animations/slide-left.js +2 -2
  76. package/dist/animations/slide-left.mjs +1 -1
  77. package/dist/animations/slide-right.js +2 -2
  78. package/dist/animations/slide-right.mjs +1 -1
  79. package/dist/animations/slide-up.js +2 -2
  80. package/dist/animations/slide-up.mjs +1 -1
  81. package/dist/animations/spin.js +2 -2
  82. package/dist/animations/spin.mjs +1 -1
  83. package/dist/animations/text-reveal.js +2 -2
  84. package/dist/animations/text-reveal.mjs +1 -1
  85. package/dist/animations/text-shimmer.js +2 -2
  86. package/dist/animations/text-shimmer.mjs +1 -1
  87. package/dist/animations/tilt.js +2 -2
  88. package/dist/animations/tilt.mjs +1 -1
  89. package/dist/animations/wiggle.js +2 -2
  90. package/dist/animations/wiggle.mjs +1 -1
  91. package/dist/{chunk-AACGI7FX.mjs → chunk-7OVJXYSS.mjs} +16 -5
  92. package/dist/chunk-7OVJXYSS.mjs.map +1 -0
  93. package/dist/{chunk-VARQ7W4G.mjs → chunk-C6NA452Q.mjs} +43 -2
  94. package/dist/chunk-C6NA452Q.mjs.map +1 -0
  95. package/dist/{chunk-JFS5PJSH.js → chunk-OKCC7E36.js} +43 -2
  96. package/dist/chunk-OKCC7E36.js.map +1 -0
  97. package/dist/{chunk-ODZM25II.js → chunk-R5LL56ZO.js} +16 -5
  98. package/dist/chunk-R5LL56ZO.js.map +1 -0
  99. package/dist/ui/buttons/button-base.d.ts +1 -1
  100. package/dist/ui/buttons/button-base.d.ts.map +1 -1
  101. package/dist/ui/buttons/types.d.ts +16 -2
  102. package/dist/ui/buttons/types.d.ts.map +1 -1
  103. package/dist/ui/buttons.js +2 -2
  104. package/dist/ui/buttons.mjs +1 -1
  105. package/dist/ui/dynamic-stepper.js +3 -3
  106. package/dist/ui/dynamic-stepper.mjs +1 -1
  107. package/package.json +30 -1
  108. package/src/animations/animations.test.tsx +113 -1
  109. package/src/animations/shared/create-motion-animation.tsx +33 -3
  110. package/src/animations/shared/index.ts +5 -1
  111. package/src/animations/shared/types.ts +9 -1
  112. package/src/ui/buttons/button-base.tsx +53 -0
  113. package/src/ui/buttons/button.test.tsx +40 -0
  114. package/src/ui/buttons/types.ts +25 -2
  115. package/dist/chunk-AACGI7FX.mjs.map +0 -1
  116. package/dist/chunk-JFS5PJSH.js.map +0 -1
  117. package/dist/chunk-ODZM25II.js.map +0 -1
  118. package/dist/chunk-VARQ7W4G.mjs.map +0 -1
@@ -33,6 +33,12 @@ function mergeTargetOverrides(
33
33
  };
34
34
  }
35
35
 
36
+ function isTargetObject(
37
+ target: NonNullable<MotionAnimationProps["whileInView"]>,
38
+ ): target is MotionAnimationPreset["animate"] {
39
+ return target !== null && typeof target === "object" && !Array.isArray(target);
40
+ }
41
+
36
42
  export function createMotionAnimation(
37
43
  displayName: string,
38
44
  slot: string,
@@ -48,6 +54,7 @@ export function createMotionAnimation(
48
54
  transition,
49
55
  layout,
50
56
  whileHover,
57
+ whileInView,
51
58
  whileTap,
52
59
  from,
53
60
  to,
@@ -55,26 +62,49 @@ export function createMotionAnimation(
55
62
  ...rest
56
63
  } = props;
57
64
  const shouldReduceMotion = useReducedMotion();
58
- const resolvedAnimate = animate ?? mergeTargetOverrides(preset.animate, to);
65
+ const resolvedAnimateTarget = mergeTargetOverrides(preset.animate, to);
66
+ const resolvedAnimate = animate ?? resolvedAnimateTarget;
67
+ const shouldAnimateInView = whileInView !== undefined;
68
+ const usesPresetWhileInView = whileInView === true;
69
+ const resolvedWhileInView =
70
+ whileInView === undefined
71
+ ? undefined
72
+ : usesPresetWhileInView
73
+ ? resolvedAnimateTarget
74
+ : isTargetObject(whileInView)
75
+ ? { ...resolvedAnimateTarget, ...whileInView }
76
+ : whileInView;
77
+ const reducedMotionTarget = shouldAnimateInView
78
+ ? resolvedWhileInView
79
+ : resolvedAnimate;
59
80
  const resolvedInitial =
60
81
  initial ??
61
82
  (shouldReduceMotion
62
- ? resolvedAnimate
83
+ ? reducedMotionTarget
63
84
  : mergeTargetOverrides(preset.initial, from));
64
85
  const resolvedExit = exit ?? mergeTargetOverrides(preset.exit, exitTo);
65
86
  const resolvedTransition = transition
66
87
  ? { ...preset.transition, ...transition }
67
88
  : preset.transition;
89
+ const shouldDisableAnimate =
90
+ usesPresetWhileInView || (shouldReduceMotion && shouldAnimateInView);
68
91
 
69
92
  return (
70
93
  <motion.div
71
94
  data-slot={slot}
72
95
  className={cn(className)}
73
96
  initial={resolvedInitial}
74
- animate={resolvedAnimate}
97
+ animate={shouldDisableAnimate ? undefined : resolvedAnimate}
75
98
  exit={resolvedExit}
76
99
  layout={layout ?? preset.layout}
77
100
  whileHover={whileHover ?? preset.whileHover}
101
+ whileInView={
102
+ shouldReduceMotion
103
+ ? undefined
104
+ : shouldAnimateInView
105
+ ? resolvedWhileInView
106
+ : undefined
107
+ }
78
108
  whileTap={whileTap ?? preset.whileTap}
79
109
  transition={resolvedTransition}
80
110
  {...rest}
@@ -1,2 +1,6 @@
1
1
  export { createMotionAnimation } from "./create-motion-animation";
2
- export type { MotionAnimationPreset, MotionAnimationProps } from "./types";
2
+ export type {
3
+ MotionAnimationPreset,
4
+ MotionAnimationProps,
5
+ MotionAnimationWhileInView,
6
+ } from "./types";
@@ -27,8 +27,16 @@ export type MotionAnimationTargetOverrides = {
27
27
  blur?: number | string;
28
28
  };
29
29
 
30
- export type MotionAnimationProps = HTMLMotionProps<"div"> & {
30
+ export type MotionAnimationWhileInView =
31
+ | true
32
+ | HTMLMotionProps<"div">["whileInView"];
33
+
34
+ export type MotionAnimationProps = Omit<
35
+ HTMLMotionProps<"div">,
36
+ "whileInView"
37
+ > & {
31
38
  from?: MotionAnimationTargetOverrides;
32
39
  to?: MotionAnimationTargetOverrides;
33
40
  exitTo?: MotionAnimationTargetOverrides;
41
+ whileInView?: MotionAnimationWhileInView;
34
42
  };
@@ -1,11 +1,64 @@
1
1
  "use client";
2
2
 
3
+ import { cloneElement, isValidElement, type MouseEventHandler } from "react";
4
+
3
5
  import { cn } from "../../lib/utils";
4
6
 
5
7
  import type { ButtonProps } from "./types";
6
8
  import { buttonVariants } from "./variants";
7
9
 
8
10
  export const ButtonBase = (props: ButtonProps) => {
11
+ if ("asChild" in props && props.asChild) {
12
+ const {
13
+ className,
14
+ appearance,
15
+ size,
16
+ children,
17
+ asChild: _asChild,
18
+ disabled,
19
+ onClick,
20
+ ...rest
21
+ } = props;
22
+
23
+ if (!isValidElement<{ className?: string }>(children)) {
24
+ return null;
25
+ }
26
+
27
+ const isNativeButton = children.type === "button";
28
+ const childOnClick = children.props.onClick as
29
+ | MouseEventHandler<HTMLElement>
30
+ | undefined;
31
+ const handleClick: MouseEventHandler<HTMLElement> = (event) => {
32
+ if (disabled) {
33
+ event.preventDefault();
34
+ event.stopPropagation();
35
+ return;
36
+ }
37
+
38
+ onClick?.(event);
39
+ if (!event.defaultPrevented) {
40
+ childOnClick?.(event);
41
+ }
42
+ };
43
+
44
+ return cloneElement(children, {
45
+ ...rest,
46
+ ...children.props,
47
+ ...(disabled
48
+ ? isNativeButton
49
+ ? { disabled: true }
50
+ : { "aria-disabled": true, tabIndex: -1 }
51
+ : null),
52
+ "data-slot": "button",
53
+ onClick: handleClick,
54
+ className: cn(
55
+ buttonVariants({ appearance, size }),
56
+ children.props.className,
57
+ className,
58
+ ),
59
+ });
60
+ }
61
+
9
62
  if (props.as === "link") {
10
63
  const {
11
64
  className,
@@ -449,6 +449,46 @@ describe("Button (component library)", () => {
449
449
  "Link mode must keep the same data-slot contract",
450
450
  ).toBe("A");
451
451
  });
452
+
453
+ it("should style a child anchor without replacing its navigation props", () => {
454
+ render(
455
+ <Button asChild appearance="gradient-teal" size="lg">
456
+ <a href="/preview/installation">Get started</a>
457
+ </Button>,
458
+ );
459
+ const link = screen.getByRole("link", { name: "Get started" });
460
+
461
+ expect(link).toBe(getButtonSlot());
462
+ expect(link).toHaveAttribute("href", "/preview/installation");
463
+ expect(link.className).toMatch(/gradient-teal/);
464
+ });
465
+
466
+ it("should make disabled child anchors inert", async () => {
467
+ const user = userEvent.setup();
468
+ const onClick = vi.fn();
469
+ render(
470
+ <Button asChild disabled onClick={onClick}>
471
+ <a href="/preview/installation">Get started</a>
472
+ </Button>,
473
+ );
474
+ const link = screen.getByRole("link", { name: "Get started" });
475
+
476
+ expect(link).not.toHaveAttribute("disabled");
477
+ expect(link).toHaveAttribute("aria-disabled", "true");
478
+ expect(link).toHaveAttribute("tabindex", "-1");
479
+
480
+ await user.click(link);
481
+ expect(onClick).not.toHaveBeenCalled();
482
+ });
483
+
484
+ it("should forward disabled to native button children", () => {
485
+ render(
486
+ <Button asChild disabled>
487
+ <button type="button">Submit</button>
488
+ </Button>,
489
+ );
490
+ expect(screen.getByRole("button", { name: "Submit" })).toBeDisabled();
491
+ });
452
492
  });
453
493
 
454
494
  describe("props: animation presets (smoke)", () => {
@@ -1,13 +1,36 @@
1
1
  import type { VariantProps } from "class-variance-authority";
2
- import type { ComponentPropsWithRef } from "react";
2
+ import type {
3
+ ComponentPropsWithRef,
4
+ MouseEventHandler,
5
+ ReactElement,
6
+ } from "react";
3
7
 
4
8
  import type { buttonVariants } from "./variants";
5
9
 
6
10
  export type ButtonSharedStatic = VariantProps<typeof buttonVariants>;
7
11
 
8
12
  export type ButtonProps =
13
+ | (ButtonSharedStatic &
14
+ Omit<
15
+ ComponentPropsWithRef<"button">,
16
+ "children" | "onClick" | "ref" | "type"
17
+ > & {
18
+ asChild: true;
19
+ as?: never;
20
+ children: ReactElement<{
21
+ "aria-disabled"?: boolean | "false" | "true";
22
+ className?: string;
23
+ "data-slot"?: string;
24
+ disabled?: boolean;
25
+ onClick?: MouseEventHandler<HTMLElement>;
26
+ tabIndex?: number;
27
+ }>;
28
+ onClick?: MouseEventHandler<HTMLElement>;
29
+ })
9
30
  | (ButtonSharedStatic &
10
31
  ComponentPropsWithRef<"button"> & {
11
32
  as?: "button";
33
+ asChild?: false;
12
34
  })
13
- | (ButtonSharedStatic & ComponentPropsWithRef<"a"> & { as: "link" });
35
+ | (ButtonSharedStatic &
36
+ ComponentPropsWithRef<"a"> & { as: "link"; asChild?: false });
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/shared/create-motion-animation.tsx"],"names":[],"mappings":";;;;AAYA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,QAAQ,KAAK,CAAA,GAAA,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,MAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA,CAAA;AACpD;AAEA,SAAS,oBAAA,CACP,QACA,SAAA,EACA;AACA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,SAAA;AAC1B,EAAA,OAAO;AAAA,IACL,GAAI,UAAU,EAAC;AAAA,IACf,GAAG,IAAA;AAAA,IACH,GAAI,SAAS,MAAA,GAAY,IAAA,GAAO,EAAE,MAAA,EAAQ,eAAA,CAAgB,IAAI,CAAA;AAAE,GAClE;AACF;AAEO,SAAS,qBAAA,CACd,WAAA,EACA,IAAA,EACA,MAAA,EACA;AACA,EAAA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AACJ,IAAA,MAAM,qBAAqB,gBAAA,EAAiB;AAC5C,IAAA,MAAM,eAAA,GAAkB,OAAA,IAAW,oBAAA,CAAqB,MAAA,CAAO,SAAS,EAAE,CAAA;AAC1E,IAAA,MAAM,kBACJ,OAAA,KACC,kBAAA,GACG,kBACA,oBAAA,CAAqB,MAAA,CAAO,SAAS,IAAI,CAAA,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,IAAA,IAAQ,oBAAA,CAAqB,MAAA,CAAO,MAAM,MAAM,CAAA;AACrE,IAAA,MAAM,kBAAA,GAAqB,aACvB,EAAE,GAAG,OAAO,UAAA,EAAY,GAAG,UAAA,EAAW,GACtC,MAAA,CAAO,UAAA;AAEX,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,WAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,QACvB,OAAA,EAAS,eAAA;AAAA,QACT,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,UAAU,MAAA,CAAO,MAAA;AAAA,QACzB,UAAA,EAAY,cAAc,MAAA,CAAO,UAAA;AAAA,QACjC,QAAA,EAAU,YAAY,MAAA,CAAO,QAAA;AAAA,QAC7B,UAAA,EAAY,kBAAA;AAAA,QACX,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,eAAA,CAAgB,WAAA,GAAc,WAAA;AAC9B,EAAA,OAAO,eAAA;AACT","file":"chunk-AACGI7FX.mjs","sourcesContent":["\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n MotionAnimationPreset,\n MotionAnimationProps,\n MotionAnimationTargetOverrides,\n} from \"./types\";\n\nfunction formatBlurValue(value: number | string) {\n if (typeof value === \"number\") {\n return `blur(${value}px)`;\n }\n return value.includes(\"(\") ? value : `blur(${value})`;\n}\n\nfunction mergeTargetOverrides(\n target: MotionAnimationPreset[\"initial\"] | undefined,\n overrides: MotionAnimationTargetOverrides | undefined,\n) {\n if (!overrides) {\n return target;\n }\n\n const { blur, ...rest } = overrides;\n return {\n ...(target ?? {}),\n ...rest,\n ...(blur === undefined ? null : { filter: formatBlurValue(blur) }),\n };\n}\n\nexport function createMotionAnimation(\n displayName: string,\n slot: string,\n preset: MotionAnimationPreset,\n) {\n function MotionAnimation(props: MotionAnimationProps) {\n const {\n children,\n className,\n initial,\n animate,\n exit,\n transition,\n layout,\n whileHover,\n whileTap,\n from,\n to,\n exitTo,\n ...rest\n } = props;\n const shouldReduceMotion = useReducedMotion();\n const resolvedAnimate = animate ?? mergeTargetOverrides(preset.animate, to);\n const resolvedInitial =\n initial ??\n (shouldReduceMotion\n ? resolvedAnimate\n : mergeTargetOverrides(preset.initial, from));\n const resolvedExit = exit ?? mergeTargetOverrides(preset.exit, exitTo);\n const resolvedTransition = transition\n ? { ...preset.transition, ...transition }\n : preset.transition;\n\n return (\n <motion.div\n data-slot={slot}\n className={cn(className)}\n initial={resolvedInitial}\n animate={resolvedAnimate}\n exit={resolvedExit}\n layout={layout ?? preset.layout}\n whileHover={whileHover ?? preset.whileHover}\n whileTap={whileTap ?? preset.whileTap}\n transition={resolvedTransition}\n {...rest}\n >\n {children}\n </motion.div>\n );\n }\n\n MotionAnimation.displayName = displayName;\n return MotionAnimation;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/buttons/button-base.tsx","../src/ui/buttons/button.tsx"],"names":["className","appearance","size","children","ref","rest","jsx","cn","buttonVariants"],"mappings":";;;;;;AAOO,IAAM,UAAA,GAAa,CAAC,KAAA,KAAuB;AAChD,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,SAAA,EAAAA,UAAAA;AAAA,MACA,UAAA,EAAAC,WAAAA;AAAA,MACA,IAAA,EAAAC,KAAAA;AAAA,MACA,QAAA,EAAAC,SAAAA;AAAA,MACA,GAAA,EAAAC,IAAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAGC;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,uBACEC,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAKF,IAAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,qBAAA,GAAwB,MAAA;AAAA,QACnD,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAWG,mBAAA,CAAGC,+BAAA,CAAe,EAAE,UAAA,EAAAP,aAAY,IAAA,EAAAC,KAAAA,EAAM,CAAA,EAAGF,UAAS,CAAA;AAAA,QAC5D,GAAGK,KAAAA;AAAA,QAEH,QAAA,EAAAF;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACEG,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAWC,oBAAGC,+BAAA,CAAe,EAAE,YAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAC5D,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,QAAA;ACtDlB,IAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,uBAAOF,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAChC;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-JFS5PJSH.js","sourcesContent":["\"use client\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { ButtonProps } from \"./types\";\nimport { buttonVariants } from \"./variants\";\n\nexport const ButtonBase = (props: ButtonProps) => {\n if (props.as === \"link\") {\n const {\n className,\n appearance,\n size,\n children,\n ref,\n href,\n target,\n ...rest\n } = props;\n\n return (\n <a\n ref={ref}\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </a>\n );\n }\n\n const {\n className,\n appearance,\n size,\n type = \"button\",\n children,\n ref,\n ...rest\n } = props;\n\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </button>\n );\n};\n\nButtonBase.displayName = \"Button\";\n","// button.tsx — default static entry (no framer-motion)\nimport { ButtonBase } from \"./button-base\";\nimport type { ButtonProps } from \"./types\";\n\nexport const Button = (props: ButtonProps) => {\n return <ButtonBase {...props} />;\n};\n\nButton.displayName = \"Button\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/shared/create-motion-animation.tsx"],"names":["useReducedMotion","jsx","motion","cn"],"mappings":";;;;;;AAYA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,QAAQ,KAAK,CAAA,GAAA,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,MAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA,CAAA;AACpD;AAEA,SAAS,oBAAA,CACP,QACA,SAAA,EACA;AACA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,SAAA;AAC1B,EAAA,OAAO;AAAA,IACL,GAAI,UAAU,EAAC;AAAA,IACf,GAAG,IAAA;AAAA,IACH,GAAI,SAAS,MAAA,GAAY,IAAA,GAAO,EAAE,MAAA,EAAQ,eAAA,CAAgB,IAAI,CAAA;AAAE,GAClE;AACF;AAEO,SAAS,qBAAA,CACd,WAAA,EACA,IAAA,EACA,MAAA,EACA;AACA,EAAA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AACJ,IAAA,MAAM,qBAAqBA,6BAAA,EAAiB;AAC5C,IAAA,MAAM,eAAA,GAAkB,OAAA,IAAW,oBAAA,CAAqB,MAAA,CAAO,SAAS,EAAE,CAAA;AAC1E,IAAA,MAAM,kBACJ,OAAA,KACC,kBAAA,GACG,kBACA,oBAAA,CAAqB,MAAA,CAAO,SAAS,IAAI,CAAA,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,IAAA,IAAQ,oBAAA,CAAqB,MAAA,CAAO,MAAM,MAAM,CAAA;AACrE,IAAA,MAAM,kBAAA,GAAqB,aACvB,EAAE,GAAG,OAAO,UAAA,EAAY,GAAG,UAAA,EAAW,GACtC,MAAA,CAAO,UAAA;AAEX,IAAA,uBACEC,cAAA;AAAA,MAACC,mBAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,WAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAWC,oBAAG,SAAS,CAAA;AAAA,QACvB,OAAA,EAAS,eAAA;AAAA,QACT,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,UAAU,MAAA,CAAO,MAAA;AAAA,QACzB,UAAA,EAAY,cAAc,MAAA,CAAO,UAAA;AAAA,QACjC,QAAA,EAAU,YAAY,MAAA,CAAO,QAAA;AAAA,QAC7B,UAAA,EAAY,kBAAA;AAAA,QACX,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,eAAA,CAAgB,WAAA,GAAc,WAAA;AAC9B,EAAA,OAAO,eAAA;AACT","file":"chunk-ODZM25II.js","sourcesContent":["\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n MotionAnimationPreset,\n MotionAnimationProps,\n MotionAnimationTargetOverrides,\n} from \"./types\";\n\nfunction formatBlurValue(value: number | string) {\n if (typeof value === \"number\") {\n return `blur(${value}px)`;\n }\n return value.includes(\"(\") ? value : `blur(${value})`;\n}\n\nfunction mergeTargetOverrides(\n target: MotionAnimationPreset[\"initial\"] | undefined,\n overrides: MotionAnimationTargetOverrides | undefined,\n) {\n if (!overrides) {\n return target;\n }\n\n const { blur, ...rest } = overrides;\n return {\n ...(target ?? {}),\n ...rest,\n ...(blur === undefined ? null : { filter: formatBlurValue(blur) }),\n };\n}\n\nexport function createMotionAnimation(\n displayName: string,\n slot: string,\n preset: MotionAnimationPreset,\n) {\n function MotionAnimation(props: MotionAnimationProps) {\n const {\n children,\n className,\n initial,\n animate,\n exit,\n transition,\n layout,\n whileHover,\n whileTap,\n from,\n to,\n exitTo,\n ...rest\n } = props;\n const shouldReduceMotion = useReducedMotion();\n const resolvedAnimate = animate ?? mergeTargetOverrides(preset.animate, to);\n const resolvedInitial =\n initial ??\n (shouldReduceMotion\n ? resolvedAnimate\n : mergeTargetOverrides(preset.initial, from));\n const resolvedExit = exit ?? mergeTargetOverrides(preset.exit, exitTo);\n const resolvedTransition = transition\n ? { ...preset.transition, ...transition }\n : preset.transition;\n\n return (\n <motion.div\n data-slot={slot}\n className={cn(className)}\n initial={resolvedInitial}\n animate={resolvedAnimate}\n exit={resolvedExit}\n layout={layout ?? preset.layout}\n whileHover={whileHover ?? preset.whileHover}\n whileTap={whileTap ?? preset.whileTap}\n transition={resolvedTransition}\n {...rest}\n >\n {children}\n </motion.div>\n );\n }\n\n MotionAnimation.displayName = displayName;\n return MotionAnimation;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/buttons/button-base.tsx","../src/ui/buttons/button.tsx"],"names":["className","appearance","size","children","ref","rest","jsx"],"mappings":";;;;AAOO,IAAM,UAAA,GAAa,CAAC,KAAA,KAAuB;AAChD,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,SAAA,EAAAA,UAAAA;AAAA,MACA,UAAA,EAAAC,WAAAA;AAAA,MACA,IAAA,EAAAC,KAAAA;AAAA,MACA,QAAA,EAAAC,SAAAA;AAAA,MACA,GAAA,EAAAC,IAAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAGC;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAKD,IAAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,qBAAA,GAAwB,MAAA;AAAA,QACnD,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,cAAA,CAAe,EAAE,UAAA,EAAAH,aAAY,IAAA,EAAAC,KAAAA,EAAM,CAAA,EAAGF,UAAS,CAAA;AAAA,QAC5D,GAAGK,KAAAA;AAAA,QAEH,QAAA,EAAAF;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,YAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAC5D,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,QAAA;ACtDlB,IAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,uBAAOG,GAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAChC;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-VARQ7W4G.mjs","sourcesContent":["\"use client\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { ButtonProps } from \"./types\";\nimport { buttonVariants } from \"./variants\";\n\nexport const ButtonBase = (props: ButtonProps) => {\n if (props.as === \"link\") {\n const {\n className,\n appearance,\n size,\n children,\n ref,\n href,\n target,\n ...rest\n } = props;\n\n return (\n <a\n ref={ref}\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </a>\n );\n }\n\n const {\n className,\n appearance,\n size,\n type = \"button\",\n children,\n ref,\n ...rest\n } = props;\n\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </button>\n );\n};\n\nButtonBase.displayName = \"Button\";\n","// button.tsx — default static entry (no framer-motion)\nimport { ButtonBase } from \"./button-base\";\nimport type { ButtonProps } from \"./types\";\n\nexport const Button = (props: ButtonProps) => {\n return <ButtonBase {...props} />;\n};\n\nButton.displayName = \"Button\";\n"]}