@zentauri-ui/zentauri-components 1.7.9 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +9 -4
  2. package/cli/registry.json +3 -0
  3. package/dist/chunk-7TGUGTTQ.mjs +147 -0
  4. package/dist/chunk-7TGUGTTQ.mjs.map +1 -0
  5. package/dist/chunk-CQMV7BB6.js +50 -0
  6. package/dist/chunk-CQMV7BB6.js.map +1 -0
  7. package/dist/chunk-DN7TYUJ6.js +119 -0
  8. package/dist/chunk-DN7TYUJ6.js.map +1 -0
  9. package/dist/chunk-ODBG4Y6R.mjs +48 -0
  10. package/dist/chunk-ODBG4Y6R.mjs.map +1 -0
  11. package/dist/chunk-RKX5MERK.js +150 -0
  12. package/dist/chunk-RKX5MERK.js.map +1 -0
  13. package/dist/chunk-VYI3GS2C.mjs +115 -0
  14. package/dist/chunk-VYI3GS2C.mjs.map +1 -0
  15. package/dist/design-system/animated-number.d.ts +32 -0
  16. package/dist/design-system/animated-number.d.ts.map +1 -0
  17. package/dist/design-system/copy-button.d.ts +43 -0
  18. package/dist/design-system/copy-button.d.ts.map +1 -0
  19. package/dist/design-system/index.d.ts +3 -0
  20. package/dist/design-system/index.d.ts.map +1 -1
  21. package/dist/design-system/kbd.d.ts +44 -0
  22. package/dist/design-system/kbd.d.ts.map +1 -0
  23. package/dist/hooks/useClipboard.js +6 -44
  24. package/dist/hooks/useClipboard.js.map +1 -1
  25. package/dist/hooks/useClipboard.mjs +1 -46
  26. package/dist/hooks/useClipboard.mjs.map +1 -1
  27. package/dist/ui/animated-number/animated-number.d.ts +4 -0
  28. package/dist/ui/animated-number/animated-number.d.ts.map +1 -0
  29. package/dist/ui/animated-number/animations.d.ts +59 -0
  30. package/dist/ui/animated-number/animations.d.ts.map +1 -0
  31. package/dist/ui/animated-number/index.d.ts +4 -0
  32. package/dist/ui/animated-number/index.d.ts.map +1 -0
  33. package/dist/ui/animated-number/types.d.ts +31 -0
  34. package/dist/ui/animated-number/types.d.ts.map +1 -0
  35. package/dist/ui/animated-number/variants.d.ts +5 -0
  36. package/dist/ui/animated-number/variants.d.ts.map +1 -0
  37. package/dist/ui/animated-number.js +181 -0
  38. package/dist/ui/animated-number.js.map +1 -0
  39. package/dist/ui/animated-number.mjs +177 -0
  40. package/dist/ui/animated-number.mjs.map +1 -0
  41. package/dist/ui/copy-button/animated/animations.d.ts +3 -0
  42. package/dist/ui/copy-button/animated/animations.d.ts.map +1 -0
  43. package/dist/ui/copy-button/animated/copy-button-animated.d.ts +6 -0
  44. package/dist/ui/copy-button/animated/copy-button-animated.d.ts.map +1 -0
  45. package/dist/ui/copy-button/animated/index.d.ts +4 -0
  46. package/dist/ui/copy-button/animated/index.d.ts.map +1 -0
  47. package/dist/ui/copy-button/animated/types.d.ts +26 -0
  48. package/dist/ui/copy-button/animated/types.d.ts.map +1 -0
  49. package/dist/ui/copy-button/animated.js +59 -0
  50. package/dist/ui/copy-button/animated.js.map +1 -0
  51. package/dist/ui/copy-button/animated.mjs +56 -0
  52. package/dist/ui/copy-button/animated.mjs.map +1 -0
  53. package/dist/ui/copy-button/copy-button-base.d.ts +6 -0
  54. package/dist/ui/copy-button/copy-button-base.d.ts.map +1 -0
  55. package/dist/ui/copy-button/copy-button.d.ts +6 -0
  56. package/dist/ui/copy-button/copy-button.d.ts.map +1 -0
  57. package/dist/ui/copy-button/index.d.ts +4 -0
  58. package/dist/ui/copy-button/index.d.ts.map +1 -0
  59. package/dist/ui/copy-button/types.d.ts +32 -0
  60. package/dist/ui/copy-button/types.d.ts.map +1 -0
  61. package/dist/ui/copy-button/variants.d.ts +6 -0
  62. package/dist/ui/copy-button/variants.d.ts.map +1 -0
  63. package/dist/ui/copy-button.js +20 -0
  64. package/dist/ui/copy-button.js.map +1 -0
  65. package/dist/ui/copy-button.mjs +15 -0
  66. package/dist/ui/copy-button.mjs.map +1 -0
  67. package/dist/ui/kbd/animated/animations.d.ts +3 -0
  68. package/dist/ui/kbd/animated/animations.d.ts.map +1 -0
  69. package/dist/ui/kbd/animated/index.d.ts +4 -0
  70. package/dist/ui/kbd/animated/index.d.ts.map +1 -0
  71. package/dist/ui/kbd/animated/kbd-animated.d.ts +6 -0
  72. package/dist/ui/kbd/animated/kbd-animated.d.ts.map +1 -0
  73. package/dist/ui/kbd/animated/types.d.ts +10 -0
  74. package/dist/ui/kbd/animated/types.d.ts.map +1 -0
  75. package/dist/ui/kbd/animated.js +42 -0
  76. package/dist/ui/kbd/animated.js.map +1 -0
  77. package/dist/ui/kbd/animated.mjs +39 -0
  78. package/dist/ui/kbd/animated.mjs.map +1 -0
  79. package/dist/ui/kbd/index.d.ts +4 -0
  80. package/dist/ui/kbd/index.d.ts.map +1 -0
  81. package/dist/ui/kbd/kbd-base.d.ts +6 -0
  82. package/dist/ui/kbd/kbd-base.d.ts.map +1 -0
  83. package/dist/ui/kbd/kbd.d.ts +6 -0
  84. package/dist/ui/kbd/kbd.d.ts.map +1 -0
  85. package/dist/ui/kbd/types.d.ts +17 -0
  86. package/dist/ui/kbd/types.d.ts.map +1 -0
  87. package/dist/ui/kbd/variants.d.ts +8 -0
  88. package/dist/ui/kbd/variants.d.ts.map +1 -0
  89. package/dist/ui/kbd.js +23 -0
  90. package/dist/ui/kbd.js.map +1 -0
  91. package/dist/ui/kbd.mjs +14 -0
  92. package/dist/ui/kbd.mjs.map +1 -0
  93. package/package.json +1 -1
  94. package/src/design-system/animated-number.ts +53 -0
  95. package/src/design-system/copy-button.ts +81 -0
  96. package/src/design-system/index.ts +3 -0
  97. package/src/design-system/kbd.ts +83 -0
  98. package/src/ui/animated-number/animated-number.test.tsx +64 -0
  99. package/src/ui/animated-number/animated-number.tsx +120 -0
  100. package/src/ui/animated-number/animations.ts +22 -0
  101. package/src/ui/animated-number/index.ts +4 -0
  102. package/src/ui/animated-number/types.ts +39 -0
  103. package/src/ui/animated-number/variants.ts +14 -0
  104. package/src/ui/copy-button/animated/animations.ts +22 -0
  105. package/src/ui/copy-button/animated/copy-button-animated.tsx +39 -0
  106. package/src/ui/copy-button/animated/index.ts +10 -0
  107. package/src/ui/copy-button/animated/types.ts +21 -0
  108. package/src/ui/copy-button/copy-button-base.tsx +88 -0
  109. package/src/ui/copy-button/copy-button.test.tsx +82 -0
  110. package/src/ui/copy-button/copy-button.tsx +9 -0
  111. package/src/ui/copy-button/index.ts +10 -0
  112. package/src/ui/copy-button/types.ts +37 -0
  113. package/src/ui/copy-button/variants.ts +29 -0
  114. package/src/ui/kbd/animated/animations.ts +15 -0
  115. package/src/ui/kbd/animated/index.ts +9 -0
  116. package/src/ui/kbd/animated/kbd-animated.tsx +26 -0
  117. package/src/ui/kbd/animated/types.ts +16 -0
  118. package/src/ui/kbd/index.ts +5 -0
  119. package/src/ui/kbd/kbd-base.tsx +50 -0
  120. package/src/ui/kbd/kbd.test.tsx +48 -0
  121. package/src/ui/kbd/kbd.tsx +9 -0
  122. package/src/ui/kbd/types.ts +21 -0
  123. package/src/ui/kbd/variants.ts +31 -0
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkDN7TYUJ6_js = require('../../chunk-DN7TYUJ6.js');
5
+ require('../../chunk-ZS5756ZC.js');
6
+ var framerMotion = require('framer-motion');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/ui/kbd/animated/animations.ts
10
+ var kbdAnimationPresets = {
11
+ none: {},
12
+ press: {
13
+ whileHover: { y: -1 },
14
+ whileTap: { y: 1, scale: 0.96 },
15
+ transition: { type: "spring", stiffness: 600, damping: 22 }
16
+ },
17
+ pop: {
18
+ initial: { scale: 0.85, opacity: 0 },
19
+ animate: { scale: 1, opacity: 1 },
20
+ transition: { type: "spring", stiffness: 520, damping: 26 }
21
+ }
22
+ };
23
+ function KbdAnimated({ animation = "none", ...props }) {
24
+ const motionProps = kbdAnimationPresets[animation];
25
+ return /* @__PURE__ */ jsxRuntime.jsx(
26
+ chunkDN7TYUJ6_js.KbdBase,
27
+ {
28
+ ...{
29
+ as: framerMotion.motion.span,
30
+ initial: animation === "none" ? false : void 0,
31
+ ...motionProps,
32
+ ...props
33
+ }
34
+ }
35
+ );
36
+ }
37
+ KbdAnimated.displayName = "KbdAnimated";
38
+
39
+ exports.KbdAnimated = KbdAnimated;
40
+ exports.kbdAnimationPresets = kbdAnimationPresets;
41
+ //# sourceMappingURL=animated.js.map
42
+ //# sourceMappingURL=animated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/kbd/animated/animations.ts","../../../src/ui/kbd/animated/kbd-animated.tsx"],"names":["jsx","KbdBase","motion"],"mappings":";;;;;;;;AAEO,IAAM,mBAAA,GAA2C;AAAA,EACtD,MAAM,EAAC;AAAA,EACP,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,EAAE,CAAA,EAAG,EAAA,EAAG;AAAA,IACpB,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,IAC9B,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA;AAAG,GAC5D;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA,EAAE;AAAA,IACnC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,IAChC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA;AAAG;AAE9D;ACJO,SAAS,YAAY,EAAE,SAAA,GAAY,MAAA,EAAQ,GAAG,OAAM,EAAqB;AAC9E,EAAA,MAAM,WAAA,GAAc,oBAAoB,SAAS,CAAA;AAEjD,EAAA,uBACEA,cAAA;AAAA,IAACC,wBAAA;AAAA,IAAA;AAAA,MACE,GAAI;AAAA,QACH,IAAIC,mBAAA,CAAO,IAAA;AAAA,QACX,OAAA,EAAS,SAAA,KAAc,MAAA,GAAS,KAAA,GAAQ,MAAA;AAAA,QACxC,GAAG,WAAA;AAAA,QACH,GAAG;AAAA;AACL;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"animated.js","sourcesContent":["import type { KbdAnimationPresets } from \"./types\";\n\nexport const kbdAnimationPresets: KbdAnimationPresets = {\n none: {},\n press: {\n whileHover: { y: -1 },\n whileTap: { y: 1, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 600, damping: 22 },\n },\n pop: {\n initial: { scale: 0.85, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n transition: { type: \"spring\", stiffness: 520, damping: 26 },\n },\n};\n","\"use client\";\n\nimport { motion } from \"framer-motion\";\n\nimport { KbdBase } from \"../kbd-base\";\nimport type { KbdBaseProps } from \"../types\";\n\nimport { kbdAnimationPresets } from \"./animations\";\nimport type { KbdAnimatedProps } from \"./types\";\n\nexport function KbdAnimated({ animation = \"none\", ...props }: KbdAnimatedProps) {\n const motionProps = kbdAnimationPresets[animation];\n\n return (\n <KbdBase\n {...({\n as: motion.span,\n initial: animation === \"none\" ? false : undefined,\n ...motionProps,\n ...props,\n } as KbdBaseProps)}\n />\n );\n}\n\nKbdAnimated.displayName = \"KbdAnimated\";\n"]}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { KbdBase } from '../../chunk-VYI3GS2C.mjs';
3
+ import '../../chunk-4D54YOL6.mjs';
4
+ import { motion } from 'framer-motion';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ // src/ui/kbd/animated/animations.ts
8
+ var kbdAnimationPresets = {
9
+ none: {},
10
+ press: {
11
+ whileHover: { y: -1 },
12
+ whileTap: { y: 1, scale: 0.96 },
13
+ transition: { type: "spring", stiffness: 600, damping: 22 }
14
+ },
15
+ pop: {
16
+ initial: { scale: 0.85, opacity: 0 },
17
+ animate: { scale: 1, opacity: 1 },
18
+ transition: { type: "spring", stiffness: 520, damping: 26 }
19
+ }
20
+ };
21
+ function KbdAnimated({ animation = "none", ...props }) {
22
+ const motionProps = kbdAnimationPresets[animation];
23
+ return /* @__PURE__ */ jsx(
24
+ KbdBase,
25
+ {
26
+ ...{
27
+ as: motion.span,
28
+ initial: animation === "none" ? false : void 0,
29
+ ...motionProps,
30
+ ...props
31
+ }
32
+ }
33
+ );
34
+ }
35
+ KbdAnimated.displayName = "KbdAnimated";
36
+
37
+ export { KbdAnimated, kbdAnimationPresets };
38
+ //# sourceMappingURL=animated.mjs.map
39
+ //# sourceMappingURL=animated.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/kbd/animated/animations.ts","../../../src/ui/kbd/animated/kbd-animated.tsx"],"names":[],"mappings":";;;;;;AAEO,IAAM,mBAAA,GAA2C;AAAA,EACtD,MAAM,EAAC;AAAA,EACP,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,EAAE,CAAA,EAAG,EAAA,EAAG;AAAA,IACpB,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,IAC9B,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA;AAAG,GAC5D;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA,EAAE;AAAA,IACnC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,IAChC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA;AAAG;AAE9D;ACJO,SAAS,YAAY,EAAE,SAAA,GAAY,MAAA,EAAQ,GAAG,OAAM,EAAqB;AAC9E,EAAA,MAAM,WAAA,GAAc,oBAAoB,SAAS,CAAA;AAEjD,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACE,GAAI;AAAA,QACH,IAAI,MAAA,CAAO,IAAA;AAAA,QACX,OAAA,EAAS,SAAA,KAAc,MAAA,GAAS,KAAA,GAAQ,MAAA;AAAA,QACxC,GAAG,WAAA;AAAA,QACH,GAAG;AAAA;AACL;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"animated.mjs","sourcesContent":["import type { KbdAnimationPresets } from \"./types\";\n\nexport const kbdAnimationPresets: KbdAnimationPresets = {\n none: {},\n press: {\n whileHover: { y: -1 },\n whileTap: { y: 1, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 600, damping: 22 },\n },\n pop: {\n initial: { scale: 0.85, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n transition: { type: \"spring\", stiffness: 520, damping: 26 },\n },\n};\n","\"use client\";\n\nimport { motion } from \"framer-motion\";\n\nimport { KbdBase } from \"../kbd-base\";\nimport type { KbdBaseProps } from \"../types\";\n\nimport { kbdAnimationPresets } from \"./animations\";\nimport type { KbdAnimatedProps } from \"./types\";\n\nexport function KbdAnimated({ animation = \"none\", ...props }: KbdAnimatedProps) {\n const motionProps = kbdAnimationPresets[animation];\n\n return (\n <KbdBase\n {...({\n as: motion.span,\n initial: animation === \"none\" ? false : undefined,\n ...motionProps,\n ...props,\n } as KbdBaseProps)}\n />\n );\n}\n\nKbdAnimated.displayName = \"KbdAnimated\";\n"]}
@@ -0,0 +1,4 @@
1
+ export { Kbd } from "./kbd";
2
+ export type { KbdBaseProps, KbdProps, KbdVariantProps } from "./types";
3
+ export { kbdKeyVariants, kbdSeparatorVariants } from "./variants";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/kbd/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { KbdBaseProps } from "./types";
2
+ export declare function KbdBase({ keys, separator, appearance, size, children, className, as: Wrapper, ref, ...rest }: KbdBaseProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace KbdBase {
4
+ var displayName: string;
5
+ }
6
+ //# sourceMappingURL=kbd-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd-base.d.ts","sourceRoot":"","sources":["../../../src/ui/kbd/kbd-base.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,SAAS,EACT,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,EAAE,EAAE,OAAgB,EACpB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,YAAY,2CA2Bd;yBArCe,OAAO"}
@@ -0,0 +1,6 @@
1
+ import type { KbdProps } from "./types";
2
+ export declare function Kbd(props: KbdProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace Kbd {
4
+ var displayName: string;
5
+ }
6
+ //# sourceMappingURL=kbd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.d.ts","sourceRoot":"","sources":["../../../src/ui/kbd/kbd.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,2CAElC;yBAFe,GAAG"}
@@ -0,0 +1,17 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef, ElementType, ReactNode } from "react";
3
+ import type { kbdKeyVariants } from "./variants";
4
+ export type KbdVariantProps = VariantProps<typeof kbdKeyVariants>;
5
+ export interface KbdBaseProps extends Omit<ComponentPropsWithRef<"span">, "children"> {
6
+ /** Keys to render as individual keycaps, e.g. `["⌘", "K"]`. Takes precedence over `children`. */
7
+ keys?: ReactNode[];
8
+ /** Optional node rendered between keycaps (e.g. "+" or "then"). */
9
+ separator?: ReactNode;
10
+ appearance?: KbdVariantProps["appearance"];
11
+ size?: KbdVariantProps["size"];
12
+ /** Single keycap content when `keys` is not provided. */
13
+ children?: ReactNode;
14
+ as?: ElementType;
15
+ }
16
+ export type KbdProps = Omit<KbdBaseProps, "as">;
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/kbd/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAElE,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IACvD,iGAAiG;IACjG,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const kbdKeyVariants: (props?: ({
2
+ appearance?: "default" | "outline" | "glass" | "sky" | "emerald" | "violet" | "amber" | "rose" | "gray" | "indigo" | "orange" | "pink" | "purple" | "teal" | "yellow" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | "secondary" | "destructive" | "ghost" | null | undefined;
3
+ size?: "md" | "sm" | "lg" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export declare const kbdSeparatorVariants: (props?: ({
6
+ size?: "md" | "sm" | "lg" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/kbd/variants.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc;;;8EASzB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;8EAUhC,CAAC"}
package/dist/ui/kbd.js ADDED
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkDN7TYUJ6_js = require('../chunk-DN7TYUJ6.js');
5
+ require('../chunk-ZS5756ZC.js');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function Kbd(props) {
9
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkDN7TYUJ6_js.KbdBase, { ...props });
10
+ }
11
+ Kbd.displayName = "Kbd";
12
+
13
+ Object.defineProperty(exports, "kbdKeyVariants", {
14
+ enumerable: true,
15
+ get: function () { return chunkDN7TYUJ6_js.kbdKeyVariants; }
16
+ });
17
+ Object.defineProperty(exports, "kbdSeparatorVariants", {
18
+ enumerable: true,
19
+ get: function () { return chunkDN7TYUJ6_js.kbdSeparatorVariants; }
20
+ });
21
+ exports.Kbd = Kbd;
22
+ //# sourceMappingURL=kbd.js.map
23
+ //# sourceMappingURL=kbd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/kbd/kbd.tsx"],"names":["jsx","KbdBase"],"mappings":";;;;;;AAIO,SAAS,IAAI,KAAA,EAAiB;AACnC,EAAA,uBAAOA,cAAA,CAACC,wBAAA,EAAA,EAAS,GAAG,KAAA,EAAO,CAAA;AAC7B;AAEA,GAAA,CAAI,WAAA,GAAc,KAAA","file":"kbd.js","sourcesContent":["// kbd.tsx — default static entry (no framer-motion)\nimport { KbdBase } from \"./kbd-base\";\nimport type { KbdProps } from \"./types\";\n\nexport function Kbd(props: KbdProps) {\n return <KbdBase {...props} />;\n}\n\nKbd.displayName = \"Kbd\";\n"]}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { KbdBase } from '../chunk-VYI3GS2C.mjs';
3
+ export { kbdKeyVariants, kbdSeparatorVariants } from '../chunk-VYI3GS2C.mjs';
4
+ import '../chunk-4D54YOL6.mjs';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ function Kbd(props) {
8
+ return /* @__PURE__ */ jsx(KbdBase, { ...props });
9
+ }
10
+ Kbd.displayName = "Kbd";
11
+
12
+ export { Kbd };
13
+ //# sourceMappingURL=kbd.mjs.map
14
+ //# sourceMappingURL=kbd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/kbd/kbd.tsx"],"names":[],"mappings":";;;;;AAIO,SAAS,IAAI,KAAA,EAAiB;AACnC,EAAA,uBAAO,GAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EAAO,CAAA;AAC7B;AAEA,GAAA,CAAI,WAAA,GAAc,KAAA","file":"kbd.mjs","sourcesContent":["// kbd.tsx — default static entry (no framer-motion)\nimport { KbdBase } from \"./kbd-base\";\nimport type { KbdProps } from \"./types\";\n\nexport function Kbd(props: KbdProps) {\n return <KbdBase {...props} />;\n}\n\nKbd.displayName = \"Kbd\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zentauri-ui/zentauri-components",
3
- "version": "1.7.9",
3
+ "version": "1.8.1",
4
4
  "description": "React + Tailwind UI kit with charts, ESM/CJS builds, per-entry exports, and a zentauri-components / zentauri-ui CLI to vendor UI or hook source into your app",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -0,0 +1,53 @@
1
+ export const zuiAnimatedNumberBase =
2
+ "relative flex w-full overflow-hidden [perspective:1000px]";
3
+
4
+ export const zuiAnimatedNumberAppearance = {
5
+ default:
6
+ "text-[color:var(--zui-animated-number-default-fg,oklch(20.8%_0.042_265.755))] dark:text-[color:var(--zui-animated-number-default-fg-dark,oklch(98.4%_0.003_247.858))]",
7
+ success:
8
+ "text-[color:var(--zui-animated-number-success-fg,oklch(62.7%_0.194_149.214))] dark:text-[color:var(--zui-animated-number-success-fg-dark,oklch(79.2%_0.209_151.711))]",
9
+ warning:
10
+ "text-[color:var(--zui-animated-number-warning-fg,oklch(66.6%_0.179_58.318))] dark:text-[color:var(--zui-animated-number-warning-fg-dark,oklch(82.8%_0.189_84.429))]",
11
+ error:
12
+ "text-[color:var(--zui-animated-number-error-fg,oklch(57.7%_0.245_27.325))] dark:text-[color:var(--zui-animated-number-error-fg-dark,oklch(70.4%_0.191_22.216))]",
13
+ info: "text-[color:var(--zui-animated-number-info-fg,oklch(58.8%_0.158_241.966))] dark:text-[color:var(--zui-animated-number-info-fg-dark,oklch(74.6%_0.16_232.661))]",
14
+ ghost:
15
+ "text-[color:var(--zui-animated-number-ghost-fg,oklch(55.4%_0.046_257.417))] dark:text-[color:var(--zui-animated-number-ghost-fg-dark,oklch(70.4%_0.04_256.788))]",
16
+ purple:
17
+ "text-[color:var(--zui-animated-number-purple-fg,oklch(55.8%_0.288_302.321))] dark:text-[color:var(--zui-animated-number-purple-fg-dark,oklch(71.4%_0.203_305.504))]",
18
+ pink: "text-[color:var(--zui-animated-number-pink-fg,oklch(59.2%_0.249_0.584))] dark:text-[color:var(--zui-animated-number-pink-fg-dark,oklch(71.8%_0.202_349.761))]",
19
+ orange:
20
+ "text-[color:var(--zui-animated-number-orange-fg,oklch(64.6%_0.222_41.116))] dark:text-[color:var(--zui-animated-number-orange-fg-dark,oklch(75%_0.183_55.934))]",
21
+ yellow:
22
+ "text-[color:var(--zui-animated-number-yellow-fg,oklch(68.1%_0.162_75.834))] dark:text-[color:var(--zui-animated-number-yellow-fg-dark,oklch(85.2%_0.199_91.936))]",
23
+ teal: "text-[color:var(--zui-animated-number-teal-fg,oklch(60%_0.118_184.704))] dark:text-[color:var(--zui-animated-number-teal-fg-dark,oklch(77.7%_0.152_181.912))]",
24
+ indigo:
25
+ "text-[color:var(--zui-animated-number-indigo-fg,oklch(51.1%_0.262_276.966))] dark:text-[color:var(--zui-animated-number-indigo-fg-dark,oklch(67.3%_0.182_276.935))]",
26
+ gray: "text-[color:var(--zui-animated-number-gray-fg,oklch(44.6%_0.03_256.802))] dark:text-[color:var(--zui-animated-number-gray-fg-dark,oklch(70.7%_0.022_261.325))]",
27
+ violet:
28
+ "text-[color:var(--zui-animated-number-violet-fg,oklch(54.1%_0.281_293.009))] dark:text-[color:var(--zui-animated-number-violet-fg-dark,oklch(70.2%_0.183_293.541))]",
29
+ "gradient-blue":
30
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-blue-from,oklch(42.4%_0.199_265.638))] dark:from-[var(--zui-animated-number-gradient-blue-from-dark,oklch(54.6%_0.245_262.881))] to-[var(--zui-animated-number-gradient-blue-to,oklch(43.8%_0.218_303.724))] dark:to-[var(--zui-animated-number-gradient-blue-to-dark,oklch(55.8%_0.288_302.321))] bg-clip-text text-transparent",
31
+ "gradient-green":
32
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-green-from,oklch(44.8%_0.119_151.328))] dark:from-[var(--zui-animated-number-gradient-green-from-dark,oklch(62.7%_0.194_149.214))] to-[var(--zui-animated-number-gradient-green-to,oklch(45.3%_0.124_130.933))] dark:to-[var(--zui-animated-number-gradient-green-to-dark,oklch(64.8%_0.2_131.684))] bg-clip-text text-transparent",
33
+ "gradient-red":
34
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-red-from,oklch(44.4%_0.177_26.899))] dark:from-[var(--zui-animated-number-gradient-red-from-dark,oklch(57.7%_0.245_27.325))] to-[var(--zui-animated-number-gradient-red-to,oklch(45.9%_0.187_3.815))] dark:to-[var(--zui-animated-number-gradient-red-to-dark,oklch(59.2%_0.249_0.584))] bg-clip-text text-transparent",
35
+ "gradient-yellow":
36
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-yellow-from,oklch(47.6%_0.114_61.907))] dark:from-[var(--zui-animated-number-gradient-yellow-from-dark,oklch(68.1%_0.162_75.834))] to-[var(--zui-animated-number-gradient-yellow-to,oklch(47%_0.157_37.304))] dark:to-[var(--zui-animated-number-gradient-yellow-to-dark,oklch(64.6%_0.222_41.116))] bg-clip-text text-transparent",
37
+ "gradient-purple":
38
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-purple-from,oklch(43.8%_0.218_303.724))] dark:from-[var(--zui-animated-number-gradient-purple-from-dark,oklch(55.8%_0.288_302.321))] to-[var(--zui-animated-number-gradient-purple-to,oklch(45.9%_0.187_3.815))] dark:to-[var(--zui-animated-number-gradient-purple-to-dark,oklch(59.2%_0.249_0.584))] bg-clip-text text-transparent",
39
+ "gradient-teal":
40
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-teal-from,oklch(43.7%_0.078_188.216))] dark:from-[var(--zui-animated-number-gradient-teal-from-dark,oklch(60%_0.118_184.704))] to-[var(--zui-animated-number-gradient-teal-to,oklch(45%_0.085_224.283))] dark:to-[var(--zui-animated-number-gradient-teal-to-dark,oklch(60.9%_0.126_221.723))] bg-clip-text text-transparent",
41
+ "gradient-indigo":
42
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-indigo-from,oklch(39.8%_0.195_277.366))] dark:from-[var(--zui-animated-number-gradient-indigo-from-dark,oklch(51.1%_0.262_276.966))] to-[var(--zui-animated-number-gradient-indigo-to,oklch(43.8%_0.218_303.724))] dark:to-[var(--zui-animated-number-gradient-indigo-to-dark,oklch(55.8%_0.288_302.321))] bg-clip-text text-transparent",
43
+ "gradient-pink":
44
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-pink-from,oklch(45.9%_0.187_3.815))] dark:from-[var(--zui-animated-number-gradient-pink-from-dark,oklch(59.2%_0.249_0.584))] to-[var(--zui-animated-number-gradient-pink-to,oklch(45.5%_0.188_13.697))] dark:to-[var(--zui-animated-number-gradient-pink-to-dark,oklch(58.6%_0.253_17.585))] bg-clip-text text-transparent",
45
+ "gradient-orange":
46
+ "bg-linear-to-r from-[var(--zui-animated-number-gradient-orange-from,oklch(47%_0.157_37.304))] dark:from-[var(--zui-animated-number-gradient-orange-from-dark,oklch(64.6%_0.222_41.116))] to-[var(--zui-animated-number-gradient-orange-to,oklch(44.4%_0.177_26.899))] dark:to-[var(--zui-animated-number-gradient-orange-to-dark,oklch(57.7%_0.245_27.325))] bg-clip-text text-transparent",
47
+ } as const;
48
+
49
+ export const zuiAnimatedNumberSize = {
50
+ sm: "text-2xl font-semibold tabular-nums",
51
+ md: "text-4xl font-semibold tabular-nums",
52
+ lg: "text-6xl font-bold tabular-nums",
53
+ } as const;
@@ -0,0 +1,81 @@
1
+ export const zuiCopyButtonBase = [
2
+ "relative inline-flex items-center justify-center gap-2 whitespace-nowrap",
3
+ "rounded-[var(--zui-copy-button-radius,0.75rem)] font-medium",
4
+ "ring-offset-[var(--zui-copy-button-ring-offset,#f8fafc)] dark:ring-offset-[var(--zui-copy-button-ring-offset-dark,#020617)]",
5
+ "transition-colors select-none",
6
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--zui-copy-button-focus-ring,#475569)] dark:focus-visible:ring-[var(--zui-copy-button-focus-ring-dark,#cbd5e1)] focus-visible:ring-offset-2",
7
+ "disabled:pointer-events-none disabled:opacity-50",
8
+ ] as const;
9
+
10
+ export const zuiCopyButtonAppearances = {
11
+ default:
12
+ "bg-[var(--zui-copy-button-default-bg,#0f172a)] dark:bg-[var(--zui-copy-button-default-bg-dark,#f8fafc)] text-[color:var(--zui-copy-button-default-fg,#f8fafc)] dark:text-[color:var(--zui-copy-button-default-fg-dark,#020617)] shadow-[var(--zui-copy-button-default-shadow,0_1px_2px_#0f172a14)] dark:shadow-[var(--zui-copy-button-default-shadow-dark,0_1px_2px_#0f172a1f)] hover:bg-[var(--zui-copy-button-default-bg-hover,#000000)] dark:hover:bg-[var(--zui-copy-button-default-bg-hover-dark,#ffffff)]",
13
+ secondary:
14
+ "bg-[var(--zui-copy-button-secondary-bg,#e2e8f0)] dark:bg-[var(--zui-copy-button-secondary-bg-dark,#1e293b)] text-[color:var(--zui-copy-button-secondary-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-secondary-fg-dark,#f8fafc)] hover:bg-[var(--zui-copy-button-secondary-bg-hover,#cbd5e1)] dark:hover:bg-[var(--zui-copy-button-secondary-bg-hover-dark,#334155)]",
15
+ destructive:
16
+ "bg-[var(--zui-copy-button-destructive-bg,#f43f5e)] dark:bg-[var(--zui-copy-button-destructive-bg-dark,#be123c)] text-[color:var(--zui-copy-button-destructive-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-destructive-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-destructive-bg-hover,#f43f5e)] dark:hover:bg-[var(--zui-copy-button-destructive-bg-hover-dark,#9f1239)]",
17
+ outline:
18
+ "border border-[color:var(--zui-copy-button-outline-border,#0000001a)] dark:border-[color:var(--zui-copy-button-outline-border-dark,#ffffff1a)] bg-[var(--zui-copy-button-outline-bg,#0000000d)] dark:bg-[var(--zui-copy-button-outline-bg-dark,#ffffff0d)] text-[color:var(--zui-copy-button-outline-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-outline-fg-dark,#f8fafc)] hover:bg-[var(--zui-copy-button-outline-bg-hover,#0000001a)] dark:hover:bg-[var(--zui-copy-button-outline-bg-hover-dark,#ffffff1a)]",
19
+ ghost:
20
+ "bg-transparent text-[color:var(--zui-copy-button-ghost-fg,#334155)] dark:text-[color:var(--zui-copy-button-ghost-fg-dark,#e2e8f0)] hover:bg-[var(--zui-copy-button-ghost-bg-hover,#0000000d)] dark:hover:bg-[var(--zui-copy-button-ghost-bg-hover-dark,#ffffff0d)]",
21
+ glass:
22
+ "border border-[color:var(--zui-copy-button-glass-border,#00000026)] dark:border-[color:var(--zui-copy-button-glass-border-dark,#ffffff26)] bg-[var(--zui-copy-button-glass-bg,#0000001a)] dark:bg-[var(--zui-copy-button-glass-bg-dark,#ffffff1a)] text-[color:var(--zui-copy-button-glass-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-glass-fg-dark,#ffffff)] backdrop-blur-md hover:bg-[var(--zui-copy-button-glass-bg-hover,#00000026)] dark:hover:bg-[var(--zui-copy-button-glass-bg-hover-dark,#ffffff26)]",
23
+ emerald:
24
+ "bg-[var(--zui-copy-button-emerald-bg,#10b981)] dark:bg-[var(--zui-copy-button-emerald-bg-dark,#065f46)] text-[color:var(--zui-copy-button-emerald-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-emerald-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-emerald-bg-hover,#10b981)] dark:hover:bg-[var(--zui-copy-button-emerald-bg-hover-dark,#064e3b)]",
25
+ indigo:
26
+ "bg-[var(--zui-copy-button-indigo-bg,#3730a3)] dark:bg-[var(--zui-copy-button-indigo-bg-dark,#4f46e5)] text-[color:var(--zui-copy-button-indigo-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-indigo-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-indigo-bg-hover,#3730a3)] dark:hover:bg-[var(--zui-copy-button-indigo-bg-hover-dark,#4f46e5)]",
27
+ purple:
28
+ "bg-[var(--zui-copy-button-purple-bg,#6b21a8)] dark:bg-[var(--zui-copy-button-purple-bg-dark,#9333ea)] text-[color:var(--zui-copy-button-purple-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-purple-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-purple-bg-hover,#6b21a8)] dark:hover:bg-[var(--zui-copy-button-purple-bg-hover-dark,#9333ea)]",
29
+ pink:
30
+ "bg-[var(--zui-copy-button-pink-bg,#9d174d)] dark:bg-[var(--zui-copy-button-pink-bg-dark,#db2777)] text-[color:var(--zui-copy-button-pink-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-pink-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-pink-bg-hover,#9d174d)] dark:hover:bg-[var(--zui-copy-button-pink-bg-hover-dark,#db2777)]",
31
+ rose:
32
+ "bg-[var(--zui-copy-button-rose-bg,#9f1239)] dark:bg-[var(--zui-copy-button-rose-bg-dark,#e11d48)] text-[color:var(--zui-copy-button-rose-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-rose-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-rose-bg-hover,#9f1239)] dark:hover:bg-[var(--zui-copy-button-rose-bg-hover-dark,#e11d48)]",
33
+ sky:
34
+ "bg-[var(--zui-copy-button-sky-bg,#0ea5e9)] dark:bg-[var(--zui-copy-button-sky-bg-dark,#0369a1)] text-[color:var(--zui-copy-button-sky-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-sky-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-sky-bg-hover,#0ea5e9)] dark:hover:bg-[var(--zui-copy-button-sky-bg-hover-dark,#075985)]",
35
+ teal:
36
+ "bg-[var(--zui-copy-button-teal-bg,#14b8a6)] dark:bg-[var(--zui-copy-button-teal-bg-dark,#0f766e)] text-[color:var(--zui-copy-button-teal-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-teal-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-teal-bg-hover,#14b8a6)] dark:hover:bg-[var(--zui-copy-button-teal-bg-hover-dark,#115e59)]",
37
+ yellow:
38
+ "bg-[var(--zui-copy-button-yellow-bg,#eab308)] dark:bg-[var(--zui-copy-button-yellow-bg-dark,#854d0e)] text-[color:var(--zui-copy-button-yellow-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-yellow-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-yellow-bg-hover,#eab308)] dark:hover:bg-[var(--zui-copy-button-yellow-bg-hover-dark,#713f12)]",
39
+ orange:
40
+ "bg-[var(--zui-copy-button-orange-bg,#f97316)] dark:bg-[var(--zui-copy-button-orange-bg-dark,#9a3412)] text-[color:var(--zui-copy-button-orange-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-orange-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-orange-bg-hover,#f97316)] dark:hover:bg-[var(--zui-copy-button-orange-bg-hover-dark,#7c2d12)]",
41
+ gray:
42
+ "bg-[var(--zui-copy-button-gray-bg,#6b7280)] dark:bg-[var(--zui-copy-button-gray-bg-dark,#374151)] text-[color:var(--zui-copy-button-gray-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gray-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-gray-bg-hover,#6b7280)] dark:hover:bg-[var(--zui-copy-button-gray-bg-hover-dark,#1f2937)]",
43
+ amber:
44
+ "bg-[var(--zui-copy-button-amber-bg,#f59e0b)] dark:bg-[var(--zui-copy-button-amber-bg-dark,#92400e)] text-[color:var(--zui-copy-button-amber-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-amber-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-amber-bg-hover,#f59e0b)] dark:hover:bg-[var(--zui-copy-button-amber-bg-hover-dark,#78350f)]",
45
+ violet:
46
+ "bg-[var(--zui-copy-button-violet-bg,#5b21b6)] dark:bg-[var(--zui-copy-button-violet-bg-dark,#7c3aed)] text-[color:var(--zui-copy-button-violet-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-violet-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-violet-bg-hover,#5b21b6)] dark:hover:bg-[var(--zui-copy-button-violet-bg-hover-dark,#7c3aed)]",
47
+ "gradient-blue":
48
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-blue-from,#1e40af)] dark:from-[var(--zui-copy-button-gradient-blue-from-dark,#2563eb)] to-[var(--zui-copy-button-gradient-blue-to,#6b21a8)] dark:to-[var(--zui-copy-button-gradient-blue-to-dark,#9333ea)] text-[color:var(--zui-copy-button-gradient-blue-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-blue-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-blue-from-hover,#1e40af)] dark:hover:from-[var(--zui-copy-button-gradient-blue-from-hover-dark,#2563eb)] hover:to-[var(--zui-copy-button-gradient-blue-to-hover,#6b21a8)] dark:hover:to-[var(--zui-copy-button-gradient-blue-to-hover-dark,#9333ea)]",
49
+ "gradient-green":
50
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-green-from,#166534)] dark:from-[var(--zui-copy-button-gradient-green-from-dark,#16a34a)] to-[var(--zui-copy-button-gradient-green-to,#3f6212)] dark:to-[var(--zui-copy-button-gradient-green-to-dark,#65a30d)] text-[color:var(--zui-copy-button-gradient-green-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-green-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-green-from-hover,#166534)] dark:hover:from-[var(--zui-copy-button-gradient-green-from-hover-dark,#16a34a)] hover:to-[var(--zui-copy-button-gradient-green-to-hover,#3f6212)] dark:hover:to-[var(--zui-copy-button-gradient-green-to-hover-dark,#65a30d)]",
51
+ "gradient-red":
52
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-red-from,#991b1b)] dark:from-[var(--zui-copy-button-gradient-red-from-dark,#dc2626)] to-[var(--zui-copy-button-gradient-red-to,#9d174d)] dark:to-[var(--zui-copy-button-gradient-red-to-dark,#db2777)] text-[color:var(--zui-copy-button-gradient-red-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-red-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-red-from-hover,#991b1b)] dark:hover:from-[var(--zui-copy-button-gradient-red-from-hover-dark,#dc2626)] hover:to-[var(--zui-copy-button-gradient-red-to-hover,#9d174d)] dark:hover:to-[var(--zui-copy-button-gradient-red-to-hover-dark,#db2777)]",
53
+ "gradient-yellow":
54
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-yellow-from,#854d0e)] dark:from-[var(--zui-copy-button-gradient-yellow-from-dark,#ca8a04)] to-[var(--zui-copy-button-gradient-yellow-to,#9a3412)] dark:to-[var(--zui-copy-button-gradient-yellow-to-dark,#ea580c)] text-[color:var(--zui-copy-button-gradient-yellow-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-yellow-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-yellow-from-hover,#854d0e)] dark:hover:from-[var(--zui-copy-button-gradient-yellow-from-hover-dark,#ca8a04)] hover:to-[var(--zui-copy-button-gradient-yellow-to-hover,#9a3412)] dark:hover:to-[var(--zui-copy-button-gradient-yellow-to-hover-dark,#ea580c)]",
55
+ "gradient-purple":
56
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-purple-from,#6b21a8)] dark:from-[var(--zui-copy-button-gradient-purple-from-dark,#9333ea)] to-[var(--zui-copy-button-gradient-purple-to,#9d174d)] dark:to-[var(--zui-copy-button-gradient-purple-to-dark,#db2777)] text-[color:var(--zui-copy-button-gradient-purple-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-purple-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-purple-from-hover,#6b21a8)] dark:hover:from-[var(--zui-copy-button-gradient-purple-from-hover-dark,#9333ea)] hover:to-[var(--zui-copy-button-gradient-purple-to-hover,#9d174d)] dark:hover:to-[var(--zui-copy-button-gradient-purple-to-hover-dark,#db2777)]",
57
+ "gradient-teal":
58
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-teal-from,#115e59)] dark:from-[var(--zui-copy-button-gradient-teal-from-dark,#0d9488)] to-[var(--zui-copy-button-gradient-teal-to,#155e75)] dark:to-[var(--zui-copy-button-gradient-teal-to-dark,#0891b2)] text-[color:var(--zui-copy-button-gradient-teal-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-teal-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-teal-from-hover,#115e59)] dark:hover:from-[var(--zui-copy-button-gradient-teal-from-hover-dark,#0d9488)] hover:to-[var(--zui-copy-button-gradient-teal-to-hover,#155e75)] dark:hover:to-[var(--zui-copy-button-gradient-teal-to-hover-dark,#0891b2)]",
59
+ "gradient-indigo":
60
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-indigo-from,#3730a3)] dark:from-[var(--zui-copy-button-gradient-indigo-from-dark,#4f46e5)] to-[var(--zui-copy-button-gradient-indigo-to,#6b21a8)] dark:to-[var(--zui-copy-button-gradient-indigo-to-dark,#9333ea)] text-[color:var(--zui-copy-button-gradient-indigo-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-indigo-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-indigo-from-hover,#3730a3)] dark:hover:from-[var(--zui-copy-button-gradient-indigo-from-hover-dark,#4f46e5)] hover:to-[var(--zui-copy-button-gradient-indigo-to-hover,#6b21a8)] dark:hover:to-[var(--zui-copy-button-gradient-indigo-to-hover-dark,#9333ea)]",
61
+ "gradient-pink":
62
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-pink-from,#9d174d)] dark:from-[var(--zui-copy-button-gradient-pink-from-dark,#db2777)] to-[var(--zui-copy-button-gradient-pink-to,#9f1239)] dark:to-[var(--zui-copy-button-gradient-pink-to-dark,#e11d48)] text-[color:var(--zui-copy-button-gradient-pink-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-pink-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-pink-from-hover,#9d174d)] dark:hover:from-[var(--zui-copy-button-gradient-pink-from-hover-dark,#db2777)] hover:to-[var(--zui-copy-button-gradient-pink-to-hover,#9f1239)] dark:hover:to-[var(--zui-copy-button-gradient-pink-to-hover-dark,#e11d48)]",
63
+ "gradient-orange":
64
+ "bg-linear-to-r from-[var(--zui-copy-button-gradient-orange-from,#9a3412)] dark:from-[var(--zui-copy-button-gradient-orange-from-dark,#ea580c)] to-[var(--zui-copy-button-gradient-orange-to,#991b1b)] dark:to-[var(--zui-copy-button-gradient-orange-to-dark,#dc2626)] text-[color:var(--zui-copy-button-gradient-orange-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-orange-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-orange-from-hover,#9a3412)] dark:hover:from-[var(--zui-copy-button-gradient-orange-from-hover-dark,#ea580c)] hover:to-[var(--zui-copy-button-gradient-orange-to-hover,#991b1b)] dark:hover:to-[var(--zui-copy-button-gradient-orange-to-hover-dark,#dc2626)]",
65
+ } as const;
66
+
67
+ export type ZuiCopyButtonAppearance = keyof typeof zuiCopyButtonAppearances;
68
+
69
+ export const zuiCopyButtonSizes = {
70
+ sm: "h-8 px-2.5 text-xs [&_svg]:size-3.5",
71
+ md: "h-9 px-3 text-sm [&_svg]:size-4",
72
+ lg: "h-11 px-4 text-base [&_svg]:size-5",
73
+ } as const;
74
+
75
+ export type ZuiCopyButtonSize = keyof typeof zuiCopyButtonSizes;
76
+
77
+ export const zuiCopyButtonIconOnlySizes = {
78
+ sm: "w-8 px-0",
79
+ md: "w-9 px-0",
80
+ lg: "w-11 px-0",
81
+ } as const;
@@ -1,5 +1,6 @@
1
1
  export * from "./accordion";
2
2
  export * from "./alert";
3
+ export * from "./animated-number";
3
4
  export * from "./avatar";
4
5
  export * from "./badge";
5
6
  export * from "./breadcrumb";
@@ -8,6 +9,7 @@ export * from "./card";
8
9
  export * from "./checkbox";
9
10
  export * from "./command";
10
11
  export * from "./context-menu";
12
+ export * from "./copy-button";
11
13
  export * from "./divider";
12
14
  export * from "./drawer";
13
15
  export * from "./dropdown";
@@ -15,6 +17,7 @@ export * from "./dynamic-stepper";
15
17
  export * from "./empty-state";
16
18
  export * from "./file-upload";
17
19
  export * from "./inputs";
20
+ export * from "./kbd";
18
21
  export * from "./marquee";
19
22
  export * from "./modal";
20
23
  export * from "./otp-input";
@@ -0,0 +1,83 @@
1
+ export const zuiKbdBase = [
2
+ "inline-flex items-center justify-center gap-1 align-middle",
3
+ "rounded-[var(--zui-kbd-radius,0.375rem)] font-mono font-medium leading-none select-none",
4
+ ] as const;
5
+
6
+ export const zuiKbdKeyAppearances = {
7
+ default:
8
+ "bg-[var(--zui-kbd-default-bg,#0f172a)] dark:bg-[var(--zui-kbd-default-bg-dark,#f8fafc)] text-[color:var(--zui-kbd-default-fg,#f8fafc)] dark:text-[color:var(--zui-kbd-default-fg-dark,#020617)] shadow-[var(--zui-kbd-default-shadow,0_1px_2px_#0f172a14)] dark:shadow-[var(--zui-kbd-default-shadow-dark,0_1px_2px_#0f172a1f)]",
9
+ secondary:
10
+ "bg-[var(--zui-kbd-secondary-bg,#e2e8f0)] dark:bg-[var(--zui-kbd-secondary-bg-dark,#1e293b)] text-[color:var(--zui-kbd-secondary-fg,#0f172a)] dark:text-[color:var(--zui-kbd-secondary-fg-dark,#f8fafc)]",
11
+ destructive:
12
+ "bg-[var(--zui-kbd-destructive-bg,#f43f5e)] dark:bg-[var(--zui-kbd-destructive-bg-dark,#be123c)] text-[color:var(--zui-kbd-destructive-fg,#ffffff)] dark:text-[color:var(--zui-kbd-destructive-fg-dark,#ffffff)]",
13
+ outline:
14
+ "border border-[color:var(--zui-kbd-outline-border,#0000001a)] dark:border-[color:var(--zui-kbd-outline-border-dark,#ffffff1a)] bg-[var(--zui-kbd-outline-bg,#0000000d)] dark:bg-[var(--zui-kbd-outline-bg-dark,#ffffff0d)] text-[color:var(--zui-kbd-outline-fg,#0f172a)] dark:text-[color:var(--zui-kbd-outline-fg-dark,#f8fafc)]",
15
+ ghost:
16
+ "bg-transparent text-[color:var(--zui-kbd-ghost-fg,#334155)] dark:text-[color:var(--zui-kbd-ghost-fg-dark,#e2e8f0)]",
17
+ glass:
18
+ "border border-[color:var(--zui-kbd-glass-border,#00000026)] dark:border-[color:var(--zui-kbd-glass-border-dark,#ffffff26)] bg-[var(--zui-kbd-glass-bg,#0000001a)] dark:bg-[var(--zui-kbd-glass-bg-dark,#ffffff1a)] text-[color:var(--zui-kbd-glass-fg,#0f172a)] dark:text-[color:var(--zui-kbd-glass-fg-dark,#ffffff)] backdrop-blur-md",
19
+ emerald:
20
+ "bg-[var(--zui-kbd-emerald-bg,#10b981)] dark:bg-[var(--zui-kbd-emerald-bg-dark,#065f46)] text-[color:var(--zui-kbd-emerald-fg,#ffffff)] dark:text-[color:var(--zui-kbd-emerald-fg-dark,#ffffff)]",
21
+ indigo:
22
+ "bg-[var(--zui-kbd-indigo-bg,#3730a3)] dark:bg-[var(--zui-kbd-indigo-bg-dark,#4f46e5)] text-[color:var(--zui-kbd-indigo-fg,#ffffff)] dark:text-[color:var(--zui-kbd-indigo-fg-dark,#ffffff)]",
23
+ purple:
24
+ "bg-[var(--zui-kbd-purple-bg,#6b21a8)] dark:bg-[var(--zui-kbd-purple-bg-dark,#9333ea)] text-[color:var(--zui-kbd-purple-fg,#ffffff)] dark:text-[color:var(--zui-kbd-purple-fg-dark,#ffffff)]",
25
+ pink:
26
+ "bg-[var(--zui-kbd-pink-bg,#9d174d)] dark:bg-[var(--zui-kbd-pink-bg-dark,#db2777)] text-[color:var(--zui-kbd-pink-fg,#ffffff)] dark:text-[color:var(--zui-kbd-pink-fg-dark,#ffffff)]",
27
+ rose:
28
+ "bg-[var(--zui-kbd-rose-bg,#9f1239)] dark:bg-[var(--zui-kbd-rose-bg-dark,#e11d48)] text-[color:var(--zui-kbd-rose-fg,#ffffff)] dark:text-[color:var(--zui-kbd-rose-fg-dark,#ffffff)]",
29
+ sky:
30
+ "bg-[var(--zui-kbd-sky-bg,#0ea5e9)] dark:bg-[var(--zui-kbd-sky-bg-dark,#0369a1)] text-[color:var(--zui-kbd-sky-fg,#ffffff)] dark:text-[color:var(--zui-kbd-sky-fg-dark,#ffffff)]",
31
+ teal:
32
+ "bg-[var(--zui-kbd-teal-bg,#14b8a6)] dark:bg-[var(--zui-kbd-teal-bg-dark,#0f766e)] text-[color:var(--zui-kbd-teal-fg,#ffffff)] dark:text-[color:var(--zui-kbd-teal-fg-dark,#ffffff)]",
33
+ yellow:
34
+ "bg-[var(--zui-kbd-yellow-bg,#eab308)] dark:bg-[var(--zui-kbd-yellow-bg-dark,#854d0e)] text-[color:var(--zui-kbd-yellow-fg,#ffffff)] dark:text-[color:var(--zui-kbd-yellow-fg-dark,#ffffff)]",
35
+ orange:
36
+ "bg-[var(--zui-kbd-orange-bg,#f97316)] dark:bg-[var(--zui-kbd-orange-bg-dark,#9a3412)] text-[color:var(--zui-kbd-orange-fg,#ffffff)] dark:text-[color:var(--zui-kbd-orange-fg-dark,#ffffff)]",
37
+ gray:
38
+ "bg-[var(--zui-kbd-gray-bg,#6b7280)] dark:bg-[var(--zui-kbd-gray-bg-dark,#374151)] text-[color:var(--zui-kbd-gray-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gray-fg-dark,#ffffff)]",
39
+ amber:
40
+ "bg-[var(--zui-kbd-amber-bg,#f59e0b)] dark:bg-[var(--zui-kbd-amber-bg-dark,#92400e)] text-[color:var(--zui-kbd-amber-fg,#ffffff)] dark:text-[color:var(--zui-kbd-amber-fg-dark,#ffffff)]",
41
+ violet:
42
+ "bg-[var(--zui-kbd-violet-bg,#5b21b6)] dark:bg-[var(--zui-kbd-violet-bg-dark,#7c3aed)] text-[color:var(--zui-kbd-violet-fg,#ffffff)] dark:text-[color:var(--zui-kbd-violet-fg-dark,#ffffff)]",
43
+ "gradient-blue":
44
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-blue-from,#1e40af)] dark:from-[var(--zui-kbd-gradient-blue-from-dark,#2563eb)] to-[var(--zui-kbd-gradient-blue-to,#6b21a8)] dark:to-[var(--zui-kbd-gradient-blue-to-dark,#9333ea)] text-[color:var(--zui-kbd-gradient-blue-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-blue-fg-dark,#ffffff)]",
45
+ "gradient-green":
46
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-green-from,#166534)] dark:from-[var(--zui-kbd-gradient-green-from-dark,#16a34a)] to-[var(--zui-kbd-gradient-green-to,#3f6212)] dark:to-[var(--zui-kbd-gradient-green-to-dark,#65a30d)] text-[color:var(--zui-kbd-gradient-green-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-green-fg-dark,#ffffff)]",
47
+ "gradient-red":
48
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-red-from,#991b1b)] dark:from-[var(--zui-kbd-gradient-red-from-dark,#dc2626)] to-[var(--zui-kbd-gradient-red-to,#9d174d)] dark:to-[var(--zui-kbd-gradient-red-to-dark,#db2777)] text-[color:var(--zui-kbd-gradient-red-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-red-fg-dark,#ffffff)]",
49
+ "gradient-yellow":
50
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-yellow-from,#854d0e)] dark:from-[var(--zui-kbd-gradient-yellow-from-dark,#ca8a04)] to-[var(--zui-kbd-gradient-yellow-to,#9a3412)] dark:to-[var(--zui-kbd-gradient-yellow-to-dark,#ea580c)] text-[color:var(--zui-kbd-gradient-yellow-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-yellow-fg-dark,#ffffff)]",
51
+ "gradient-purple":
52
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-purple-from,#6b21a8)] dark:from-[var(--zui-kbd-gradient-purple-from-dark,#9333ea)] to-[var(--zui-kbd-gradient-purple-to,#9d174d)] dark:to-[var(--zui-kbd-gradient-purple-to-dark,#db2777)] text-[color:var(--zui-kbd-gradient-purple-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-purple-fg-dark,#ffffff)]",
53
+ "gradient-teal":
54
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-teal-from,#115e59)] dark:from-[var(--zui-kbd-gradient-teal-from-dark,#0d9488)] to-[var(--zui-kbd-gradient-teal-to,#155e75)] dark:to-[var(--zui-kbd-gradient-teal-to-dark,#0891b2)] text-[color:var(--zui-kbd-gradient-teal-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-teal-fg-dark,#ffffff)]",
55
+ "gradient-indigo":
56
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-indigo-from,#3730a3)] dark:from-[var(--zui-kbd-gradient-indigo-from-dark,#4f46e5)] to-[var(--zui-kbd-gradient-indigo-to,#6b21a8)] dark:to-[var(--zui-kbd-gradient-indigo-to-dark,#9333ea)] text-[color:var(--zui-kbd-gradient-indigo-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-indigo-fg-dark,#ffffff)]",
57
+ "gradient-pink":
58
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-pink-from,#9d174d)] dark:from-[var(--zui-kbd-gradient-pink-from-dark,#db2777)] to-[var(--zui-kbd-gradient-pink-to,#9f1239)] dark:to-[var(--zui-kbd-gradient-pink-to-dark,#e11d48)] text-[color:var(--zui-kbd-gradient-pink-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-pink-fg-dark,#ffffff)]",
59
+ "gradient-orange":
60
+ "bg-linear-to-r from-[var(--zui-kbd-gradient-orange-from,#9a3412)] dark:from-[var(--zui-kbd-gradient-orange-from-dark,#ea580c)] to-[var(--zui-kbd-gradient-orange-to,#991b1b)] dark:to-[var(--zui-kbd-gradient-orange-to-dark,#dc2626)] text-[color:var(--zui-kbd-gradient-orange-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-orange-fg-dark,#ffffff)]",
61
+ } as const;
62
+
63
+ export type ZuiKbdAppearance = keyof typeof zuiKbdKeyAppearances;
64
+
65
+ export const zuiKbdKeyBase = [
66
+ "inline-flex items-center justify-center font-mono font-medium leading-none",
67
+ "rounded-[var(--zui-kbd-radius,0.375rem)]",
68
+ "shadow-[var(--zui-kbd-shadow,inset_0_-1px_0_#0000001f)] dark:shadow-[var(--zui-kbd-shadow-dark,inset_0_-1px_0_#0000004d)]",
69
+ ] as const;
70
+
71
+ export const zuiKbdKeySizes = {
72
+ sm: "h-5 min-w-5 px-1 text-[0.7rem]",
73
+ md: "h-6 min-w-6 px-1.5 text-xs",
74
+ lg: "h-7 min-w-7 px-2 text-sm",
75
+ } as const;
76
+
77
+ export type ZuiKbdSize = keyof typeof zuiKbdKeySizes;
78
+
79
+ export const zuiKbdSeparatorSizes = {
80
+ sm: "text-[0.7rem]",
81
+ md: "text-xs",
82
+ lg: "text-sm",
83
+ } as const;
@@ -0,0 +1,64 @@
1
+ import { render, screen } from "@testing-library/react";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { AnimatedNumber, AnimatedNumberCounter } from "./animated-number";
5
+
6
+ describe("AnimatedNumber", () => {
7
+ it("renders one span per digit", () => {
8
+ render(<AnimatedNumber number={123} />);
9
+ expect(screen.getByText("1")).toBeInTheDocument();
10
+ expect(screen.getByText("2")).toBeInTheDocument();
11
+ expect(screen.getByText("3")).toBeInTheDocument();
12
+ });
13
+
14
+ it("applies the default appearance token by default", () => {
15
+ render(<AnimatedNumber number={7} />);
16
+ expect(screen.getByText("7").className).toContain(
17
+ "--zui-animated-number-default-fg",
18
+ );
19
+ });
20
+
21
+ it("applies the requested appearance token", () => {
22
+ render(<AnimatedNumber number={5} appearance="success" />);
23
+ expect(screen.getByText("5").className).toContain(
24
+ "--zui-animated-number-success-fg",
25
+ );
26
+ });
27
+
28
+ it("clips a gradient to the text for gradient appearances", () => {
29
+ render(<AnimatedNumber number={9} appearance="gradient-blue" />);
30
+ const span = screen.getByText("9");
31
+ expect(span.className).toContain("bg-clip-text");
32
+ expect(span.className).toContain("text-transparent");
33
+ });
34
+
35
+ it("applies the requested size token", () => {
36
+ render(<AnimatedNumber number={4} size="lg" />);
37
+ expect(screen.getByText("4").className).toMatch(/text-6xl/);
38
+ });
39
+
40
+ it("merges a custom className onto each digit", () => {
41
+ render(<AnimatedNumber number={8} className="custom-digit" />);
42
+ expect(screen.getByText("8").className).toContain("custom-digit");
43
+ });
44
+ });
45
+
46
+ describe("AnimatedNumberCounter", () => {
47
+ it("renders a paragraph starting from zero", () => {
48
+ render(<AnimatedNumberCounter number={500} />);
49
+ expect(screen.getByText("0").tagName).toBe("P");
50
+ });
51
+
52
+ it("applies the requested appearance token", () => {
53
+ render(<AnimatedNumberCounter number={500} appearance="orange" />);
54
+ expect(screen.getByText("0").className).toContain(
55
+ "--zui-animated-number-orange-fg",
56
+ );
57
+ });
58
+
59
+ it("defers the count until the element is in view", () => {
60
+ render(<AnimatedNumberCounter number={500} />);
61
+ expect(screen.getByText("0")).toBeInTheDocument();
62
+ expect(screen.queryByText("500")).not.toBeInTheDocument();
63
+ });
64
+ });