@zentauri-ui/zentauri-components 2.1.9 → 2.2.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 (144) hide show
  1. package/README.md +7 -5
  2. package/cli/props.json +620 -0
  3. package/cli/registry.json +13 -1
  4. package/dist/{chunk-OLT7P7JO.mjs → chunk-45ZHGDT2.mjs} +3 -3
  5. package/dist/{chunk-OLT7P7JO.mjs.map → chunk-45ZHGDT2.mjs.map} +1 -1
  6. package/dist/chunk-46HJFCP7.js +87 -0
  7. package/dist/chunk-46HJFCP7.js.map +1 -0
  8. package/dist/chunk-4KOQS4DT.mjs +96 -0
  9. package/dist/chunk-4KOQS4DT.mjs.map +1 -0
  10. package/dist/{chunk-3RC5IG6O.mjs → chunk-5HLEHSPM.mjs} +24 -5
  11. package/dist/chunk-5HLEHSPM.mjs.map +1 -0
  12. package/dist/{chunk-7CZDJTPD.js → chunk-DUH2YLH2.js} +12 -12
  13. package/dist/{chunk-7CZDJTPD.js.map → chunk-DUH2YLH2.js.map} +1 -1
  14. package/dist/chunk-DXNIAFBG.js +103 -0
  15. package/dist/chunk-DXNIAFBG.js.map +1 -0
  16. package/dist/chunk-EMZC6ICD.mjs +55 -0
  17. package/dist/chunk-EMZC6ICD.mjs.map +1 -0
  18. package/dist/chunk-HNPGWFVY.js +65 -0
  19. package/dist/chunk-HNPGWFVY.js.map +1 -0
  20. package/dist/chunk-HR6MGXNI.mjs +212 -0
  21. package/dist/chunk-HR6MGXNI.mjs.map +1 -0
  22. package/dist/chunk-LOEKM3FL.mjs +78 -0
  23. package/dist/chunk-LOEKM3FL.mjs.map +1 -0
  24. package/dist/{chunk-7DGPRPWM.js → chunk-NW5BSLR2.js} +6 -6
  25. package/dist/{chunk-7DGPRPWM.js.map → chunk-NW5BSLR2.js.map} +1 -1
  26. package/dist/{chunk-4TPE5DEG.js → chunk-UJZ7JQBQ.js} +24 -5
  27. package/dist/chunk-UJZ7JQBQ.js.map +1 -0
  28. package/dist/chunk-WMM42MAC.js +222 -0
  29. package/dist/chunk-WMM42MAC.js.map +1 -0
  30. package/dist/chunk-YBKNXDZU.js +19 -0
  31. package/dist/{chunk-MWG7LHAK.js.map → chunk-YBKNXDZU.js.map} +1 -1
  32. package/dist/{chunk-3HBC34NF.mjs → chunk-YSQW56JX.mjs} +4 -4
  33. package/dist/{chunk-3HBC34NF.mjs.map → chunk-YSQW56JX.mjs.map} +1 -1
  34. package/dist/{chunk-VN7FE5RR.mjs → chunk-Z4Y5IPR3.mjs} +3 -3
  35. package/dist/{chunk-VN7FE5RR.mjs.map → chunk-Z4Y5IPR3.mjs.map} +1 -1
  36. package/dist/design-system/facade.js +7 -5
  37. package/dist/design-system/facade.js.map +1 -1
  38. package/dist/design-system/facade.mjs +6 -4
  39. package/dist/design-system/facade.mjs.map +1 -1
  40. package/dist/design-system/index.d.ts +2 -0
  41. package/dist/design-system/index.d.ts.map +1 -1
  42. package/dist/design-system/password-strength-meter.d.ts +74 -0
  43. package/dist/design-system/password-strength-meter.d.ts.map +1 -0
  44. package/dist/design-system/typing-indicator.d.ts +47 -0
  45. package/dist/design-system/typing-indicator.d.ts.map +1 -0
  46. package/dist/ui/buttons/animated.js +9 -7
  47. package/dist/ui/buttons/animated.js.map +1 -1
  48. package/dist/ui/buttons/animated.mjs +7 -5
  49. package/dist/ui/buttons/animated.mjs.map +1 -1
  50. package/dist/ui/buttons.js +10 -8
  51. package/dist/ui/buttons.mjs +8 -6
  52. package/dist/ui/data-table.js +20 -18
  53. package/dist/ui/data-table.js.map +1 -1
  54. package/dist/ui/data-table.mjs +10 -8
  55. package/dist/ui/data-table.mjs.map +1 -1
  56. package/dist/ui/dynamic-stepper.js +19 -17
  57. package/dist/ui/dynamic-stepper.js.map +1 -1
  58. package/dist/ui/dynamic-stepper.mjs +8 -6
  59. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  60. package/dist/ui/pagination.js +11 -9
  61. package/dist/ui/pagination.mjs +8 -6
  62. package/dist/ui/password-strength-meter/animated/animations.d.ts +3 -0
  63. package/dist/ui/password-strength-meter/animated/animations.d.ts.map +1 -0
  64. package/dist/ui/password-strength-meter/animated/index.d.ts +4 -0
  65. package/dist/ui/password-strength-meter/animated/index.d.ts.map +1 -0
  66. package/dist/ui/password-strength-meter/animated/password-strength-meter-animated.d.ts +14 -0
  67. package/dist/ui/password-strength-meter/animated/password-strength-meter-animated.d.ts.map +1 -0
  68. package/dist/ui/password-strength-meter/animated/types.d.ts +21 -0
  69. package/dist/ui/password-strength-meter/animated/types.d.ts.map +1 -0
  70. package/dist/ui/password-strength-meter/animated.js +169 -0
  71. package/dist/ui/password-strength-meter/animated.js.map +1 -0
  72. package/dist/ui/password-strength-meter/animated.mjs +165 -0
  73. package/dist/ui/password-strength-meter/animated.mjs.map +1 -0
  74. package/dist/ui/password-strength-meter/index.d.ts +5 -0
  75. package/dist/ui/password-strength-meter/index.d.ts.map +1 -0
  76. package/dist/ui/password-strength-meter/password-strength-meter-base.d.ts +17 -0
  77. package/dist/ui/password-strength-meter/password-strength-meter-base.d.ts.map +1 -0
  78. package/dist/ui/password-strength-meter/password-strength-meter.d.ts +6 -0
  79. package/dist/ui/password-strength-meter/password-strength-meter.d.ts.map +1 -0
  80. package/dist/ui/password-strength-meter/types.d.ts +33 -0
  81. package/dist/ui/password-strength-meter/types.d.ts.map +1 -0
  82. package/dist/ui/password-strength-meter/variants.d.ts +13 -0
  83. package/dist/ui/password-strength-meter/variants.d.ts.map +1 -0
  84. package/dist/ui/password-strength-meter.js +37 -0
  85. package/dist/ui/password-strength-meter.js.map +1 -0
  86. package/dist/ui/password-strength-meter.mjs +16 -0
  87. package/dist/ui/password-strength-meter.mjs.map +1 -0
  88. package/dist/ui/split-button.js +21 -19
  89. package/dist/ui/split-button.js.map +1 -1
  90. package/dist/ui/split-button.mjs +8 -6
  91. package/dist/ui/split-button.mjs.map +1 -1
  92. package/dist/ui/typing-indicator/animated/animations.d.ts +8 -0
  93. package/dist/ui/typing-indicator/animated/animations.d.ts.map +1 -0
  94. package/dist/ui/typing-indicator/animated/index.d.ts +4 -0
  95. package/dist/ui/typing-indicator/animated/index.d.ts.map +1 -0
  96. package/dist/ui/typing-indicator/animated/types.d.ts +9 -0
  97. package/dist/ui/typing-indicator/animated/types.d.ts.map +1 -0
  98. package/dist/ui/typing-indicator/animated/typing-indicator-animated.d.ts +6 -0
  99. package/dist/ui/typing-indicator/animated/typing-indicator-animated.d.ts.map +1 -0
  100. package/dist/ui/typing-indicator/animated.js +119 -0
  101. package/dist/ui/typing-indicator/animated.js.map +1 -0
  102. package/dist/ui/typing-indicator/animated.mjs +116 -0
  103. package/dist/ui/typing-indicator/animated.mjs.map +1 -0
  104. package/dist/ui/typing-indicator/index.d.ts +4 -0
  105. package/dist/ui/typing-indicator/index.d.ts.map +1 -0
  106. package/dist/ui/typing-indicator/types.d.ts +13 -0
  107. package/dist/ui/typing-indicator/types.d.ts.map +1 -0
  108. package/dist/ui/typing-indicator/typing-indicator-base.d.ts +13 -0
  109. package/dist/ui/typing-indicator/typing-indicator-base.d.ts.map +1 -0
  110. package/dist/ui/typing-indicator/typing-indicator.d.ts +2 -0
  111. package/dist/ui/typing-indicator/typing-indicator.d.ts.map +1 -0
  112. package/dist/ui/typing-indicator/variants.d.ts +16 -0
  113. package/dist/ui/typing-indicator/variants.d.ts.map +1 -0
  114. package/dist/ui/typing-indicator.js +32 -0
  115. package/dist/ui/typing-indicator.js.map +1 -0
  116. package/dist/ui/typing-indicator.mjs +7 -0
  117. package/dist/ui/typing-indicator.mjs.map +1 -0
  118. package/package.json +1 -1
  119. package/src/design-system/index.ts +2 -0
  120. package/src/design-system/password-strength-meter.ts +115 -0
  121. package/src/design-system/typing-indicator.ts +74 -0
  122. package/src/ui/password-strength-meter/animated/animations.ts +10 -0
  123. package/src/ui/password-strength-meter/animated/index.ts +14 -0
  124. package/src/ui/password-strength-meter/animated/password-strength-meter-animated.tsx +186 -0
  125. package/src/ui/password-strength-meter/animated/types.ts +35 -0
  126. package/src/ui/password-strength-meter/index.ts +18 -0
  127. package/src/ui/password-strength-meter/password-strength-meter-base.tsx +202 -0
  128. package/src/ui/password-strength-meter/password-strength-meter.test.tsx +103 -0
  129. package/src/ui/password-strength-meter/password-strength-meter.tsx +8 -0
  130. package/src/ui/password-strength-meter/types.ts +40 -0
  131. package/src/ui/password-strength-meter/variants.ts +49 -0
  132. package/src/ui/typing-indicator/animated/animations.ts +58 -0
  133. package/src/ui/typing-indicator/animated/index.ts +8 -0
  134. package/src/ui/typing-indicator/animated/types.ts +11 -0
  135. package/src/ui/typing-indicator/animated/typing-indicator-animated.tsx +79 -0
  136. package/src/ui/typing-indicator/index.ts +15 -0
  137. package/src/ui/typing-indicator/types.ts +20 -0
  138. package/src/ui/typing-indicator/typing-indicator-base.tsx +75 -0
  139. package/src/ui/typing-indicator/typing-indicator.test.tsx +76 -0
  140. package/src/ui/typing-indicator/typing-indicator.tsx +2 -0
  141. package/src/ui/typing-indicator/variants.ts +49 -0
  142. package/dist/chunk-3RC5IG6O.mjs.map +0 -1
  143. package/dist/chunk-4TPE5DEG.js.map +0 -1
  144. package/dist/chunk-MWG7LHAK.js +0 -19
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/typing-indicator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,2BAA2B,GAAG,YAAY,CACpD,OAAO,0BAA0B,CAClC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE5C,MAAM,MAAM,wBAAwB,GAAG,2BAA2B,GAChE,qBAAqB,CAAC,MAAM,CAAC,GAAG;IAC9B,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,aAAa,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEJ,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { TypingIndicatorBaseProps } from "./types";
2
+ export declare function TypingIndicatorBase({ appearance, size, dots, label, labelPosition, className, ref, ...rest }: TypingIndicatorBaseProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace TypingIndicatorBase {
4
+ var displayName: string;
5
+ }
6
+ export declare function TypingIndicatorLabel({ size, children, }: {
7
+ size?: TypingIndicatorBaseProps["size"];
8
+ children: React.ReactNode;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export declare namespace TypingIndicatorLabel {
11
+ var displayName: string;
12
+ }
13
+ //# sourceMappingURL=typing-indicator-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator-base.d.ts","sourceRoot":"","sources":["../../../src/ui/typing-indicator/typing-indicator-base.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AASxD,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,IAAI,EACJ,IAAQ,EACR,KAAK,EACL,aAAwB,EACxB,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,wBAAwB,2CA+B1B;yBAxCe,mBAAmB;;;AA4CnC,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CASA;yBAfe,oBAAoB"}
@@ -0,0 +1,2 @@
1
+ export { TypingIndicatorBase as TypingIndicator } from "./typing-indicator-base";
2
+ //# sourceMappingURL=typing-indicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator.d.ts","sourceRoot":"","sources":["../../../src/ui/typing-indicator/typing-indicator.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { zuiTypingIndicatorDotDelays } from "../../design-system/typing-indicator";
2
+ export { zuiTypingIndicatorDotDelays as typingIndicatorDotDelays };
3
+ export declare const typingIndicatorVariants: (props?: ({
4
+ size?: "md" | "sm" | "lg" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ export declare const typingIndicatorDotsVariants: (props?: ({
7
+ size?: "md" | "sm" | "lg" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export declare const typingIndicatorDotVariants: (props?: ({
10
+ appearance?: "default" | "muted" | "sky" | "emerald" | "rose" | "slate" | "gray" | "indigo" | "cyan" | "blue" | "green" | "lime" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "gradient-blue" | "gradient-green" | "gradient-purple" | "zinc" | "subtle" | "primary" | null | undefined;
11
+ size?: "md" | "sm" | "lg" | null | undefined;
12
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
+ export declare const typingIndicatorLabelVariants: (props?: ({
14
+ size?: "md" | "sm" | "lg" | null | undefined;
15
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/typing-indicator/variants.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,2BAA2B,EAM5B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,2BAA2B,IAAI,wBAAwB,EAAE,CAAC;AAEnE,eAAO,MAAM,uBAAuB;;8EAOlC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;8EAKtC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;8EASrC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;8EAKvC,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkDXNIAFBG_js = require('../chunk-DXNIAFBG.js');
5
+ require('../chunk-HNPGWFVY.js');
6
+ require('../chunk-ZS5756ZC.js');
7
+ require('../chunk-PZ5AY32C.js');
8
+
9
+
10
+
11
+ Object.defineProperty(exports, "TypingIndicator", {
12
+ enumerable: true,
13
+ get: function () { return chunkDXNIAFBG_js.TypingIndicatorBase; }
14
+ });
15
+ Object.defineProperty(exports, "typingIndicatorDotVariants", {
16
+ enumerable: true,
17
+ get: function () { return chunkDXNIAFBG_js.typingIndicatorDotVariants; }
18
+ });
19
+ Object.defineProperty(exports, "typingIndicatorDotsVariants", {
20
+ enumerable: true,
21
+ get: function () { return chunkDXNIAFBG_js.typingIndicatorDotsVariants; }
22
+ });
23
+ Object.defineProperty(exports, "typingIndicatorLabelVariants", {
24
+ enumerable: true,
25
+ get: function () { return chunkDXNIAFBG_js.typingIndicatorLabelVariants; }
26
+ });
27
+ Object.defineProperty(exports, "typingIndicatorVariants", {
28
+ enumerable: true,
29
+ get: function () { return chunkDXNIAFBG_js.typingIndicatorVariants; }
30
+ });
31
+ //# sourceMappingURL=typing-indicator.js.map
32
+ //# sourceMappingURL=typing-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"typing-indicator.js"}
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ export { TypingIndicatorBase as TypingIndicator, typingIndicatorDotVariants, typingIndicatorDotsVariants, typingIndicatorLabelVariants, typingIndicatorVariants } from '../chunk-4KOQS4DT.mjs';
3
+ import '../chunk-EMZC6ICD.mjs';
4
+ import '../chunk-4D54YOL6.mjs';
5
+ import '../chunk-J5LGTIGS.mjs';
6
+ //# sourceMappingURL=typing-indicator.mjs.map
7
+ //# sourceMappingURL=typing-indicator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"typing-indicator.mjs"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zentauri-ui/zentauri-components",
3
- "version": "2.1.9",
3
+ "version": "2.2.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
  "keywords": [
6
6
  "react",
@@ -26,6 +26,7 @@ export * from "./marquee";
26
26
  export * from "./modal";
27
27
  export * from "./otp-input";
28
28
  export * from "./pagination";
29
+ export * from "./password-strength-meter";
29
30
  export * from "./popover";
30
31
  export * from "./progress";
31
32
  export * from "./rating";
@@ -42,6 +43,7 @@ export * from "./timeline";
42
43
  export * from "./toast";
43
44
  export * from "./tokens";
44
45
  export * from "./toggle";
46
+ export * from "./typing-indicator";
45
47
  export * from "./tooltip";
46
48
  export * from "./tree-view";
47
49
  export * from "./typography";
@@ -0,0 +1,115 @@
1
+ export const zuiPasswordStrengthMeterBase =
2
+ "w-full text-[color:var(--zui-password-strength-meter-fg,var(--zui-fg,oklch(20.8%_0.042_265.755)))] dark:text-[color:var(--zui-password-strength-meter-fg-dark,var(--zui-fg-dark,oklch(98.4%_0.003_247.858)))]";
3
+
4
+ export const zuiPasswordStrengthMeterAppearances = {
5
+ default:
6
+ "[--psm-fill:var(--zui-password-strength-meter-default-fill,var(--zui-brand,oklch(20.8%_0.042_265.755)))] dark:[--psm-fill:var(--zui-password-strength-meter-default-fill-dark,var(--zui-brand-dark,oklch(98.4%_0.003_247.858)))]",
7
+ secondary:
8
+ "[--psm-fill:var(--zui-password-strength-meter-secondary-fill,var(--zui-fg,oklch(44.6%_0.043_257.281)))] dark:[--psm-fill:var(--zui-password-strength-meter-secondary-fill-dark,var(--zui-fg-dark,oklch(86.9%_0.022_252.894)))]",
9
+ destructive:
10
+ "[--psm-fill:var(--zui-password-strength-meter-destructive-fill,var(--zui-status-error,oklch(45.5%_0.188_13.697)))] dark:[--psm-fill:var(--zui-password-strength-meter-destructive-fill-dark,var(--zui-status-error-dark,oklch(71.2%_0.194_13.428)))]",
11
+ emerald:
12
+ "[--psm-fill:var(--zui-password-strength-meter-emerald-fill,var(--zui-color-emerald,oklch(43.2%_0.095_166.913)))] dark:[--psm-fill:var(--zui-password-strength-meter-emerald-fill-dark,var(--zui-color-emerald-dark,oklch(76.5%_0.177_163.223)))]",
13
+ indigo:
14
+ "[--psm-fill:var(--zui-password-strength-meter-indigo-fill,var(--zui-color-indigo,oklch(39.8%_0.195_277.366)))] dark:[--psm-fill:var(--zui-password-strength-meter-indigo-fill-dark,var(--zui-color-indigo-dark,oklch(67.3%_0.182_276.935)))]",
15
+ purple:
16
+ "[--psm-fill:var(--zui-password-strength-meter-purple-fill,var(--zui-color-purple,oklch(43.8%_0.218_303.724)))] dark:[--psm-fill:var(--zui-password-strength-meter-purple-fill-dark,var(--zui-color-purple-dark,oklch(71.4%_0.203_305.504)))]",
17
+ pink: "[--psm-fill:var(--zui-password-strength-meter-pink-fill,var(--zui-color-pink,oklch(45.9%_0.187_3.815)))] dark:[--psm-fill:var(--zui-password-strength-meter-pink-fill-dark,var(--zui-color-pink-dark,oklch(71.8%_0.202_349.761)))]",
18
+ rose: "[--psm-fill:var(--zui-password-strength-meter-rose-fill,var(--zui-color-rose,oklch(45.5%_0.188_13.697)))] dark:[--psm-fill:var(--zui-password-strength-meter-rose-fill-dark,var(--zui-color-rose-dark,oklch(71.2%_0.194_13.428)))]",
19
+ sky: "[--psm-fill:var(--zui-password-strength-meter-sky-fill,var(--zui-color-sky,oklch(44.3%_0.11_240.79)))] dark:[--psm-fill:var(--zui-password-strength-meter-sky-fill-dark,var(--zui-color-sky-dark,oklch(74.6%_0.16_232.661)))]",
20
+ teal: "[--psm-fill:var(--zui-password-strength-meter-teal-fill,var(--zui-color-teal,oklch(43.7%_0.078_188.216)))] dark:[--psm-fill:var(--zui-password-strength-meter-teal-fill-dark,var(--zui-color-teal-dark,oklch(77.7%_0.152_181.912)))]",
21
+ yellow:
22
+ "[--psm-fill:var(--zui-password-strength-meter-yellow-fill,var(--zui-color-yellow,oklch(47.6%_0.114_61.907)))] dark:[--psm-fill:var(--zui-password-strength-meter-yellow-fill-dark,var(--zui-color-yellow-dark,oklch(85.2%_0.199_91.936)))]",
23
+ orange:
24
+ "[--psm-fill:var(--zui-password-strength-meter-orange-fill,var(--zui-color-orange,oklch(47%_0.157_37.304)))] dark:[--psm-fill:var(--zui-password-strength-meter-orange-fill-dark,var(--zui-color-orange-dark,oklch(75%_0.183_55.934)))]",
25
+ outline:
26
+ "[--psm-fill:var(--zui-password-strength-meter-outline-fill,var(--zui-fg,oklch(52%_0.105_223.128)))] dark:[--psm-fill:var(--zui-password-strength-meter-outline-fill-dark,var(--zui-fg-dark,oklch(86.5%_0.127_207.078)))]",
27
+ ghost:
28
+ "[--psm-fill:var(--zui-password-strength-meter-ghost-fill,var(--zui-fg,oklch(27.9%_0.041_260.031)))] dark:[--psm-fill:var(--zui-password-strength-meter-ghost-fill-dark,var(--zui-fg-dark,oklch(92.9%_0.013_255.508)))]",
29
+ glass:
30
+ "[--psm-fill:var(--zui-password-strength-meter-glass-fill,var(--zui-fg,oklch(20.8%_0.042_265.755)))] dark:[--psm-fill:var(--zui-password-strength-meter-glass-fill-dark,var(--zui-fg-dark,#ffffff))]",
31
+ "gradient-blue":
32
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-blue-fill,var(--zui-color-blue,linear-gradient(90deg,oklch(62.3%_0.214_259.815)),oklch(62.7%_0.265_303.9)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-blue-fill-dark,var(--zui-color-blue-dark,linear-gradient(90deg,oklch(62.3%_0.214_259.815)),oklch(62.7%_0.265_303.9)))]",
33
+ "gradient-green":
34
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-green-fill,var(--zui-color-green,linear-gradient(90deg,oklch(72.3%_0.219_149.579)),oklch(76.8%_0.233_130.85)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-green-fill-dark,var(--zui-color-green-dark,linear-gradient(90deg,oklch(72.3%_0.219_149.579)),oklch(76.8%_0.233_130.85)))]",
35
+ "gradient-red":
36
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-red-fill,var(--zui-color-red,linear-gradient(90deg,oklch(63.7%_0.237_25.331)),oklch(65.6%_0.241_354.308)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-red-fill-dark,var(--zui-color-red-dark,linear-gradient(90deg,oklch(63.7%_0.237_25.331)),oklch(65.6%_0.241_354.308)))]",
37
+ "gradient-yellow":
38
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-yellow-fill,var(--zui-color-yellow,linear-gradient(90deg,oklch(79.5%_0.184_86.047)),oklch(70.5%_0.213_47.604)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-yellow-fill-dark,var(--zui-color-yellow-dark,linear-gradient(90deg,oklch(79.5%_0.184_86.047)),oklch(70.5%_0.213_47.604)))]",
39
+ "gradient-purple":
40
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-purple-fill,var(--zui-color-purple,linear-gradient(90deg,oklch(62.7%_0.265_303.9)),oklch(65.6%_0.241_354.308)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-purple-fill-dark,var(--zui-color-purple-dark,linear-gradient(90deg,oklch(62.7%_0.265_303.9)),oklch(65.6%_0.241_354.308)))]",
41
+ "gradient-teal":
42
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-teal-fill,var(--zui-color-teal,linear-gradient(90deg,oklch(70.4%_0.14_182.503)),oklch(71.5%_0.143_215.221)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-teal-fill-dark,var(--zui-color-teal-dark,linear-gradient(90deg,oklch(70.4%_0.14_182.503)),oklch(71.5%_0.143_215.221)))]",
43
+ "gradient-indigo":
44
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-indigo-fill,var(--zui-color-indigo,linear-gradient(90deg,oklch(58.5%_0.233_277.117)),oklch(62.7%_0.265_303.9)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-indigo-fill-dark,var(--zui-color-indigo-dark,linear-gradient(90deg,oklch(58.5%_0.233_277.117)),oklch(62.7%_0.265_303.9)))]",
45
+ "gradient-pink":
46
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-pink-fill,var(--zui-color-pink,linear-gradient(90deg,oklch(65.6%_0.241_354.308)),oklch(64.5%_0.246_16.439)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-pink-fill-dark,var(--zui-color-pink-dark,linear-gradient(90deg,oklch(65.6%_0.241_354.308)),oklch(64.5%_0.246_16.439)))]",
47
+ "gradient-orange":
48
+ "[--psm-fill:var(--zui-password-strength-meter-gradient-orange-fill,var(--zui-color-orange,linear-gradient(90deg,oklch(70.5%_0.213_47.604)),oklch(63.7%_0.237_25.331)))] dark:[--psm-fill:var(--zui-password-strength-meter-gradient-orange-fill-dark,var(--zui-color-orange-dark,linear-gradient(90deg,oklch(70.5%_0.213_47.604)),oklch(63.7%_0.237_25.331)))]",
49
+ blue: "[--psm-fill:var(--zui-password-strength-meter-blue-fill,var(--zui-color-blue,#2563eb))] dark:[--psm-fill:var(--zui-password-strength-meter-blue-fill-dark,var(--zui-color-blue-dark,#3b82f6))]",
50
+ cyan: "[--psm-fill:var(--zui-password-strength-meter-cyan-fill,var(--zui-color-cyan,#0891b2))] dark:[--psm-fill:var(--zui-password-strength-meter-cyan-fill-dark,var(--zui-color-cyan-dark,#22d3ee))]",
51
+ green:
52
+ "[--psm-fill:var(--zui-password-strength-meter-green-fill,var(--zui-color-green,#16a34a))] dark:[--psm-fill:var(--zui-password-strength-meter-green-fill-dark,var(--zui-color-green-dark,#22c55e))]",
53
+ lime: "[--psm-fill:var(--zui-password-strength-meter-lime-fill,var(--zui-color-lime,#65a30d))] dark:[--psm-fill:var(--zui-password-strength-meter-lime-fill-dark,var(--zui-color-lime-dark,#a3e635))]",
54
+ mint: "[--psm-fill:var(--zui-password-strength-meter-mint-fill,var(--zui-color-mint,#10b981))] dark:[--psm-fill:var(--zui-password-strength-meter-mint-fill-dark,var(--zui-color-mint-dark,#6ee7b7))]",
55
+ ocean:
56
+ "[--psm-fill:var(--zui-password-strength-meter-ocean-fill,var(--zui-color-ocean,#0284c7))] dark:[--psm-fill:var(--zui-password-strength-meter-ocean-fill-dark,var(--zui-color-ocean-dark,#38bdf8))]",
57
+ sapphire:
58
+ "[--psm-fill:var(--zui-password-strength-meter-sapphire-fill,var(--zui-color-sapphire,#1d4ed8))] dark:[--psm-fill:var(--zui-password-strength-meter-sapphire-fill-dark,var(--zui-color-sapphire-dark,#60a5fa))]",
59
+ lavender:
60
+ "[--psm-fill:var(--zui-password-strength-meter-lavender-fill,var(--zui-color-lavender,#8b5cf6))] dark:[--psm-fill:var(--zui-password-strength-meter-lavender-fill-dark,var(--zui-color-lavender-dark,#a78bfa))]",
61
+ ruby: "[--psm-fill:var(--zui-password-strength-meter-ruby-fill,var(--zui-color-ruby,#be123c))] dark:[--psm-fill:var(--zui-password-strength-meter-ruby-fill-dark,var(--zui-color-ruby-dark,#fb7185))]",
62
+ red: "[--psm-fill:var(--zui-password-strength-meter-red-fill,var(--zui-color-red,#dc2626))] dark:[--psm-fill:var(--zui-password-strength-meter-red-fill-dark,var(--zui-color-red-dark,#ef4444))]",
63
+ slate:
64
+ "[--psm-fill:var(--zui-password-strength-meter-slate-fill,var(--zui-color-slate,#475569))] dark:[--psm-fill:var(--zui-password-strength-meter-slate-fill-dark,var(--zui-color-slate-dark,#64748b))]",
65
+ zinc: "[--psm-fill:var(--zui-password-strength-meter-zinc-fill,var(--zui-color-zinc,#52525b))] dark:[--psm-fill:var(--zui-password-strength-meter-zinc-fill-dark,var(--zui-color-zinc-dark,#71717a))]",
66
+ stone:
67
+ "[--psm-fill:var(--zui-password-strength-meter-stone-fill,var(--zui-color-stone,#57534e))] dark:[--psm-fill:var(--zui-password-strength-meter-stone-fill-dark,var(--zui-color-stone-dark,#78716c))]",
68
+ royal:
69
+ "[--psm-fill:var(--zui-password-strength-meter-royal-fill,var(--zui-color-royal,#4338ca))] dark:[--psm-fill:var(--zui-password-strength-meter-royal-fill-dark,var(--zui-color-royal-dark,#818cf8))]",
70
+ electric:
71
+ "[--psm-fill:var(--zui-password-strength-meter-electric-fill,var(--zui-color-electric,#0ea5e9))] dark:[--psm-fill:var(--zui-password-strength-meter-electric-fill-dark,var(--zui-color-electric-dark,#38bdf8))]",
72
+ forest:
73
+ "[--psm-fill:var(--zui-password-strength-meter-forest-fill,var(--zui-color-forest,#166534))] dark:[--psm-fill:var(--zui-password-strength-meter-forest-fill-dark,var(--zui-color-forest-dark,#4ade80))]",
74
+ sunset:
75
+ "[--psm-fill:var(--zui-password-strength-meter-sunset-fill,var(--zui-color-sunset,#ea580c))] dark:[--psm-fill:var(--zui-password-strength-meter-sunset-fill-dark,var(--zui-color-sunset-dark,#fb923c))]",
76
+ magenta:
77
+ "[--psm-fill:var(--zui-password-strength-meter-magenta-fill,var(--zui-color-magenta,#c026d3))] dark:[--psm-fill:var(--zui-password-strength-meter-magenta-fill-dark,var(--zui-color-magenta-dark,#e879f9))]",
78
+ crimson:
79
+ "[--psm-fill:var(--zui-password-strength-meter-crimson-fill,var(--zui-color-crimson,#b91c1c))] dark:[--psm-fill:var(--zui-password-strength-meter-crimson-fill-dark,var(--zui-color-crimson-dark,#f87171))]",
80
+ aqua: "[--psm-fill:var(--zui-password-strength-meter-aqua-fill,var(--zui-color-aqua,#0f766e))] dark:[--psm-fill:var(--zui-password-strength-meter-aqua-fill-dark,var(--zui-color-aqua-dark,#2dd4bf))]",
81
+ plum: "[--psm-fill:var(--zui-password-strength-meter-plum-fill,var(--zui-color-plum,#7e22ce))] dark:[--psm-fill:var(--zui-password-strength-meter-plum-fill-dark,var(--zui-color-plum-dark,#c084fc))]",
82
+ } as const;
83
+
84
+ export const zuiPasswordStrengthMeterSizes = {
85
+ xs: "text-[0.65rem]",
86
+ sm: "text-xs",
87
+ md: "text-sm",
88
+ lg: "text-base",
89
+ xl: "text-lg",
90
+ } as const;
91
+
92
+ export const zuiPasswordStrengthMeterShapes = {
93
+ flat: "rounded-none",
94
+ rounded: "rounded-md",
95
+ pill: "rounded-full",
96
+ } as const;
97
+
98
+ export const zuiPasswordStrengthMeterTrackBase =
99
+ "relative w-full overflow-hidden bg-[var(--zui-password-strength-meter-track-bg,var(--zui-surface-muted,#0000001a))] dark:bg-[var(--zui-password-strength-meter-track-bg-dark,var(--zui-surface-muted-dark,#ffffff1a))]";
100
+
101
+ export const zuiPasswordStrengthMeterTrackSizes = {
102
+ xs: "h-1",
103
+ sm: "h-1.5",
104
+ md: "h-2",
105
+ lg: "h-3",
106
+ xl: "h-4",
107
+ } as const;
108
+
109
+ export const zuiPasswordStrengthMeterBarBase =
110
+ "h-full w-full origin-left rounded-[inherit]";
111
+
112
+ export const zuiPasswordStrengthMeterBarSegmented = {
113
+ true: "[background:var(--zui-password-strength-meter-bar-bg-segmented,linear-gradient(90deg,var(--zui-status-error,oklch(45.5%_0.188_13.697))_0 calc(100%/5),var(--zui-color-orange,oklch(47%_0.157_37.304))_0 calc(200%/5),var(--zui-color-yellow,oklch(47.6%_0.114_61.907))_0 calc(300%/5),var(--zui-color-emerald,oklch(43.2%_0.095_166.913))_0 calc(400%/5),var(--zui-color-indigo,oklch(39.8%_0.195_277.366))_0))] dark:[background:var(--zui-password-strength-meter-bar-bg-segmented-dark,linear-gradient(90deg,var(--zui-status-error-dark,oklch(71.2%_0.194_13.428))_0 calc(100%/5),var(--zui-color-orange-dark,oklch(75%_0.183_55.934))_0 calc(200%/5),var(--zui-color-yellow-dark,oklch(85.2%_0.199_91.936))_0 calc(300%/5),var(--zui-color-emerald-dark,oklch(76.5%_0.177_163.223))_0 calc(400%/5),var(--zui-color-indigo-dark,oklch(67.3%_0.182_276.935))_0))]",
114
+ false: "[background:var(--psm-fill)]",
115
+ } as const;
@@ -0,0 +1,74 @@
1
+ export const zuiTypingIndicatorAppearances = {
2
+ default:
3
+ "bg-[var(--zui-typing-indicator-default-dot-bg,var(--zui-brand,oklch(20.8%_0.042_265.755)))] dark:bg-[var(--zui-typing-indicator-default-dot-bg-dark,var(--zui-brand-dark,oklch(98.4%_0.003_247.858)))]",
4
+ subtle:
5
+ "bg-[var(--zui-typing-indicator-subtle-dot-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-typing-indicator-subtle-dot-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))]",
6
+ muted:
7
+ "bg-[var(--zui-typing-indicator-muted-dot-bg,var(--zui-fg-muted,oklch(44.6%_0.043_257.281)))] dark:bg-[var(--zui-typing-indicator-muted-dot-bg-dark,var(--zui-fg-muted-dark,oklch(86.9%_0.022_252.894)))]",
8
+ primary:
9
+ "bg-[var(--zui-typing-indicator-primary-dot-bg,var(--zui-fg,oklch(20.8%_0.042_265.755)))] dark:bg-[var(--zui-typing-indicator-primary-dot-bg-dark,var(--zui-fg-dark,oklch(98.4%_0.003_247.858)))]",
10
+ blue: "bg-[var(--zui-typing-indicator-blue-dot-bg,var(--zui-color-blue,#2563eb))] dark:bg-[var(--zui-typing-indicator-blue-dot-bg-dark,var(--zui-color-blue-dark,#3b82f6))]",
11
+ cyan: "bg-[var(--zui-typing-indicator-cyan-dot-bg,var(--zui-color-cyan,#0891b2))] dark:bg-[var(--zui-typing-indicator-cyan-dot-bg-dark,var(--zui-color-cyan-dark,#22d3ee))]",
12
+ green:
13
+ "bg-[var(--zui-typing-indicator-green-dot-bg,var(--zui-color-green,#16a34a))] dark:bg-[var(--zui-typing-indicator-green-dot-bg-dark,var(--zui-color-green-dark,#22c55e))]",
14
+ lime: "bg-[var(--zui-typing-indicator-lime-dot-bg,var(--zui-color-lime,#65a30d))] dark:bg-[var(--zui-typing-indicator-lime-dot-bg-dark,var(--zui-color-lime-dark,#a3e635))]",
15
+ emerald:
16
+ "bg-[var(--zui-typing-indicator-emerald-dot-bg,var(--zui-color-emerald,oklch(69.6%_0.17_162.48)))] dark:bg-[var(--zui-typing-indicator-emerald-dot-bg-dark,var(--zui-color-emerald-dark,oklch(43.2%_0.095_166.913)))]",
17
+ indigo:
18
+ "bg-[var(--zui-typing-indicator-indigo-dot-bg,var(--zui-color-indigo,oklch(39.8%_0.195_277.366)))] dark:bg-[var(--zui-typing-indicator-indigo-dot-bg-dark,var(--zui-color-indigo-dark,oklch(51.1%_0.262_276.966)))]",
19
+ purple:
20
+ "bg-[var(--zui-typing-indicator-purple-dot-bg,var(--zui-color-purple,oklch(43.8%_0.218_303.724)))] dark:bg-[var(--zui-typing-indicator-purple-dot-bg-dark,var(--zui-color-purple-dark,oklch(55.8%_0.288_302.321)))]",
21
+ pink: "bg-[var(--zui-typing-indicator-pink-dot-bg,var(--zui-color-pink,oklch(45.9%_0.187_3.815)))] dark:bg-[var(--zui-typing-indicator-pink-dot-bg-dark,var(--zui-color-pink-dark,oklch(59.2%_0.249_0.584)))]",
22
+ rose: "bg-[var(--zui-typing-indicator-rose-dot-bg,var(--zui-color-rose,oklch(64.5%_0.246_16.439)))] dark:bg-[var(--zui-typing-indicator-rose-dot-bg-dark,var(--zui-color-rose-dark,oklch(51.4%_0.222_16.935)))]",
23
+ sky: "bg-[var(--zui-typing-indicator-sky-dot-bg,var(--zui-color-sky,oklch(68.5%_0.169_237.323)))] dark:bg-[var(--zui-typing-indicator-sky-dot-bg-dark,var(--zui-color-sky-dark,oklch(50%_0.134_242.749)))]",
24
+ teal: "bg-[var(--zui-typing-indicator-teal-dot-bg,var(--zui-color-teal,oklch(70.4%_0.14_182.503)))] dark:bg-[var(--zui-typing-indicator-teal-dot-bg-dark,var(--zui-color-teal-dark,oklch(51.1%_0.096_186.391)))]",
25
+ yellow:
26
+ "bg-[var(--zui-typing-indicator-yellow-dot-bg,var(--zui-color-yellow,oklch(79.5%_0.184_86.047)))] dark:bg-[var(--zui-typing-indicator-yellow-dot-bg-dark,var(--zui-color-yellow-dark,oklch(47.6%_0.114_61.907)))]",
27
+ orange:
28
+ "bg-[var(--zui-typing-indicator-orange-dot-bg,var(--zui-color-orange,oklch(70.5%_0.213_47.604)))] dark:bg-[var(--zui-typing-indicator-orange-dot-bg-dark,var(--zui-color-orange-dark,oklch(47%_0.157_37.304)))]",
29
+ red: "bg-[var(--zui-typing-indicator-red-dot-bg,var(--zui-color-red,#dc2626))] dark:bg-[var(--zui-typing-indicator-red-dot-bg-dark,var(--zui-color-red-dark,#ef4444))]",
30
+ slate:
31
+ "bg-[var(--zui-typing-indicator-slate-dot-bg,var(--zui-color-slate,#475569))] dark:bg-[var(--zui-typing-indicator-slate-dot-bg-dark,var(--zui-color-slate-dark,#64748b))]",
32
+ gray: "bg-[var(--zui-typing-indicator-gray-dot-bg,var(--zui-color-gray,oklch(55.1%_0.027_264.364)))] dark:bg-[var(--zui-typing-indicator-gray-dot-bg-dark,var(--zui-color-gray-dark,oklch(55.1%_0.027_264.364)))]",
33
+ zinc: "bg-[var(--zui-typing-indicator-zinc-dot-bg,var(--zui-color-zinc,#52525b))] dark:bg-[var(--zui-typing-indicator-zinc-dot-bg-dark,var(--zui-color-zinc-dark,#71717a))]",
34
+ "gradient-blue":
35
+ "bg-linear-to-r from-[var(--zui-typing-indicator-gradient-blue-from,var(--zui-color-blue,oklch(42.4%_0.199_265.638)))] dark:from-[var(--zui-typing-indicator-gradient-blue-from-dark,var(--zui-color-blue-dark,oklch(54.6%_0.245_262.881)))] to-[var(--zui-typing-indicator-gradient-blue-to,var(--zui-color-purple,oklch(43.8%_0.218_303.724)))] dark:to-[var(--zui-typing-indicator-gradient-blue-to-dark,var(--zui-color-purple-dark,oklch(55.8%_0.288_302.321)))]",
36
+ "gradient-green":
37
+ "bg-linear-to-r from-[var(--zui-typing-indicator-gradient-green-from,var(--zui-color-green,oklch(44.8%_0.119_151.328)))] dark:from-[var(--zui-typing-indicator-gradient-green-from-dark,var(--zui-color-green-dark,oklch(62.7%_0.194_149.214)))] to-[var(--zui-typing-indicator-gradient-green-to,var(--zui-color-lime,oklch(45.3%_0.124_130.933)))] dark:to-[var(--zui-typing-indicator-gradient-green-to-dark,var(--zui-color-lime-dark,oklch(64.8%_0.2_131.684)))]",
38
+ "gradient-purple":
39
+ "bg-linear-to-r from-[var(--zui-typing-indicator-gradient-purple-from,var(--zui-color-purple,oklch(43.8%_0.218_303.724)))] dark:from-[var(--zui-typing-indicator-gradient-purple-from-dark,var(--zui-color-purple-dark,oklch(55.8%_0.288_302.321)))] to-[var(--zui-typing-indicator-gradient-purple-to,var(--zui-color-pink,oklch(45.9%_0.187_3.815)))] dark:to-[var(--zui-typing-indicator-gradient-purple-to-dark,var(--zui-color-pink-dark,oklch(59.2%_0.249_0.584)))]",
40
+ } as const;
41
+
42
+ export const zuiTypingIndicatorDotsBase = "inline-flex items-center";
43
+
44
+ export const zuiTypingIndicatorDotBase =
45
+ "rounded-full animate-bounce [animation-duration:1.4s]";
46
+
47
+ export const zuiTypingIndicatorDotDelays = [
48
+ "[animation-delay:0s]",
49
+ "[animation-delay:0.16s]",
50
+ "[animation-delay:0.32s]",
51
+ ] as const;
52
+
53
+ export const zuiTypingIndicatorSizes = {
54
+ sm: "gap-1",
55
+ md: "gap-1.5",
56
+ lg: "gap-2",
57
+ } as const;
58
+
59
+ export const zuiTypingIndicatorDotSizes = {
60
+ sm: "size-1.5",
61
+ md: "size-2",
62
+ lg: "size-2.5",
63
+ } as const;
64
+
65
+ export const zuiTypingIndicatorLabelBase =
66
+ "text-[color:var(--zui-typing-indicator-label-fg,var(--zui-fg-muted,oklch(44.6%_0.043_257.287)))] dark:text-[color:var(--zui-typing-indicator-label-fg-dark,var(--zui-fg-muted-dark,oklch(86.9%_0.022_252.894)))]";
67
+
68
+ export const zuiTypingIndicatorLabelSizes = {
69
+ sm: "text-xs",
70
+ md: "text-sm",
71
+ lg: "text-base",
72
+ } as const;
73
+
74
+ export const zuiTypingIndicatorContainerBase = "inline-flex items-center gap-2";
@@ -0,0 +1,10 @@
1
+ import { PasswordStrengthMeterAnimationPresets } from "./types";
2
+
3
+ export const passwordStrengthMeterAnimationPresets: PasswordStrengthMeterAnimationPresets =
4
+ {
5
+ none: {},
6
+ shimmer: {
7
+ animate: { backgroundPosition: ["0% 0%", "100% 0%"] },
8
+ transition: { repeat: Infinity, duration: 1.2, ease: "linear" },
9
+ },
10
+ };
@@ -0,0 +1,14 @@
1
+ "use client";
2
+
3
+ export {
4
+ PasswordStrengthMeterAnimated,
5
+ PasswordStrengthMeterBarAnimated,
6
+ } from "./password-strength-meter-animated";
7
+ export type {
8
+ PasswordStrengthMeterAnimatedProps,
9
+ PasswordStrengthMeterAnimation,
10
+ PasswordStrengthMeterAnimationPresets,
11
+ PasswordStrengthMeterPresetMotionProps,
12
+ PasswordStrengthMeterVariantProps,
13
+ } from "./types";
14
+ export { passwordStrengthMeterAnimationPresets } from "./animations";
@@ -0,0 +1,186 @@
1
+ "use client";
2
+
3
+ import { useId, useMemo } from "react";
4
+ import { motion } from "framer-motion";
5
+
6
+ import { cn, clamp } from "../../../lib/utils";
7
+
8
+ import { passwordStrengthMeterAnimationPresets } from "./animations";
9
+ import type { PasswordStrengthMeterAnimatedProps } from "./types";
10
+ import type {
11
+ PasswordStrengthMeterCtx,
12
+ PasswordStrengthMeterSectionProps,
13
+ } from "../types";
14
+ import {
15
+ passwordStrengthMeterBarVariants,
16
+ passwordStrengthMeterTrackVariants,
17
+ passwordStrengthMeterVariants,
18
+ } from "../variants";
19
+ import {
20
+ getStrengthColor,
21
+ getStrengthLabel,
22
+ PasswordStrengthMeterContext,
23
+ usePasswordStrengthMeterContext,
24
+ } from "../password-strength-meter-base";
25
+
26
+ export function PasswordStrengthMeterAnimated({
27
+ className,
28
+ appearance = "default",
29
+ size = "md",
30
+ shape = "rounded",
31
+ animated = false,
32
+ segmented = false,
33
+ value = 0,
34
+ min = 0,
35
+ max = 100,
36
+ label,
37
+ scoreLabel,
38
+ showScoreLabel = true,
39
+ children,
40
+ ref,
41
+ animation = "none",
42
+ ...rest
43
+ }: PasswordStrengthMeterAnimatedProps) {
44
+ const clamped = clamp(value, min, max);
45
+ const percent = max === min ? 0 : ((clamped - min) / (max - min)) * 100;
46
+ const labelSlotId = `${useId()}-password-strength-meter-label`;
47
+ const hasInlineLabelProp = Boolean(label?.trim().length);
48
+
49
+ const labelingProps = useMemo(() => {
50
+ if (hasInlineLabelProp) {
51
+ return { "aria-label": label?.trim() ?? "Password strength" };
52
+ }
53
+ return { "aria-label": "Password strength" };
54
+ }, [hasInlineLabelProp, label]);
55
+
56
+ const ctx = useMemo<PasswordStrengthMeterCtx>(
57
+ () => ({
58
+ value: clamped,
59
+ min,
60
+ max,
61
+ size: size ?? "md",
62
+ shape: shape ?? "rounded",
63
+ animated: Boolean(animated),
64
+ segmented: Boolean(segmented),
65
+ appearance: appearance ?? "default",
66
+ labelSlotId,
67
+ }),
68
+ [
69
+ animated,
70
+ appearance,
71
+ clamped,
72
+ labelSlotId,
73
+ max,
74
+ min,
75
+ shape,
76
+ size,
77
+ segmented,
78
+ ],
79
+ );
80
+
81
+ const motionProps = passwordStrengthMeterAnimationPresets[animation];
82
+
83
+ return (
84
+ <PasswordStrengthMeterContext.Provider value={ctx}>
85
+ <motion.div
86
+ ref={ref}
87
+ data-slot="password-strength-meter"
88
+ role="meter"
89
+ aria-valuemin={min}
90
+ aria-valuemax={max}
91
+ aria-valuenow={clamped}
92
+ aria-valuetext={getStrengthLabel(percent)}
93
+ {...labelingProps}
94
+ className={cn(
95
+ passwordStrengthMeterVariants({ appearance, size, shape }),
96
+ className,
97
+ )}
98
+ initial={animation === "none" ? false : undefined}
99
+ {...motionProps}
100
+ {...rest}
101
+ >
102
+ {children ?? (
103
+ <>
104
+ {(label || showScoreLabel) && (
105
+ <div className="flex items-center justify-between mb-1.5">
106
+ {label && (
107
+ <span
108
+ id={labelSlotId}
109
+ data-slot="password-strength-meter-label"
110
+ className="text-xs font-medium"
111
+ >
112
+ {label}
113
+ </span>
114
+ )}
115
+ {showScoreLabel && (
116
+ <span
117
+ data-slot="password-strength-meter-score-label"
118
+ className={cn(
119
+ "text-xs font-semibold",
120
+ getStrengthColor(percent),
121
+ )}
122
+ >
123
+ {scoreLabel ?? getStrengthLabel(percent)}
124
+ </span>
125
+ )}
126
+ </div>
127
+ )}
128
+ <PasswordStrengthMeterBarAnimated
129
+ style={{ transform: `scaleX(${percent / 100})` }}
130
+ />
131
+ </>
132
+ )}
133
+ </motion.div>
134
+ </PasswordStrengthMeterContext.Provider>
135
+ );
136
+ }
137
+
138
+ PasswordStrengthMeterAnimated.displayName = "PasswordStrengthMeterAnimated";
139
+
140
+ export function PasswordStrengthMeterBarAnimated({
141
+ className,
142
+ style,
143
+ ref,
144
+ ...rest
145
+ }: PasswordStrengthMeterSectionProps & {
146
+ style?: React.CSSProperties;
147
+ ref?: React.Ref<HTMLDivElement>;
148
+ }) {
149
+ const { size, shape, animated, segmented } = usePasswordStrengthMeterContext(
150
+ "PasswordStrengthMeterBar",
151
+ );
152
+
153
+ return (
154
+ <div
155
+ data-slot="password-strength-meter-track"
156
+ className={cn(
157
+ passwordStrengthMeterTrackVariants({ size, shape }),
158
+ "text-current",
159
+ )}
160
+ >
161
+ <motion.div
162
+ ref={ref}
163
+ data-slot="password-strength-meter-bar"
164
+ className={cn(
165
+ passwordStrengthMeterBarVariants({ segmented }),
166
+ className,
167
+ )}
168
+ style={{
169
+ transformOrigin: "left center",
170
+ ...style,
171
+ }}
172
+ animate={
173
+ animated ? { x: ["-30%", "0%"], opacity: [0.85, 1] } : undefined
174
+ }
175
+ transition={
176
+ animated
177
+ ? { repeat: Infinity, duration: 1.1, ease: "easeInOut" }
178
+ : undefined
179
+ }
180
+ {...rest}
181
+ />
182
+ </div>
183
+ );
184
+ }
185
+
186
+ PasswordStrengthMeterBarAnimated.displayName = "PasswordStrengthMeterBar";
@@ -0,0 +1,35 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { HTMLMotionProps } from "framer-motion";
3
+ import type { ReactNode } from "react";
4
+ import type { passwordStrengthMeterVariants } from "../variants";
5
+
6
+ export type PasswordStrengthMeterVariantProps = VariantProps<
7
+ typeof passwordStrengthMeterVariants
8
+ >;
9
+
10
+ export type PasswordStrengthMeterAnimation = "none" | "shimmer";
11
+
12
+ export type PasswordStrengthMeterPresetMotionProps = Pick<
13
+ HTMLMotionProps<"div">,
14
+ "transition" | "animate"
15
+ >;
16
+
17
+ export type PasswordStrengthMeterAnimationPresets = Record<
18
+ PasswordStrengthMeterAnimation,
19
+ PasswordStrengthMeterPresetMotionProps
20
+ >;
21
+
22
+ export type PasswordStrengthMeterAnimatedProps =
23
+ PasswordStrengthMeterVariantProps &
24
+ Omit<HTMLMotionProps<"div">, "children"> & {
25
+ value: number;
26
+ min?: number;
27
+ max?: number;
28
+ label?: string;
29
+ scoreLabel?: string;
30
+ showScoreLabel?: boolean;
31
+ animated?: boolean;
32
+ segmented?: boolean;
33
+ children?: ReactNode;
34
+ animation?: PasswordStrengthMeterAnimation;
35
+ };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ export { PasswordStrengthMeter } from "./password-strength-meter";
4
+ export {
5
+ PasswordStrengthMeterBar,
6
+ PasswordStrengthMeterBase,
7
+ } from "./password-strength-meter-base";
8
+ export type {
9
+ PasswordStrengthMeterProps,
10
+ PasswordStrengthMeterSectionProps,
11
+ PasswordStrengthMeterCtx,
12
+ PasswordStrengthMeterVariantProps,
13
+ } from "./types";
14
+ export {
15
+ passwordStrengthMeterVariants,
16
+ passwordStrengthMeterTrackVariants,
17
+ passwordStrengthMeterBarVariants,
18
+ } from "./variants";