@zentauri-ui/zentauri-components 1.7.3 → 1.7.5
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.
- package/README.md +10 -6
- package/cli/registry.json +2 -0
- package/dist/{chunk-CL55KGDF.js → chunk-3W224B3M.js} +22 -22
- package/dist/chunk-3W224B3M.js.map +1 -0
- package/dist/{chunk-NZDHSIIC.js → chunk-4OCTFG3W.js} +3 -3
- package/dist/chunk-4OCTFG3W.js.map +1 -0
- package/dist/{chunk-4ZKBLVQX.js → chunk-5565GZ4T.js} +19 -19
- package/dist/chunk-5565GZ4T.js.map +1 -0
- package/dist/{chunk-BTJYXKCW.js → chunk-6HPS3ZOP.js} +15 -15
- package/dist/chunk-6HPS3ZOP.js.map +1 -0
- package/dist/chunk-7XCUMSCJ.mjs +80 -0
- package/dist/chunk-7XCUMSCJ.mjs.map +1 -0
- package/dist/{chunk-QAJOE3HJ.js → chunk-BU2MPXPZ.js} +6 -6
- package/dist/chunk-BU2MPXPZ.js.map +1 -0
- package/dist/{chunk-BC6M42HQ.mjs → chunk-CL3VH223.mjs} +21 -21
- package/dist/chunk-CL3VH223.mjs.map +1 -0
- package/dist/{chunk-QXHS3HHZ.mjs → chunk-D3VZKUMH.mjs} +15 -15
- package/dist/chunk-D3VZKUMH.mjs.map +1 -0
- package/dist/{chunk-EDARAO7X.js → chunk-DFCDLVZA.js} +7 -7
- package/dist/chunk-DFCDLVZA.js.map +1 -0
- package/dist/{chunk-ACGVDY5J.mjs → chunk-EZCYSFML.mjs} +4 -4
- package/dist/chunk-EZCYSFML.mjs.map +1 -0
- package/dist/{chunk-ZYKJC5HH.js → chunk-G66SXATZ.js} +15 -15
- package/dist/chunk-G66SXATZ.js.map +1 -0
- package/dist/{chunk-QBPVJH4P.mjs → chunk-H7WDA6U6.mjs} +5 -5
- package/dist/chunk-H7WDA6U6.mjs.map +1 -0
- package/dist/{chunk-OZMSE44N.mjs → chunk-HLG2YJFZ.mjs} +19 -19
- package/dist/chunk-HLG2YJFZ.mjs.map +1 -0
- package/dist/{chunk-QYLTKBH7.js → chunk-INXWZ4DS.js} +3 -3
- package/dist/chunk-INXWZ4DS.js.map +1 -0
- package/dist/{chunk-QSPXPU72.js → chunk-KTLJEPLF.js} +21 -21
- package/dist/chunk-KTLJEPLF.js.map +1 -0
- package/dist/chunk-LMIL2R4R.js +197 -0
- package/dist/chunk-LMIL2R4R.js.map +1 -0
- package/dist/{chunk-PR4QXFJT.js → chunk-LNYCEPW5.js} +5 -5
- package/dist/chunk-LNYCEPW5.js.map +1 -0
- package/dist/chunk-MEAVYU2Y.mjs +192 -0
- package/dist/chunk-MEAVYU2Y.mjs.map +1 -0
- package/dist/{chunk-P5WLYJ2C.mjs → chunk-NNZXBL7R.mjs} +6 -6
- package/dist/chunk-NNZXBL7R.mjs.map +1 -0
- package/dist/{chunk-HMNIH3KJ.mjs → chunk-ORFI4BCJ.mjs} +3 -3
- package/dist/chunk-ORFI4BCJ.mjs.map +1 -0
- package/dist/{chunk-K7TCW5PJ.js → chunk-PMALYOPA.js} +3 -3
- package/dist/chunk-PMALYOPA.js.map +1 -0
- package/dist/{chunk-WPXQHWPV.js → chunk-PYUZOVLY.js} +4 -4
- package/dist/chunk-PYUZOVLY.js.map +1 -0
- package/dist/{chunk-ITVMSCOJ.mjs → chunk-R2JJTREQ.mjs} +22 -22
- package/dist/chunk-R2JJTREQ.mjs.map +1 -0
- package/dist/chunk-RIHJAEOL.js +107 -0
- package/dist/chunk-RIHJAEOL.js.map +1 -0
- package/dist/{chunk-FHLZH3PB.mjs → chunk-SFRS4EZ5.mjs} +3 -3
- package/dist/chunk-SFRS4EZ5.mjs.map +1 -0
- package/dist/{chunk-KTGV76M3.mjs → chunk-SSJXWD2M.mjs} +3 -3
- package/dist/chunk-SSJXWD2M.mjs.map +1 -0
- package/dist/{chunk-YAO62VH2.js → chunk-UGH23TAH.js} +15 -15
- package/dist/chunk-UGH23TAH.js.map +1 -0
- package/dist/chunk-UPZ5XGUD.mjs +100 -0
- package/dist/chunk-UPZ5XGUD.mjs.map +1 -0
- package/dist/{chunk-4XVNQ7IY.mjs → chunk-UR7TNW45.mjs} +15 -15
- package/dist/chunk-UR7TNW45.mjs.map +1 -0
- package/dist/{chunk-HCGSEPOD.mjs → chunk-UROKWFPX.mjs} +7 -7
- package/dist/chunk-UROKWFPX.mjs.map +1 -0
- package/dist/{chunk-XRDVD2EN.js → chunk-X3O45MPI.js} +3 -3
- package/dist/{chunk-XRDVD2EN.js.map → chunk-X3O45MPI.js.map} +1 -1
- package/dist/{chunk-KEKMMNL5.mjs → chunk-XXRDLZW7.mjs} +3 -3
- package/dist/chunk-XXRDLZW7.mjs.map +1 -0
- package/dist/{chunk-NHQ3S4Y6.mjs → chunk-ZIFMIS7D.mjs} +15 -15
- package/dist/chunk-ZIFMIS7D.mjs.map +1 -0
- package/dist/chunk-ZUT7ZUM7.js +84 -0
- package/dist/chunk-ZUT7ZUM7.js.map +1 -0
- package/dist/design-system/accordion.d.ts +1 -1
- package/dist/design-system/alert.d.ts +5 -5
- package/dist/design-system/badge.d.ts +3 -3
- package/dist/design-system/card.d.ts +2 -2
- package/dist/design-system/checkbox.d.ts +10 -10
- package/dist/design-system/checkbox.d.ts.map +1 -1
- package/dist/design-system/command.d.ts +1 -1
- package/dist/design-system/command.d.ts.map +1 -1
- package/dist/design-system/drawer.d.ts +1 -1
- package/dist/design-system/dropdown.d.ts +31 -31
- package/dist/design-system/dropdown.d.ts.map +1 -1
- package/dist/design-system/file-upload.d.ts +15 -15
- package/dist/design-system/file-upload.d.ts.map +1 -1
- package/dist/design-system/index.d.ts +2 -0
- package/dist/design-system/index.d.ts.map +1 -1
- package/dist/design-system/inputs.d.ts +13 -13
- package/dist/design-system/inputs.d.ts.map +1 -1
- package/dist/design-system/modal.d.ts +1 -1
- package/dist/design-system/modal.d.ts.map +1 -1
- package/dist/design-system/otp-input.d.ts +27 -0
- package/dist/design-system/otp-input.d.ts.map +1 -0
- package/dist/design-system/pagination.d.ts +25 -25
- package/dist/design-system/popover.d.ts +19 -19
- package/dist/design-system/popover.d.ts.map +1 -1
- package/dist/design-system/radio-group.d.ts +10 -10
- package/dist/design-system/radio-group.d.ts.map +1 -1
- package/dist/design-system/scroll-area.d.ts +33 -0
- package/dist/design-system/scroll-area.d.ts.map +1 -0
- package/dist/design-system/select.d.ts +35 -35
- package/dist/design-system/select.d.ts.map +1 -1
- package/dist/design-system/skeleton.d.ts +13 -13
- package/dist/design-system/skeleton.d.ts.map +1 -1
- package/dist/design-system/slider.d.ts +23 -23
- package/dist/design-system/slider.d.ts.map +1 -1
- package/dist/design-system/stepper.d.ts +22 -22
- package/dist/design-system/table.d.ts +13 -13
- package/dist/design-system/tabs.d.ts +4 -4
- package/dist/design-system/tabs.d.ts.map +1 -1
- package/dist/design-system/toast.d.ts +17 -17
- package/dist/design-system/toast.d.ts.map +1 -1
- package/dist/design-system/toggle.d.ts +54 -54
- package/dist/design-system/toggle.d.ts.map +1 -1
- package/dist/design-system/tooltip.d.ts +20 -20
- package/dist/design-system/typography.d.ts +15 -15
- package/dist/ui/accordion/animated.js +7 -7
- package/dist/ui/accordion/animated.mjs +2 -2
- package/dist/ui/accordion.js +9 -9
- package/dist/ui/accordion.mjs +2 -2
- package/dist/ui/alert/animated/alert-animated.d.ts.map +1 -1
- package/dist/ui/alert/animated.js +2 -2
- package/dist/ui/alert/animated.js.map +1 -1
- package/dist/ui/alert/animated.mjs +1 -1
- package/dist/ui/alert/animated.mjs.map +1 -1
- package/dist/ui/alert.js +10 -10
- package/dist/ui/alert.mjs +2 -2
- package/dist/ui/badge/animated.js +2 -2
- package/dist/ui/badge/animated.mjs +1 -1
- package/dist/ui/badge/variants.d.ts +1 -1
- package/dist/ui/badge.js +4 -4
- package/dist/ui/badge.mjs +2 -2
- package/dist/ui/card/animated.js +7 -7
- package/dist/ui/card/animated.mjs +2 -2
- package/dist/ui/card.js +12 -12
- package/dist/ui/card.mjs +2 -2
- package/dist/ui/checkbox/animated.js +4 -4
- package/dist/ui/checkbox/animated.mjs +1 -1
- package/dist/ui/checkbox.js +8 -8
- package/dist/ui/checkbox.mjs +2 -2
- package/dist/ui/command/animated.js +2 -2
- package/dist/ui/command/animated.mjs +1 -1
- package/dist/ui/command.js +15 -15
- package/dist/ui/command.mjs +2 -2
- package/dist/ui/drawer/animated.js +11 -11
- package/dist/ui/drawer/animated.mjs +2 -2
- package/dist/ui/drawer.js +11 -11
- package/dist/ui/drawer.mjs +1 -1
- package/dist/ui/dropdown.js +31 -31
- package/dist/ui/dropdown.js.map +1 -1
- package/dist/ui/dropdown.mjs +31 -31
- package/dist/ui/dropdown.mjs.map +1 -1
- package/dist/ui/dynamic-stepper.js +47 -47
- package/dist/ui/dynamic-stepper.js.map +1 -1
- package/dist/ui/dynamic-stepper.mjs +47 -47
- package/dist/ui/dynamic-stepper.mjs.map +1 -1
- package/dist/ui/file-upload.js +15 -15
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/file-upload.mjs +15 -15
- package/dist/ui/file-upload.mjs.map +1 -1
- package/dist/ui/inputs/animated.js +3 -3
- package/dist/ui/inputs/animated.mjs +1 -1
- package/dist/ui/inputs.js +4 -4
- package/dist/ui/inputs.mjs +2 -2
- package/dist/ui/modal/animated.js +4 -4
- package/dist/ui/modal/animated.mjs +1 -1
- package/dist/ui/modal.js +12 -12
- package/dist/ui/modal.mjs +2 -2
- package/dist/ui/otp-input/index.d.ts +4 -0
- package/dist/ui/otp-input/index.d.ts.map +1 -0
- package/dist/ui/otp-input/otp-input.d.ts +6 -0
- package/dist/ui/otp-input/otp-input.d.ts.map +1 -0
- package/dist/ui/otp-input/types.d.ts +23 -0
- package/dist/ui/otp-input/types.d.ts.map +1 -0
- package/dist/ui/otp-input/variants.d.ts +5 -0
- package/dist/ui/otp-input/variants.d.ts.map +1 -0
- package/dist/ui/otp-input.js +302 -0
- package/dist/ui/otp-input.js.map +1 -0
- package/dist/ui/otp-input.mjs +299 -0
- package/dist/ui/otp-input.mjs.map +1 -0
- package/dist/ui/pagination.js +25 -25
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +25 -25
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/popover/animated.js +4 -4
- package/dist/ui/popover/animated.mjs +1 -1
- package/dist/ui/popover.js +7 -7
- package/dist/ui/popover.mjs +1 -1
- package/dist/ui/radio-group/animated.js +7 -7
- package/dist/ui/radio-group/animated.mjs +1 -1
- package/dist/ui/radio-group.js +11 -11
- package/dist/ui/radio-group.mjs +2 -2
- package/dist/ui/scroll-area/index.d.ts +4 -0
- package/dist/ui/scroll-area/index.d.ts.map +1 -0
- package/dist/ui/scroll-area/scroll-area.d.ts +6 -0
- package/dist/ui/scroll-area/scroll-area.d.ts.map +1 -0
- package/dist/ui/scroll-area/types.d.ts +8 -0
- package/dist/ui/scroll-area/types.d.ts.map +1 -0
- package/dist/ui/scroll-area/variants.d.ts +8 -0
- package/dist/ui/scroll-area/variants.d.ts.map +1 -0
- package/dist/ui/scroll-area.js +123 -0
- package/dist/ui/scroll-area.js.map +1 -0
- package/dist/ui/scroll-area.mjs +120 -0
- package/dist/ui/scroll-area.mjs.map +1 -0
- package/dist/ui/search.js +2 -2
- package/dist/ui/search.mjs +1 -1
- package/dist/ui/select.js +35 -35
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/select.mjs +35 -35
- package/dist/ui/select.mjs.map +1 -1
- package/dist/ui/skeleton/animated.js +8 -8
- package/dist/ui/skeleton/animated.mjs +1 -1
- package/dist/ui/skeleton.js +9 -9
- package/dist/ui/skeleton.mjs +1 -1
- package/dist/ui/slider.js +23 -23
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/slider.mjs +23 -23
- package/dist/ui/slider.mjs.map +1 -1
- package/dist/ui/stepper.js +22 -22
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/stepper.mjs +22 -22
- package/dist/ui/stepper.mjs.map +1 -1
- package/dist/ui/table/animated.js +8 -8
- package/dist/ui/table/animated.mjs +2 -2
- package/dist/ui/table.js +14 -14
- package/dist/ui/table.mjs +1 -1
- package/dist/ui/tabs/animated.js +2 -2
- package/dist/ui/tabs/animated.mjs +1 -1
- package/dist/ui/tabs.js +9 -9
- package/dist/ui/tabs.mjs +1 -1
- package/dist/ui/toast/animated.js +7 -7
- package/dist/ui/toast/animated.mjs +1 -1
- package/dist/ui/toast.js +12 -12
- package/dist/ui/toast.mjs +1 -1
- package/dist/ui/toggle/animated.js +4 -4
- package/dist/ui/toggle/animated.mjs +1 -1
- package/dist/ui/toggle.js +4 -4
- package/dist/ui/toggle.mjs +2 -2
- package/dist/ui/tooltip/animated.js +3 -3
- package/dist/ui/tooltip/animated.mjs +1 -1
- package/dist/ui/tooltip.js +7 -7
- package/dist/ui/tooltip.mjs +1 -1
- package/dist/ui/typography.js +15 -15
- package/dist/ui/typography.js.map +1 -1
- package/dist/ui/typography.mjs +15 -15
- package/dist/ui/typography.mjs.map +1 -1
- package/package.json +1 -1
- package/src/design-system/accordion.ts +1 -1
- package/src/design-system/alert.ts +5 -5
- package/src/design-system/badge.ts +3 -3
- package/src/design-system/card.ts +2 -2
- package/src/design-system/checkbox.ts +10 -12
- package/src/design-system/command.ts +1 -1
- package/src/design-system/drawer.ts +1 -1
- package/src/design-system/dropdown.ts +31 -31
- package/src/design-system/dynamic-stepper.ts +47 -47
- package/src/design-system/file-upload.ts +15 -15
- package/src/design-system/index.ts +2 -0
- package/src/design-system/inputs.ts +13 -13
- package/src/design-system/modal.ts +1 -1
- package/src/design-system/otp-input.ts +50 -0
- package/src/design-system/pagination.ts +25 -25
- package/src/design-system/popover.ts +19 -23
- package/src/design-system/radio-group.ts +10 -12
- package/src/design-system/scroll-area.ts +47 -0
- package/src/design-system/select.ts +36 -35
- package/src/design-system/skeleton.ts +20 -13
- package/src/design-system/slider.ts +23 -23
- package/src/design-system/stepper.ts +22 -22
- package/src/design-system/table.ts +13 -13
- package/src/design-system/tabs.ts +5 -4
- package/src/design-system/toast.ts +17 -17
- package/src/design-system/toggle.ts +55 -54
- package/src/design-system/tooltip.ts +20 -20
- package/src/design-system/typography.ts +15 -15
- package/src/ui/alert/animated/alert-animated.tsx +1 -0
- package/src/ui/otp-input/index.ts +9 -0
- package/src/ui/otp-input/otp-input.test.tsx +99 -0
- package/src/ui/otp-input/otp-input.tsx +327 -0
- package/src/ui/otp-input/types.ts +32 -0
- package/src/ui/otp-input/variants.ts +18 -0
- package/src/ui/scroll-area/index.ts +5 -0
- package/src/ui/scroll-area/scroll-area.test.tsx +116 -0
- package/src/ui/scroll-area/scroll-area.tsx +64 -0
- package/src/ui/scroll-area/types.ts +11 -0
- package/src/ui/scroll-area/variants.ts +44 -0
- package/dist/chunk-4XVNQ7IY.mjs.map +0 -1
- package/dist/chunk-4ZKBLVQX.js.map +0 -1
- package/dist/chunk-6QQUQLPB.js +0 -107
- package/dist/chunk-6QQUQLPB.js.map +0 -1
- package/dist/chunk-ACGVDY5J.mjs.map +0 -1
- package/dist/chunk-BC6M42HQ.mjs.map +0 -1
- package/dist/chunk-BTJYXKCW.js.map +0 -1
- package/dist/chunk-CL55KGDF.js.map +0 -1
- package/dist/chunk-EDARAO7X.js.map +0 -1
- package/dist/chunk-EN4VLNBF.js +0 -197
- package/dist/chunk-EN4VLNBF.js.map +0 -1
- package/dist/chunk-FHLZH3PB.mjs.map +0 -1
- package/dist/chunk-HCGSEPOD.mjs.map +0 -1
- package/dist/chunk-HMNIH3KJ.mjs.map +0 -1
- package/dist/chunk-ITVMSCOJ.mjs.map +0 -1
- package/dist/chunk-K6IZANTI.mjs +0 -80
- package/dist/chunk-K6IZANTI.mjs.map +0 -1
- package/dist/chunk-K7TCW5PJ.js.map +0 -1
- package/dist/chunk-KEKMMNL5.mjs.map +0 -1
- package/dist/chunk-KTGV76M3.mjs.map +0 -1
- package/dist/chunk-MTTXLC2V.mjs +0 -100
- package/dist/chunk-MTTXLC2V.mjs.map +0 -1
- package/dist/chunk-NHQ3S4Y6.mjs.map +0 -1
- package/dist/chunk-NZDHSIIC.js.map +0 -1
- package/dist/chunk-OZMSE44N.mjs.map +0 -1
- package/dist/chunk-P5WLYJ2C.mjs.map +0 -1
- package/dist/chunk-PHEUJ4EF.js +0 -84
- package/dist/chunk-PHEUJ4EF.js.map +0 -1
- package/dist/chunk-PMWRJ2KS.mjs +0 -192
- package/dist/chunk-PMWRJ2KS.mjs.map +0 -1
- package/dist/chunk-PR4QXFJT.js.map +0 -1
- package/dist/chunk-QAJOE3HJ.js.map +0 -1
- package/dist/chunk-QBPVJH4P.mjs.map +0 -1
- package/dist/chunk-QSPXPU72.js.map +0 -1
- package/dist/chunk-QXHS3HHZ.mjs.map +0 -1
- package/dist/chunk-QYLTKBH7.js.map +0 -1
- package/dist/chunk-WPXQHWPV.js.map +0 -1
- package/dist/chunk-YAO62VH2.js.map +0 -1
- package/dist/chunk-ZYKJC5HH.js.map +0 -1
|
@@ -7,43 +7,43 @@ export const zuiTooltipVariants = {
|
|
|
7
7
|
outline:
|
|
8
8
|
"border bg-[var(--zui-tooltip-outline-bg,#000000)] dark:bg-[var(--zui-tooltip-outline-bg-dark,#ffffff)] text-[color:var(--zui-tooltip-outline-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-outline-fg-dark,#000000)]",
|
|
9
9
|
ghost:
|
|
10
|
-
"bg-[var(--zui-tooltip-ghost-bg,oklch(27.8%_0.033_256.848))] text-[color:var(--zui-tooltip-ghost-fg,#ffffffe6)]",
|
|
10
|
+
"bg-[var(--zui-tooltip-ghost-bg,oklch(27.8%_0.033_256.848))] dark:bg-[var(--zui-tooltip-ghost-bg-dark,oklch(27.8%_0.033_256.848))] text-[color:var(--zui-tooltip-ghost-fg,#ffffffe6)] dark:text-[color:var(--zui-tooltip-ghost-fg-dark,#ffffffe6)]",
|
|
11
11
|
glass:
|
|
12
12
|
"border border-[color:var(--zui-tooltip-glass-border,#00000026)] dark:border-[color:var(--zui-tooltip-glass-border-dark,#ffffff26)] bg-[var(--zui-tooltip-glass-bg,#0000001a)] dark:bg-[var(--zui-tooltip-glass-bg-dark,#ffffff1a)] text-[color:var(--zui-tooltip-glass-fg,oklch(20.8%_0.042_265.755))] dark:text-[color:var(--zui-tooltip-glass-fg-dark,#ffffff)] backdrop-blur-md",
|
|
13
13
|
emerald:
|
|
14
|
-
"bg-[var(--zui-tooltip-emerald-bg,oklch(43.2%_0.095_166.913))] text-[color:var(--zui-tooltip-emerald-fg,#ffffff)]",
|
|
14
|
+
"bg-[var(--zui-tooltip-emerald-bg,oklch(43.2%_0.095_166.913))] dark:bg-[var(--zui-tooltip-emerald-bg-dark,oklch(43.2%_0.095_166.913))] text-[color:var(--zui-tooltip-emerald-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-emerald-fg-dark,#ffffff)]",
|
|
15
15
|
indigo:
|
|
16
|
-
"bg-[var(--zui-tooltip-indigo-bg,oklch(39.8%_0.195_277.366))] text-[color:var(--zui-tooltip-indigo-fg,#ffffff)]",
|
|
16
|
+
"bg-[var(--zui-tooltip-indigo-bg,oklch(39.8%_0.195_277.366))] dark:bg-[var(--zui-tooltip-indigo-bg-dark,oklch(39.8%_0.195_277.366))] text-[color:var(--zui-tooltip-indigo-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-indigo-fg-dark,#ffffff)]",
|
|
17
17
|
purple:
|
|
18
|
-
"bg-[var(--zui-tooltip-purple-bg,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-purple-fg,#ffffff)]",
|
|
19
|
-
pink: "bg-[var(--zui-tooltip-pink-bg,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-pink-fg,#ffffff)]",
|
|
20
|
-
rose: "bg-[var(--zui-tooltip-rose-bg,oklch(45.5%_0.188_13.697))] text-[color:var(--zui-tooltip-rose-fg,#ffffff)]",
|
|
21
|
-
sky: "bg-[var(--zui-tooltip-sky-bg,oklch(50%_0.134_242.749))] text-[color:var(--zui-tooltip-sky-fg,#ffffff)]",
|
|
22
|
-
teal: "bg-[var(--zui-tooltip-teal-bg,oklch(43.7%_0.078_188.216))] text-[color:var(--zui-tooltip-teal-fg,#ffffff)]",
|
|
18
|
+
"bg-[var(--zui-tooltip-purple-bg,oklch(43.8%_0.218_303.724))] dark:bg-[var(--zui-tooltip-purple-bg-dark,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-purple-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-purple-fg-dark,#ffffff)]",
|
|
19
|
+
pink: "bg-[var(--zui-tooltip-pink-bg,oklch(45.9%_0.187_3.815))] dark:bg-[var(--zui-tooltip-pink-bg-dark,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-pink-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-pink-fg-dark,#ffffff)]",
|
|
20
|
+
rose: "bg-[var(--zui-tooltip-rose-bg,oklch(45.5%_0.188_13.697))] dark:bg-[var(--zui-tooltip-rose-bg-dark,oklch(45.5%_0.188_13.697))] text-[color:var(--zui-tooltip-rose-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-rose-fg-dark,#ffffff)]",
|
|
21
|
+
sky: "bg-[var(--zui-tooltip-sky-bg,oklch(50%_0.134_242.749))] dark:bg-[var(--zui-tooltip-sky-bg-dark,oklch(50%_0.134_242.749))] text-[color:var(--zui-tooltip-sky-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-sky-fg-dark,#ffffff)]",
|
|
22
|
+
teal: "bg-[var(--zui-tooltip-teal-bg,oklch(43.7%_0.078_188.216))] dark:bg-[var(--zui-tooltip-teal-bg-dark,oklch(43.7%_0.078_188.216))] text-[color:var(--zui-tooltip-teal-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-teal-fg-dark,#ffffff)]",
|
|
23
23
|
yellow:
|
|
24
|
-
"bg-[var(--zui-tooltip-yellow-bg,oklch(47.6%_0.114_61.907))] text-[color:var(--zui-tooltip-yellow-fg,#ffffff)]",
|
|
24
|
+
"bg-[var(--zui-tooltip-yellow-bg,oklch(47.6%_0.114_61.907))] dark:bg-[var(--zui-tooltip-yellow-bg-dark,oklch(47.6%_0.114_61.907))] text-[color:var(--zui-tooltip-yellow-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-yellow-fg-dark,#ffffff)]",
|
|
25
25
|
orange:
|
|
26
|
-
"bg-[var(--zui-tooltip-orange-bg,oklch(47%_0.157_37.304))] text-[color:var(--zui-tooltip-orange-fg,#ffffff)]",
|
|
26
|
+
"bg-[var(--zui-tooltip-orange-bg,oklch(47%_0.157_37.304))] dark:bg-[var(--zui-tooltip-orange-bg-dark,oklch(47%_0.157_37.304))] text-[color:var(--zui-tooltip-orange-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-orange-fg-dark,#ffffff)]",
|
|
27
27
|
green:
|
|
28
|
-
"bg-[var(--zui-tooltip-green-bg,oklch(44.8%_0.119_151.328))] text-[color:var(--zui-tooltip-green-fg,#ffffff)]",
|
|
28
|
+
"bg-[var(--zui-tooltip-green-bg,oklch(44.8%_0.119_151.328))] dark:bg-[var(--zui-tooltip-green-bg-dark,oklch(44.8%_0.119_151.328))] text-[color:var(--zui-tooltip-green-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-green-fg-dark,#ffffff)]",
|
|
29
29
|
"gradient-blue":
|
|
30
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-blue-from,oklch(42.4%_0.199_265.638))] to-[var(--zui-tooltip-gradient-blue-to,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-gradient-blue-fg,#ffffff)]",
|
|
30
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-blue-from,oklch(42.4%_0.199_265.638))] dark:from-[var(--zui-tooltip-gradient-blue-from-dark,oklch(42.4%_0.199_265.638))] to-[var(--zui-tooltip-gradient-blue-to,oklch(43.8%_0.218_303.724))] dark:to-[var(--zui-tooltip-gradient-blue-to-dark,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-gradient-blue-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-blue-fg-dark,#ffffff)]",
|
|
31
31
|
"gradient-green":
|
|
32
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-green-from,oklch(44.8%_0.119_151.328))] to-[var(--zui-tooltip-gradient-green-to,oklch(45.3%_0.124_130.933))] text-[color:var(--zui-tooltip-gradient-green-fg,#ffffff)]",
|
|
32
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-green-from,oklch(44.8%_0.119_151.328))] dark:from-[var(--zui-tooltip-gradient-green-from-dark,oklch(44.8%_0.119_151.328))] to-[var(--zui-tooltip-gradient-green-to,oklch(45.3%_0.124_130.933))] dark:to-[var(--zui-tooltip-gradient-green-to-dark,oklch(45.3%_0.124_130.933))] text-[color:var(--zui-tooltip-gradient-green-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-green-fg-dark,#ffffff)]",
|
|
33
33
|
"gradient-red":
|
|
34
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-red-from,oklch(44.4%_0.177_26.899))] to-[var(--zui-tooltip-gradient-red-to,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-gradient-red-fg,#ffffff)]",
|
|
34
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-red-from,oklch(44.4%_0.177_26.899))] dark:from-[var(--zui-tooltip-gradient-red-from-dark,oklch(44.4%_0.177_26.899))] to-[var(--zui-tooltip-gradient-red-to,oklch(45.9%_0.187_3.815))] dark:to-[var(--zui-tooltip-gradient-red-to-dark,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-gradient-red-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-red-fg-dark,#ffffff)]",
|
|
35
35
|
"gradient-yellow":
|
|
36
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-yellow-from,oklch(47.6%_0.114_61.907))] to-[var(--zui-tooltip-gradient-yellow-to,oklch(47%_0.157_37.304))] text-[color:var(--zui-tooltip-gradient-yellow-fg,#ffffff)]",
|
|
36
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-yellow-from,oklch(47.6%_0.114_61.907))] dark:from-[var(--zui-tooltip-gradient-yellow-from-dark,oklch(47.6%_0.114_61.907))] to-[var(--zui-tooltip-gradient-yellow-to,oklch(47%_0.157_37.304))] dark:to-[var(--zui-tooltip-gradient-yellow-to-dark,oklch(47%_0.157_37.304))] text-[color:var(--zui-tooltip-gradient-yellow-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-yellow-fg-dark,#ffffff)]",
|
|
37
37
|
"gradient-purple":
|
|
38
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-purple-from,oklch(43.8%_0.218_303.724))] to-[var(--zui-tooltip-gradient-purple-to,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-gradient-purple-fg,#ffffff)]",
|
|
38
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-purple-from,oklch(43.8%_0.218_303.724))] dark:from-[var(--zui-tooltip-gradient-purple-from-dark,oklch(43.8%_0.218_303.724))] to-[var(--zui-tooltip-gradient-purple-to,oklch(45.9%_0.187_3.815))] dark:to-[var(--zui-tooltip-gradient-purple-to-dark,oklch(45.9%_0.187_3.815))] text-[color:var(--zui-tooltip-gradient-purple-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-purple-fg-dark,#ffffff)]",
|
|
39
39
|
"gradient-teal":
|
|
40
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-teal-from,oklch(43.7%_0.078_188.216))] to-[var(--zui-tooltip-gradient-teal-to,oklch(45%_0.085_224.283))] text-[color:var(--zui-tooltip-gradient-teal-fg,#ffffff)]",
|
|
40
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-teal-from,oklch(43.7%_0.078_188.216))] dark:from-[var(--zui-tooltip-gradient-teal-from-dark,oklch(43.7%_0.078_188.216))] to-[var(--zui-tooltip-gradient-teal-to,oklch(45%_0.085_224.283))] dark:to-[var(--zui-tooltip-gradient-teal-to-dark,oklch(45%_0.085_224.283))] text-[color:var(--zui-tooltip-gradient-teal-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-teal-fg-dark,#ffffff)]",
|
|
41
41
|
"gradient-indigo":
|
|
42
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-indigo-from,oklch(39.8%_0.195_277.366))] to-[var(--zui-tooltip-gradient-indigo-to,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-gradient-indigo-fg,#ffffff)]",
|
|
42
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-indigo-from,oklch(39.8%_0.195_277.366))] dark:from-[var(--zui-tooltip-gradient-indigo-from-dark,oklch(39.8%_0.195_277.366))] to-[var(--zui-tooltip-gradient-indigo-to,oklch(43.8%_0.218_303.724))] dark:to-[var(--zui-tooltip-gradient-indigo-to-dark,oklch(43.8%_0.218_303.724))] text-[color:var(--zui-tooltip-gradient-indigo-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-indigo-fg-dark,#ffffff)]",
|
|
43
43
|
"gradient-pink":
|
|
44
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-pink-from,oklch(45.9%_0.187_3.815))] to-[var(--zui-tooltip-gradient-pink-to,oklch(45.5%_0.188_13.697))] text-[color:var(--zui-tooltip-gradient-pink-fg,#ffffff)]",
|
|
44
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-pink-from,oklch(45.9%_0.187_3.815))] dark:from-[var(--zui-tooltip-gradient-pink-from-dark,oklch(45.9%_0.187_3.815))] to-[var(--zui-tooltip-gradient-pink-to,oklch(45.5%_0.188_13.697))] dark:to-[var(--zui-tooltip-gradient-pink-to-dark,oklch(45.5%_0.188_13.697))] text-[color:var(--zui-tooltip-gradient-pink-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-pink-fg-dark,#ffffff)]",
|
|
45
45
|
"gradient-orange":
|
|
46
|
-
"bg-linear-to-r from-[var(--zui-tooltip-gradient-orange-from,oklch(47%_0.157_37.304))] to-[var(--zui-tooltip-gradient-orange-to,oklch(44.4%_0.177_26.899))] text-[color:var(--zui-tooltip-gradient-orange-fg,#ffffff)]",
|
|
46
|
+
"bg-linear-to-r from-[var(--zui-tooltip-gradient-orange-from,oklch(47%_0.157_37.304))] dark:from-[var(--zui-tooltip-gradient-orange-from-dark,oklch(47%_0.157_37.304))] to-[var(--zui-tooltip-gradient-orange-to,oklch(44.4%_0.177_26.899))] dark:to-[var(--zui-tooltip-gradient-orange-to-dark,oklch(44.4%_0.177_26.899))] text-[color:var(--zui-tooltip-gradient-orange-fg,#ffffff)] dark:text-[color:var(--zui-tooltip-gradient-orange-fg-dark,#ffffff)]",
|
|
47
47
|
} as const;
|
|
48
48
|
|
|
49
49
|
export const zuiTooltipSizes = {
|
|
@@ -4,36 +4,36 @@ export const zuiTypographyTones = {
|
|
|
4
4
|
muted:
|
|
5
5
|
"text-[color:var(--zui-typography-muted-fg,oklch(55.4%_0.046_257.417))] dark:text-[color:var(--zui-typography-muted-fg-dark,oklch(70.4%_0.04_256.788))] border-[color:var(--zui-typography-muted-border,#00000026)] dark:border-[color:var(--zui-typography-muted-border-dark,#ffffff26)]",
|
|
6
6
|
primary:
|
|
7
|
-
"text-[color:var(--zui-typography-primary-fg,oklch(52%_0.105_223.128))] dark:text-[color:var(--zui-typography-primary-fg-dark,oklch(86.5%_0.127_207.078))] border-[color:var(--zui-typography-primary-border,oklch(86.5%_0.127_207.078_/_0.4))]",
|
|
7
|
+
"text-[color:var(--zui-typography-primary-fg,oklch(52%_0.105_223.128))] dark:text-[color:var(--zui-typography-primary-fg-dark,oklch(86.5%_0.127_207.078))] border-[color:var(--zui-typography-primary-border,oklch(86.5%_0.127_207.078_/_0.4))] dark:border-[color:var(--zui-typography-primary-border-dark,oklch(86.5%_0.127_207.078_/_0.4))]",
|
|
8
8
|
secondary:
|
|
9
9
|
"text-[color:var(--zui-typography-secondary-fg,oklch(44.6%_0.043_257.281))] dark:text-[color:var(--zui-typography-secondary-fg-dark,oklch(86.9%_0.022_252.894))] border-[color:var(--zui-typography-secondary-border,#00000026)] dark:border-[color:var(--zui-typography-secondary-border-dark,#ffffff26)]",
|
|
10
10
|
accent:
|
|
11
|
-
"text-[color:var(--zui-typography-accent-fg,oklch(49.1%_0.27_292.581))] dark:text-[color:var(--zui-typography-accent-fg-dark,oklch(81.1%_0.111_293.571))] border-[color:var(--zui-typography-accent-border,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
11
|
+
"text-[color:var(--zui-typography-accent-fg,oklch(49.1%_0.27_292.581))] dark:text-[color:var(--zui-typography-accent-fg-dark,oklch(81.1%_0.111_293.571))] border-[color:var(--zui-typography-accent-border,oklch(81.1%_0.111_293.571_/_0.4))] dark:border-[color:var(--zui-typography-accent-border-dark,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
12
12
|
destructive:
|
|
13
|
-
"text-[color:var(--zui-typography-destructive-fg,oklch(58.6%_0.253_17.585))] dark:text-[color:var(--zui-typography-destructive-fg-dark,oklch(71.2%_0.194_13.428))] border-[color:var(--zui-typography-destructive-border,oklch(81%_0.117_11.638_/_0.4))]",
|
|
14
|
-
info: "text-[color:var(--zui-typography-info-fg,oklch(50%_0.134_242.749))] dark:text-[color:var(--zui-typography-info-fg-dark,oklch(82.8%_0.111_230.318))] border-[color:var(--zui-typography-info-border,oklch(82.8%_0.111_230.318_/_0.4))]",
|
|
13
|
+
"text-[color:var(--zui-typography-destructive-fg,oklch(58.6%_0.253_17.585))] dark:text-[color:var(--zui-typography-destructive-fg-dark,oklch(71.2%_0.194_13.428))] border-[color:var(--zui-typography-destructive-border,oklch(81%_0.117_11.638_/_0.4))] dark:border-[color:var(--zui-typography-destructive-border-dark,oklch(81%_0.117_11.638_/_0.4))]",
|
|
14
|
+
info: "text-[color:var(--zui-typography-info-fg,oklch(50%_0.134_242.749))] dark:text-[color:var(--zui-typography-info-fg-dark,oklch(82.8%_0.111_230.318))] border-[color:var(--zui-typography-info-border,oklch(82.8%_0.111_230.318_/_0.4))] dark:border-[color:var(--zui-typography-info-border-dark,oklch(82.8%_0.111_230.318_/_0.4))]",
|
|
15
15
|
success:
|
|
16
|
-
"text-[color:var(--zui-typography-success-fg,oklch(50.8%_0.118_165.612))] dark:text-[color:var(--zui-typography-success-fg-dark,oklch(84.5%_0.143_164.978))] border-[color:var(--zui-typography-success-border,oklch(84.5%_0.143_164.978_/_0.4))]",
|
|
16
|
+
"text-[color:var(--zui-typography-success-fg,oklch(50.8%_0.118_165.612))] dark:text-[color:var(--zui-typography-success-fg-dark,oklch(84.5%_0.143_164.978))] border-[color:var(--zui-typography-success-border,oklch(84.5%_0.143_164.978_/_0.4))] dark:border-[color:var(--zui-typography-success-border-dark,oklch(84.5%_0.143_164.978_/_0.4))]",
|
|
17
17
|
warning:
|
|
18
|
-
"text-[color:var(--zui-typography-warning-fg,oklch(55.5%_0.163_48.998))] dark:text-[color:var(--zui-typography-warning-fg-dark,oklch(87.9%_0.169_91.605))] border-[color:var(--zui-typography-warning-border,oklch(87.9%_0.169_91.605_/_0.4))]",
|
|
18
|
+
"text-[color:var(--zui-typography-warning-fg,oklch(55.5%_0.163_48.998))] dark:text-[color:var(--zui-typography-warning-fg-dark,oklch(87.9%_0.169_91.605))] border-[color:var(--zui-typography-warning-border,oklch(87.9%_0.169_91.605_/_0.4))] dark:border-[color:var(--zui-typography-warning-border-dark,oklch(87.9%_0.169_91.605_/_0.4))]",
|
|
19
19
|
error:
|
|
20
|
-
"text-[color:var(--zui-typography-error-fg,oklch(50.5%_0.213_27.518))] dark:text-[color:var(--zui-typography-error-fg-dark,oklch(80.8%_0.114_19.571))] border-[color:var(--zui-typography-error-border,oklch(80.8%_0.114_19.571_/_0.4))]",
|
|
20
|
+
"text-[color:var(--zui-typography-error-fg,oklch(50.5%_0.213_27.518))] dark:text-[color:var(--zui-typography-error-fg-dark,oklch(80.8%_0.114_19.571))] border-[color:var(--zui-typography-error-border,oklch(80.8%_0.114_19.571_/_0.4))] dark:border-[color:var(--zui-typography-error-border-dark,oklch(80.8%_0.114_19.571_/_0.4))]",
|
|
21
21
|
"gradient-pink-violet":
|
|
22
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-pink-violet-from,oklch(59.2%_0.249_0.584))] dark:from-[var(--zui-typography-gradient-pink-violet-from-dark,oklch(71.8%_0.202_349.761))] to-[var(--zui-typography-gradient-pink-violet-to,oklch(54.1%_0.281_293.009))] dark:to-[var(--zui-typography-gradient-pink-violet-to-dark,oklch(70.2%_0.183_293.541))] bg-clip-text text-[color:var(--zui-typography-gradient-pink-violet-fg,transparent)] border-[color:var(--zui-typography-gradient-pink-violet-border,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
22
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-pink-violet-from,oklch(59.2%_0.249_0.584))] dark:from-[var(--zui-typography-gradient-pink-violet-from-dark,oklch(71.8%_0.202_349.761))] to-[var(--zui-typography-gradient-pink-violet-to,oklch(54.1%_0.281_293.009))] dark:to-[var(--zui-typography-gradient-pink-violet-to-dark,oklch(70.2%_0.183_293.541))] bg-clip-text text-[color:var(--zui-typography-gradient-pink-violet-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-pink-violet-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-pink-violet-border,oklch(81.1%_0.111_293.571_/_0.4))] dark:border-[color:var(--zui-typography-gradient-pink-violet-border-dark,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
23
23
|
"gradient-cyan-violet":
|
|
24
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-violet-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-violet-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-violet-to,oklch(54.1%_0.281_293.009))] dark:to-[var(--zui-typography-gradient-cyan-violet-to-dark,oklch(70.2%_0.183_293.541))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-violet-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-violet-border,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
24
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-violet-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-violet-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-violet-to,oklch(54.1%_0.281_293.009))] dark:to-[var(--zui-typography-gradient-cyan-violet-to-dark,oklch(70.2%_0.183_293.541))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-violet-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-violet-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-violet-border,oklch(81.1%_0.111_293.571_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-violet-border-dark,oklch(81.1%_0.111_293.571_/_0.4))]",
|
|
25
25
|
"gradient-cyan-blue":
|
|
26
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-blue-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-blue-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-blue-to,oklch(54.6%_0.245_262.881))] dark:to-[var(--zui-typography-gradient-cyan-blue-to-dark,oklch(70.7%_0.165_254.624))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-blue-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-blue-border,oklch(80.9%_0.105_251.813_/_0.4))]",
|
|
26
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-blue-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-blue-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-blue-to,oklch(54.6%_0.245_262.881))] dark:to-[var(--zui-typography-gradient-cyan-blue-to-dark,oklch(70.7%_0.165_254.624))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-blue-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-blue-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-blue-border,oklch(80.9%_0.105_251.813_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-blue-border-dark,oklch(80.9%_0.105_251.813_/_0.4))]",
|
|
27
27
|
"gradient-cyan-green":
|
|
28
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-green-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-green-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-green-to,oklch(62.7%_0.194_149.214))] dark:to-[var(--zui-typography-gradient-cyan-green-to-dark,oklch(79.2%_0.209_151.711))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-green-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-green-border,oklch(87.1%_0.15_154.449_/_0.4))]",
|
|
28
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-green-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-green-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-green-to,oklch(62.7%_0.194_149.214))] dark:to-[var(--zui-typography-gradient-cyan-green-to-dark,oklch(79.2%_0.209_151.711))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-green-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-green-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-green-border,oklch(87.1%_0.15_154.449_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-green-border-dark,oklch(87.1%_0.15_154.449_/_0.4))]",
|
|
29
29
|
"gradient-cyan-orange":
|
|
30
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-orange-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-orange-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-orange-to,oklch(64.6%_0.222_41.116))] dark:to-[var(--zui-typography-gradient-cyan-orange-to-dark,oklch(75%_0.183_55.934))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-orange-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-orange-border,oklch(83.7%_0.128_66.29_/_0.4))]",
|
|
30
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-orange-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-orange-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-orange-to,oklch(64.6%_0.222_41.116))] dark:to-[var(--zui-typography-gradient-cyan-orange-to-dark,oklch(75%_0.183_55.934))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-orange-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-orange-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-orange-border,oklch(83.7%_0.128_66.29_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-orange-border-dark,oklch(83.7%_0.128_66.29_/_0.4))]",
|
|
31
31
|
"gradient-cyan-red":
|
|
32
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-red-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-red-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-red-to,oklch(57.7%_0.245_27.325))] dark:to-[var(--zui-typography-gradient-cyan-red-to-dark,oklch(70.4%_0.191_22.216))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-red-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-red-border,oklch(80.8%_0.114_19.571_/_0.4))]",
|
|
32
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-red-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-red-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-red-to,oklch(57.7%_0.245_27.325))] dark:to-[var(--zui-typography-gradient-cyan-red-to-dark,oklch(70.4%_0.191_22.216))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-red-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-red-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-red-border,oklch(80.8%_0.114_19.571_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-red-border-dark,oklch(80.8%_0.114_19.571_/_0.4))]",
|
|
33
33
|
"gradient-cyan-purple":
|
|
34
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-purple-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-purple-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-purple-to,oklch(55.8%_0.288_302.321))] dark:to-[var(--zui-typography-gradient-cyan-purple-to-dark,oklch(71.4%_0.203_305.504))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-purple-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-purple-border,oklch(82.7%_0.119_306.383_/_0.4))]",
|
|
34
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-purple-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-purple-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-purple-to,oklch(55.8%_0.288_302.321))] dark:to-[var(--zui-typography-gradient-cyan-purple-to-dark,oklch(71.4%_0.203_305.504))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-purple-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-purple-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-purple-border,oklch(82.7%_0.119_306.383_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-purple-border-dark,oklch(82.7%_0.119_306.383_/_0.4))]",
|
|
35
35
|
"gradient-cyan-pink":
|
|
36
|
-
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-pink-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-pink-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-pink-to,oklch(59.2%_0.249_0.584))] dark:to-[var(--zui-typography-gradient-cyan-pink-to-dark,oklch(71.8%_0.202_349.761))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-pink-fg,transparent)] border-[color:var(--zui-typography-gradient-cyan-pink-border,oklch(82.3%_0.12_346.018_/_0.4))]",
|
|
36
|
+
"bg-linear-to-r from-[var(--zui-typography-gradient-cyan-pink-from,oklch(60.9%_0.126_221.723))] dark:from-[var(--zui-typography-gradient-cyan-pink-from-dark,oklch(78.9%_0.154_211.53))] to-[var(--zui-typography-gradient-cyan-pink-to,oklch(59.2%_0.249_0.584))] dark:to-[var(--zui-typography-gradient-cyan-pink-to-dark,oklch(71.8%_0.202_349.761))] bg-clip-text text-[color:var(--zui-typography-gradient-cyan-pink-fg,transparent)] dark:text-[color:var(--zui-typography-gradient-cyan-pink-fg-dark,transparent)] border-[color:var(--zui-typography-gradient-cyan-pink-border,oklch(82.3%_0.12_346.018_/_0.4))] dark:border-[color:var(--zui-typography-gradient-cyan-pink-border-dark,oklch(82.3%_0.12_346.018_/_0.4))]",
|
|
37
37
|
} as const;
|
|
38
38
|
|
|
39
39
|
export const zuiHeadingBase = "scroll-m-20";
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createRef } from "react";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
|
|
6
|
+
import { OTPInput } from "./otp-input";
|
|
7
|
+
|
|
8
|
+
describe("OTPInput", () => {
|
|
9
|
+
it("should expose displayName", () => {
|
|
10
|
+
expect(OTPInput.displayName).toBe("OTPInput");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("should stamp data-slot", () => {
|
|
14
|
+
render(<OTPInput label="Verification code" />);
|
|
15
|
+
expect(document.querySelector('[data-slot="otp-input"]')).toBeTruthy();
|
|
16
|
+
expect(
|
|
17
|
+
document.querySelectorAll('[data-slot="otp-input-cell"]'),
|
|
18
|
+
).toHaveLength(6);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("should type numeric values across cells", async () => {
|
|
22
|
+
const user = userEvent.setup();
|
|
23
|
+
const onValueChange = vi.fn();
|
|
24
|
+
render(<OTPInput label="Code" onValueChange={onValueChange} />);
|
|
25
|
+
|
|
26
|
+
await user.type(screen.getByLabelText("Digit 1 of 6"), "123");
|
|
27
|
+
|
|
28
|
+
expect(screen.getByLabelText("Digit 1 of 6")).toHaveValue("1");
|
|
29
|
+
expect(screen.getByLabelText("Digit 2 of 6")).toHaveValue("2");
|
|
30
|
+
expect(screen.getByLabelText("Digit 3 of 6")).toHaveValue("3");
|
|
31
|
+
expect(onValueChange).toHaveBeenLastCalledWith("123");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should ignore non-numeric characters by default", async () => {
|
|
35
|
+
const user = userEvent.setup();
|
|
36
|
+
render(<OTPInput label="Code" />);
|
|
37
|
+
|
|
38
|
+
await user.type(screen.getByLabelText("Digit 1 of 6"), "a1b2");
|
|
39
|
+
|
|
40
|
+
expect(screen.getByLabelText("Digit 1 of 6")).toHaveValue("1");
|
|
41
|
+
expect(screen.getByLabelText("Digit 2 of 6")).toHaveValue("2");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should support alphanumeric values", async () => {
|
|
45
|
+
const user = userEvent.setup();
|
|
46
|
+
render(<OTPInput allowedCharacters="alphanumeric" label="Invite code" />);
|
|
47
|
+
|
|
48
|
+
await user.type(screen.getByLabelText("Digit 1 of 6"), "A7Z");
|
|
49
|
+
|
|
50
|
+
expect(screen.getByLabelText("Digit 1 of 6")).toHaveValue("A");
|
|
51
|
+
expect(screen.getByLabelText("Digit 2 of 6")).toHaveValue("7");
|
|
52
|
+
expect(screen.getByLabelText("Digit 3 of 6")).toHaveValue("Z");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should fill cells from paste and call onComplete", async () => {
|
|
56
|
+
const user = userEvent.setup();
|
|
57
|
+
const onComplete = vi.fn();
|
|
58
|
+
render(<OTPInput label="Code" onComplete={onComplete} />);
|
|
59
|
+
|
|
60
|
+
await user.click(screen.getByLabelText("Digit 1 of 6"));
|
|
61
|
+
await user.paste("12-34 56");
|
|
62
|
+
|
|
63
|
+
expect(screen.getByLabelText("Digit 6 of 6")).toHaveValue("6");
|
|
64
|
+
expect(onComplete).toHaveBeenLastCalledWith("123456");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should clear the previous cell when backspacing from an empty cell", async () => {
|
|
68
|
+
const user = userEvent.setup();
|
|
69
|
+
render(<OTPInput defaultValue="12" label="Code" />);
|
|
70
|
+
|
|
71
|
+
await user.click(screen.getByLabelText("Digit 3 of 6"));
|
|
72
|
+
await user.keyboard("{Backspace}");
|
|
73
|
+
|
|
74
|
+
expect(screen.getByLabelText("Digit 2 of 6")).toHaveValue("");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should support controlled state", async () => {
|
|
78
|
+
const user = userEvent.setup();
|
|
79
|
+
const onValueChange = vi.fn();
|
|
80
|
+
render(<OTPInput label="Code" value="98" onValueChange={onValueChange} />);
|
|
81
|
+
|
|
82
|
+
await user.type(screen.getByLabelText("Digit 3 of 6"), "7");
|
|
83
|
+
|
|
84
|
+
expect(screen.getByLabelText("Digit 1 of 6")).toHaveValue("9");
|
|
85
|
+
expect(screen.getByLabelText("Digit 2 of 6")).toHaveValue("8");
|
|
86
|
+
expect(onValueChange).toHaveBeenLastCalledWith("987");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should forward ref to the root", () => {
|
|
90
|
+
const ref = createRef<HTMLDivElement>();
|
|
91
|
+
render(<OTPInput ref={ref} label="Code" />);
|
|
92
|
+
expect(ref.current?.getAttribute("data-slot")).toBe("otp-input");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("should render a hidden input when name is provided", () => {
|
|
96
|
+
render(<OTPInput defaultValue="123456" label="Code" name="otp" />);
|
|
97
|
+
expect(document.querySelector('input[name="otp"]')).toHaveValue("123456");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
type ClipboardEvent,
|
|
5
|
+
type KeyboardEvent,
|
|
6
|
+
useCallback,
|
|
7
|
+
useId,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState,
|
|
11
|
+
} from "react";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
zuiOtpCellsBase,
|
|
15
|
+
zuiOtpErrorBase,
|
|
16
|
+
zuiOtpHintBase,
|
|
17
|
+
zuiOtpLabelBase,
|
|
18
|
+
zuiOtpRootBase,
|
|
19
|
+
zuiOtpSeparatorBase,
|
|
20
|
+
} from "../../design-system/otp-input";
|
|
21
|
+
import { cn } from "../../lib/utils";
|
|
22
|
+
|
|
23
|
+
import type { OTPInputAllowedCharacters, OTPInputProps } from "./types";
|
|
24
|
+
import { otpInputCellVariants } from "./variants";
|
|
25
|
+
|
|
26
|
+
function clampLength(length: number): number {
|
|
27
|
+
return Number.isFinite(length) ? Math.max(1, Math.min(12, length)) : 6;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function sanitizeValue(
|
|
31
|
+
value: string,
|
|
32
|
+
allowedCharacters: OTPInputAllowedCharacters,
|
|
33
|
+
maxLength: number,
|
|
34
|
+
): string {
|
|
35
|
+
const pattern = allowedCharacters === "numeric" ? /[0-9]/g : /[a-zA-Z0-9]/g;
|
|
36
|
+
return (value.match(pattern) ?? []).join("").slice(0, maxLength);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function valueToCells(value: string, length: number): string[] {
|
|
40
|
+
return Array.from({ length }, (_, index) => {
|
|
41
|
+
const c = value[index] ?? "\x00";
|
|
42
|
+
return c === "\x00" ? "" : c;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function cellsToInternal(cells: string[], length: number): string {
|
|
47
|
+
return Array.from({ length }, (_, i) => cells[i] || "\x00").join("");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function OTPInput(props: OTPInputProps) {
|
|
51
|
+
const {
|
|
52
|
+
allowedCharacters = "numeric",
|
|
53
|
+
appearance,
|
|
54
|
+
autoFocus,
|
|
55
|
+
cellClassName,
|
|
56
|
+
className,
|
|
57
|
+
defaultValue = "",
|
|
58
|
+
disabled,
|
|
59
|
+
errorMessage,
|
|
60
|
+
hint,
|
|
61
|
+
id,
|
|
62
|
+
label,
|
|
63
|
+
length = 6,
|
|
64
|
+
mask,
|
|
65
|
+
name,
|
|
66
|
+
onComplete,
|
|
67
|
+
onValueChange,
|
|
68
|
+
ref,
|
|
69
|
+
separatorEvery,
|
|
70
|
+
size,
|
|
71
|
+
value,
|
|
72
|
+
...rest
|
|
73
|
+
} = props;
|
|
74
|
+
const generatedId = useId();
|
|
75
|
+
const rootId = id ?? generatedId;
|
|
76
|
+
const resolvedLength = clampLength(length);
|
|
77
|
+
const isControlled = value !== undefined;
|
|
78
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(() => {
|
|
79
|
+
const clean = sanitizeValue(
|
|
80
|
+
defaultValue,
|
|
81
|
+
allowedCharacters,
|
|
82
|
+
resolvedLength,
|
|
83
|
+
);
|
|
84
|
+
return clean.padEnd(resolvedLength, "\x00");
|
|
85
|
+
});
|
|
86
|
+
const inputRefs = useRef<Array<HTMLInputElement | null>>([]);
|
|
87
|
+
const cells = useMemo(
|
|
88
|
+
() =>
|
|
89
|
+
isControlled
|
|
90
|
+
? valueToCells(
|
|
91
|
+
sanitizeValue(
|
|
92
|
+
value ?? "",
|
|
93
|
+
allowedCharacters,
|
|
94
|
+
resolvedLength,
|
|
95
|
+
).padEnd(resolvedLength, "\x00"),
|
|
96
|
+
resolvedLength,
|
|
97
|
+
)
|
|
98
|
+
: Array.from({ length: resolvedLength }, (_, index) => {
|
|
99
|
+
const c = uncontrolledValue[index] ?? "\x00";
|
|
100
|
+
return c === "\x00" ? "" : sanitizeValue(c, allowedCharacters, 1);
|
|
101
|
+
}),
|
|
102
|
+
[allowedCharacters, isControlled, resolvedLength, uncontrolledValue, value],
|
|
103
|
+
);
|
|
104
|
+
const sanitizedValue = cells.filter(Boolean).join("");
|
|
105
|
+
const labelId = `${rootId}-label`;
|
|
106
|
+
const hintId = `${rootId}-hint`;
|
|
107
|
+
const errorId = `${rootId}-error`;
|
|
108
|
+
const describedBy = [
|
|
109
|
+
hint !== undefined ? hintId : undefined,
|
|
110
|
+
errorMessage !== undefined ? errorId : undefined,
|
|
111
|
+
]
|
|
112
|
+
.filter(Boolean)
|
|
113
|
+
.join(" ");
|
|
114
|
+
|
|
115
|
+
const commitValue = useCallback(
|
|
116
|
+
(nextCells: string[]) => {
|
|
117
|
+
if (!isControlled) {
|
|
118
|
+
setUncontrolledValue(cellsToInternal(nextCells, resolvedLength));
|
|
119
|
+
}
|
|
120
|
+
const next = nextCells.filter(Boolean).join("").slice(0, resolvedLength);
|
|
121
|
+
onValueChange?.(next);
|
|
122
|
+
if (next.length === resolvedLength) {
|
|
123
|
+
onComplete?.(next);
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
[isControlled, onComplete, onValueChange, resolvedLength],
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const focusCell = useCallback(
|
|
130
|
+
(index: number) => {
|
|
131
|
+
const target =
|
|
132
|
+
inputRefs.current[Math.max(0, Math.min(index, resolvedLength - 1))];
|
|
133
|
+
target?.focus();
|
|
134
|
+
target?.select();
|
|
135
|
+
},
|
|
136
|
+
[resolvedLength],
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const updateAtIndex = useCallback(
|
|
140
|
+
(index: number, nextChars: string, isPaste = false) => {
|
|
141
|
+
let chars: string | undefined = sanitizeValue(
|
|
142
|
+
nextChars,
|
|
143
|
+
allowedCharacters,
|
|
144
|
+
resolvedLength,
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// Detect single-char overwrite: browser gives "existingChar + typedChar"
|
|
148
|
+
if (
|
|
149
|
+
!isPaste &&
|
|
150
|
+
chars &&
|
|
151
|
+
chars.length === 2 &&
|
|
152
|
+
chars[0] === (cells[index] ?? "")
|
|
153
|
+
) {
|
|
154
|
+
chars = chars[1];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (!chars?.length || (!isPaste && chars === cells[index])) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const nextCells = [...cells];
|
|
162
|
+
|
|
163
|
+
chars.split("").forEach((char, offset) => {
|
|
164
|
+
const targetIndex = index + offset;
|
|
165
|
+
if (targetIndex < resolvedLength) {
|
|
166
|
+
nextCells[targetIndex] = char;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
commitValue(nextCells);
|
|
171
|
+
focusCell(
|
|
172
|
+
Math.min(index + Math.max(chars.length, 1), resolvedLength - 1),
|
|
173
|
+
);
|
|
174
|
+
},
|
|
175
|
+
[allowedCharacters, cells, commitValue, focusCell, resolvedLength],
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
const clearAtIndex = useCallback(
|
|
179
|
+
(index: number) => {
|
|
180
|
+
const nextCells = [...cells];
|
|
181
|
+
nextCells[index] = "";
|
|
182
|
+
commitValue(nextCells);
|
|
183
|
+
},
|
|
184
|
+
[cells, commitValue],
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const handlePaste = useCallback(
|
|
188
|
+
(event: ClipboardEvent<HTMLInputElement>, index: number) => {
|
|
189
|
+
event.preventDefault();
|
|
190
|
+
updateAtIndex(index, event.clipboardData.getData("text"), true);
|
|
191
|
+
},
|
|
192
|
+
[updateAtIndex],
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
const handleKeyDown = useCallback(
|
|
196
|
+
(event: KeyboardEvent<HTMLInputElement>, index: number) => {
|
|
197
|
+
if (event.key === "Backspace") {
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
if (cells[index]) {
|
|
200
|
+
clearAtIndex(index);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
clearAtIndex(Math.max(index - 1, 0));
|
|
204
|
+
focusCell(index - 1);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (event.key === "Delete") {
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
clearAtIndex(index);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (event.key === "ArrowLeft") {
|
|
215
|
+
event.preventDefault();
|
|
216
|
+
focusCell(index - 1);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (event.key === "ArrowRight") {
|
|
221
|
+
event.preventDefault();
|
|
222
|
+
focusCell(index + 1);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (event.key === "Home") {
|
|
227
|
+
event.preventDefault();
|
|
228
|
+
focusCell(0);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (event.key === "End") {
|
|
233
|
+
event.preventDefault();
|
|
234
|
+
focusCell(resolvedLength - 1);
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
[cells, clearAtIndex, focusCell, resolvedLength],
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
return (
|
|
241
|
+
<div
|
|
242
|
+
ref={ref}
|
|
243
|
+
id={rootId}
|
|
244
|
+
role="group"
|
|
245
|
+
aria-labelledby={label !== undefined ? labelId : undefined}
|
|
246
|
+
aria-describedby={describedBy || undefined}
|
|
247
|
+
aria-invalid={errorMessage !== undefined ? true : undefined}
|
|
248
|
+
className={cn(zuiOtpRootBase, className)}
|
|
249
|
+
data-disabled={disabled ? "true" : undefined}
|
|
250
|
+
data-slot="otp-input"
|
|
251
|
+
{...rest}
|
|
252
|
+
>
|
|
253
|
+
{label !== undefined && (
|
|
254
|
+
<p id={labelId} className={zuiOtpLabelBase}>
|
|
255
|
+
{label}
|
|
256
|
+
</p>
|
|
257
|
+
)}
|
|
258
|
+
{hint !== undefined && (
|
|
259
|
+
<p id={hintId} className={zuiOtpHintBase}>
|
|
260
|
+
{hint}
|
|
261
|
+
</p>
|
|
262
|
+
)}
|
|
263
|
+
<div className={zuiOtpCellsBase} data-slot="otp-input-cells">
|
|
264
|
+
{cells.map((char, index) => (
|
|
265
|
+
<span
|
|
266
|
+
key={`${rootId}-${index}`}
|
|
267
|
+
className="contents"
|
|
268
|
+
data-slot="otp-input-cell-wrapper"
|
|
269
|
+
>
|
|
270
|
+
<input
|
|
271
|
+
ref={(node) => {
|
|
272
|
+
inputRefs.current[index] = node;
|
|
273
|
+
}}
|
|
274
|
+
aria-label={`Digit ${index + 1} of ${resolvedLength}`}
|
|
275
|
+
autoComplete={index === 0 ? "one-time-code" : "off"}
|
|
276
|
+
autoFocus={autoFocus && index === 0}
|
|
277
|
+
className={cn(
|
|
278
|
+
otpInputCellVariants({ appearance, size }),
|
|
279
|
+
cellClassName,
|
|
280
|
+
)}
|
|
281
|
+
data-slot="otp-input-cell"
|
|
282
|
+
disabled={disabled}
|
|
283
|
+
inputMode={allowedCharacters === "numeric" ? "numeric" : "text"}
|
|
284
|
+
maxLength={resolvedLength}
|
|
285
|
+
onChange={(event) =>
|
|
286
|
+
updateAtIndex(index, event.currentTarget.value, false)
|
|
287
|
+
}
|
|
288
|
+
onFocus={(event) => event.currentTarget.select()}
|
|
289
|
+
onKeyDown={(event) => handleKeyDown(event, index)}
|
|
290
|
+
onPaste={(event) => handlePaste(event, index)}
|
|
291
|
+
pattern={
|
|
292
|
+
allowedCharacters === "numeric" ? "[0-9]*" : "[A-Za-z0-9]*"
|
|
293
|
+
}
|
|
294
|
+
type={mask ? "password" : "text"}
|
|
295
|
+
value={char}
|
|
296
|
+
/>
|
|
297
|
+
{separatorEvery &&
|
|
298
|
+
separatorEvery > 0 &&
|
|
299
|
+
index < resolvedLength - 1 &&
|
|
300
|
+
(index + 1) % separatorEvery === 0 && (
|
|
301
|
+
<span
|
|
302
|
+
aria-hidden="true"
|
|
303
|
+
className={zuiOtpSeparatorBase}
|
|
304
|
+
data-slot="otp-input-separator"
|
|
305
|
+
/>
|
|
306
|
+
)}
|
|
307
|
+
</span>
|
|
308
|
+
))}
|
|
309
|
+
</div>
|
|
310
|
+
{name !== undefined && (
|
|
311
|
+
<input
|
|
312
|
+
type="hidden"
|
|
313
|
+
name={name}
|
|
314
|
+
value={sanitizedValue}
|
|
315
|
+
disabled={disabled}
|
|
316
|
+
/>
|
|
317
|
+
)}
|
|
318
|
+
{errorMessage !== undefined && (
|
|
319
|
+
<p id={errorId} className={zuiOtpErrorBase}>
|
|
320
|
+
{errorMessage}
|
|
321
|
+
</p>
|
|
322
|
+
)}
|
|
323
|
+
</div>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
OTPInput.displayName = "OTPInput";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
import type { otpInputCellVariants } from "./variants";
|
|
5
|
+
|
|
6
|
+
export type OTPInputAllowedCharacters = "numeric" | "alphanumeric";
|
|
7
|
+
|
|
8
|
+
export type OTPInputCellVariantProps = VariantProps<
|
|
9
|
+
typeof otpInputCellVariants
|
|
10
|
+
>;
|
|
11
|
+
|
|
12
|
+
export type OTPInputProps = OTPInputCellVariantProps &
|
|
13
|
+
Omit<
|
|
14
|
+
ComponentPropsWithRef<"div">,
|
|
15
|
+
"defaultValue" | "dir" | "onChange" | "children"
|
|
16
|
+
> & {
|
|
17
|
+
allowedCharacters?: OTPInputAllowedCharacters;
|
|
18
|
+
autoFocus?: boolean;
|
|
19
|
+
cellClassName?: string;
|
|
20
|
+
defaultValue?: string;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
errorMessage?: ReactNode;
|
|
23
|
+
hint?: ReactNode;
|
|
24
|
+
label?: ReactNode;
|
|
25
|
+
length?: number;
|
|
26
|
+
mask?: boolean;
|
|
27
|
+
name?: string;
|
|
28
|
+
onComplete?: (value: string) => void;
|
|
29
|
+
onValueChange?: (value: string) => void;
|
|
30
|
+
separatorEvery?: number;
|
|
31
|
+
value?: string;
|
|
32
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
zuiOtpAppearances,
|
|
5
|
+
zuiOtpCellBase,
|
|
6
|
+
zuiOtpSizes,
|
|
7
|
+
} from "../../design-system/otp-input";
|
|
8
|
+
|
|
9
|
+
export const otpInputCellVariants = cva(zuiOtpCellBase, {
|
|
10
|
+
variants: {
|
|
11
|
+
appearance: zuiOtpAppearances,
|
|
12
|
+
size: zuiOtpSizes,
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
appearance: "default",
|
|
16
|
+
size: "md",
|
|
17
|
+
},
|
|
18
|
+
});
|