@zentauri-ui/zentauri-components 1.4.61 → 1.4.62
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/dist/{chunk-UXGHUBNJ.mjs → chunk-2PJF7DLJ.mjs} +3 -3
- package/dist/{chunk-UXGHUBNJ.mjs.map → chunk-2PJF7DLJ.mjs.map} +1 -1
- package/dist/{chunk-WDCIZHXY.mjs → chunk-45FCOQ63.mjs} +5 -3
- package/dist/chunk-45FCOQ63.mjs.map +1 -0
- package/dist/{chunk-RDSPHBHK.mjs → chunk-4ANBTJ5G.mjs} +49 -6
- package/dist/chunk-4ANBTJ5G.mjs.map +1 -0
- package/dist/chunk-4E66ICIR.mjs +158 -0
- package/dist/chunk-4E66ICIR.mjs.map +1 -0
- package/dist/{chunk-XLAFQ24R.js → chunk-4U6FOCFK.js} +22 -14
- package/dist/chunk-4U6FOCFK.js.map +1 -0
- package/dist/{chunk-XWM2S6VV.mjs → chunk-EQSSYK27.mjs} +12 -10
- package/dist/chunk-EQSSYK27.mjs.map +1 -0
- package/dist/{chunk-5QB2KNZQ.js → chunk-FGGYDAX3.js} +5 -3
- package/dist/chunk-FGGYDAX3.js.map +1 -0
- package/dist/{chunk-7HL3A4YF.mjs → chunk-IK75NHRX.mjs} +63 -14
- package/dist/chunk-IK75NHRX.mjs.map +1 -0
- package/dist/{chunk-BORK3BJO.mjs → chunk-J56L4ZQ3.mjs} +10 -10
- package/dist/{chunk-BORK3BJO.mjs.map → chunk-J56L4ZQ3.mjs.map} +1 -1
- package/dist/{chunk-PGH27VTL.mjs → chunk-JF3FKUUP.mjs} +21 -13
- package/dist/chunk-JF3FKUUP.mjs.map +1 -0
- package/dist/{chunk-WZKGRU3U.js → chunk-MQZB5EPD.js} +92 -27
- package/dist/chunk-MQZB5EPD.js.map +1 -0
- package/dist/{chunk-N4NO3SYL.js → chunk-NX3IHMT7.js} +22 -14
- package/dist/chunk-NX3IHMT7.js.map +1 -0
- package/dist/{chunk-BVXTOEBI.mjs → chunk-OG2WM5YK.mjs} +45 -17
- package/dist/chunk-OG2WM5YK.mjs.map +1 -0
- package/dist/{chunk-IXDJ3IPG.mjs → chunk-OXS6UJUG.mjs} +21 -13
- package/dist/chunk-OXS6UJUG.mjs.map +1 -0
- package/dist/{chunk-PCK6LX3K.js → chunk-PFOV3U7W.js} +3 -3
- package/dist/{chunk-PCK6LX3K.js.map → chunk-PFOV3U7W.js.map} +1 -1
- package/dist/{chunk-2PQEXQVR.js → chunk-THCNTPPL.js} +62 -13
- package/dist/chunk-THCNTPPL.js.map +1 -0
- package/dist/chunk-UP6S75V5.js +160 -0
- package/dist/chunk-UP6S75V5.js.map +1 -0
- package/dist/{chunk-P5HUBXUX.js → chunk-V2IWLR4O.js} +48 -5
- package/dist/chunk-V2IWLR4O.js.map +1 -0
- package/dist/{chunk-3OR47XMY.js → chunk-VSKL5LOB.js} +45 -17
- package/dist/chunk-VSKL5LOB.js.map +1 -0
- package/dist/{chunk-E3DZNJAD.js → chunk-Y4EDWZKH.js} +12 -10
- package/dist/chunk-Y4EDWZKH.js.map +1 -0
- package/dist/{chunk-YNCD6TKE.mjs → chunk-Y4IFVO46.mjs} +93 -28
- package/dist/chunk-Y4IFVO46.mjs.map +1 -0
- package/dist/{chunk-BITDSQMR.js → chunk-ZNDHS5OK.js} +10 -10
- package/dist/{chunk-BITDSQMR.js.map → chunk-ZNDHS5OK.js.map} +1 -1
- package/dist/hooks/useFocusManagement/useFocusManagement.d.ts +5 -14
- package/dist/hooks/useFocusManagement/useFocusManagement.d.ts.map +1 -1
- package/dist/hooks/useFocusManagement.js +2 -2
- package/dist/hooks/useFocusManagement.mjs +1 -1
- package/dist/ui/badge/animated.js +2 -2
- package/dist/ui/badge/animated.mjs +1 -1
- package/dist/ui/badge/badge-base.d.ts +1 -1
- package/dist/ui/badge/badge-base.d.ts.map +1 -1
- package/dist/ui/badge/types.d.ts +1 -0
- package/dist/ui/badge/types.d.ts.map +1 -1
- package/dist/ui/badge/variants.d.ts +7 -7
- package/dist/ui/badge.js +4 -4
- package/dist/ui/badge.mjs +2 -2
- package/dist/ui/buttons/animated.js +3 -3
- package/dist/ui/buttons/animated.mjs +1 -1
- package/dist/ui/buttons.js +4 -4
- package/dist/ui/buttons.mjs +2 -2
- package/dist/ui/drawer/animated/drawer-content-animated.d.ts.map +1 -1
- package/dist/ui/drawer/animated.js +17 -18
- package/dist/ui/drawer/animated.js.map +1 -1
- package/dist/ui/drawer/animated.mjs +8 -9
- package/dist/ui/drawer/animated.mjs.map +1 -1
- package/dist/ui/drawer/drawer-base.d.ts +1 -1
- package/dist/ui/drawer/drawer-base.d.ts.map +1 -1
- package/dist/ui/drawer/types.d.ts +1 -0
- package/dist/ui/drawer/types.d.ts.map +1 -1
- package/dist/ui/drawer.js +12 -12
- package/dist/ui/drawer.mjs +2 -2
- package/dist/ui/dropdown/dropdown.d.ts +1 -1
- package/dist/ui/dropdown/dropdown.d.ts.map +1 -1
- package/dist/ui/dropdown/types.d.ts +1 -0
- package/dist/ui/dropdown/types.d.ts.map +1 -1
- package/dist/ui/dropdown/variants.d.ts +1 -1
- package/dist/ui/dropdown.js +25 -7
- package/dist/ui/dropdown.js.map +1 -1
- package/dist/ui/dropdown.mjs +26 -8
- package/dist/ui/dropdown.mjs.map +1 -1
- package/dist/ui/empty-state/animated.js +2 -2
- package/dist/ui/empty-state/animated.mjs +1 -1
- package/dist/ui/empty-state/empty-state-base.d.ts.map +1 -1
- package/dist/ui/empty-state/types.d.ts +1 -0
- package/dist/ui/empty-state/types.d.ts.map +1 -1
- package/dist/ui/empty-state.js +10 -10
- package/dist/ui/empty-state.mjs +2 -2
- package/dist/ui/file-upload/file-upload.d.ts.map +1 -1
- package/dist/ui/file-upload.js +1 -3
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/file-upload.mjs +1 -3
- package/dist/ui/file-upload.mjs.map +1 -1
- package/dist/ui/inputs/input-base.d.ts.map +1 -1
- package/dist/ui/inputs/types.d.ts +3 -1
- package/dist/ui/inputs/types.d.ts.map +1 -1
- package/dist/ui/inputs.js +46 -2
- package/dist/ui/inputs.js.map +1 -1
- package/dist/ui/inputs.mjs +46 -2
- package/dist/ui/inputs.mjs.map +1 -1
- package/dist/ui/modal/animated/modal-content-animated.d.ts.map +1 -1
- package/dist/ui/modal/animated.js +10 -11
- package/dist/ui/modal/animated.js.map +1 -1
- package/dist/ui/modal/animated.mjs +7 -8
- package/dist/ui/modal/animated.mjs.map +1 -1
- package/dist/ui/modal/modal-base.d.ts +4 -2
- package/dist/ui/modal/modal-base.d.ts.map +1 -1
- package/dist/ui/modal.js +13 -13
- package/dist/ui/modal.mjs +3 -3
- package/dist/ui/pagination.js +6 -6
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +3 -3
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/progress/animated/progress-animated.d.ts.map +1 -1
- package/dist/ui/progress/animated.js +49 -11
- package/dist/ui/progress/animated.js.map +1 -1
- package/dist/ui/progress/animated.mjs +44 -6
- package/dist/ui/progress/animated.mjs.map +1 -1
- package/dist/ui/progress/progress-base.d.ts.map +1 -1
- package/dist/ui/progress/types.d.ts +3 -0
- package/dist/ui/progress/types.d.ts.map +1 -1
- package/dist/ui/progress.js +9 -9
- package/dist/ui/progress.mjs +2 -2
- package/dist/ui/search/search-bar.d.ts +1 -1
- package/dist/ui/search/search-bar.d.ts.map +1 -1
- package/dist/ui/search.js +2 -0
- package/dist/ui/search.js.map +1 -1
- package/dist/ui/search.mjs +2 -0
- package/dist/ui/search.mjs.map +1 -1
- package/dist/ui/select/select.d.ts +1 -1
- package/dist/ui/select/select.d.ts.map +1 -1
- package/dist/ui/select/types.d.ts +1 -0
- package/dist/ui/select/types.d.ts.map +1 -1
- package/dist/ui/select/variants.d.ts +1 -1
- package/dist/ui/select/variants.d.ts.map +1 -1
- package/dist/ui/select.js +121 -39
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/select.mjs +122 -40
- package/dist/ui/select.mjs.map +1 -1
- package/dist/ui/skeleton/variants.d.ts +1 -1
- package/dist/ui/slider/slider.d.ts.map +1 -1
- package/dist/ui/slider/types.d.ts +8 -2
- package/dist/ui/slider/types.d.ts.map +1 -1
- package/dist/ui/slider.js +43 -7
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/slider.mjs +43 -7
- package/dist/ui/slider.mjs.map +1 -1
- package/dist/ui/spinner/animated/spinner.d.ts.map +1 -1
- package/dist/ui/spinner/animated.js +62 -50
- package/dist/ui/spinner/animated.js.map +1 -1
- package/dist/ui/spinner/animated.mjs +63 -51
- package/dist/ui/spinner/animated.mjs.map +1 -1
- package/dist/ui/stepper/stepper.d.ts +2 -7
- package/dist/ui/stepper/stepper.d.ts.map +1 -1
- package/dist/ui/stepper/types.d.ts +3 -3
- package/dist/ui/stepper/types.d.ts.map +1 -1
- package/dist/ui/stepper/variants.d.ts +1 -1
- package/dist/ui/stepper.js +7 -5
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/stepper.mjs +7 -5
- 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/table-base.d.ts +1 -1
- package/dist/ui/table/table-base.d.ts.map +1 -1
- package/dist/ui/table/types.d.ts +5 -1
- package/dist/ui/table/types.d.ts.map +1 -1
- 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/tabs-base.d.ts.map +1 -1
- package/dist/ui/tabs/types.d.ts +2 -1
- package/dist/ui/tabs/types.d.ts.map +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/toggle-base.d.ts.map +1 -1
- package/dist/ui/toggle.js +28 -3
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/toggle.mjs +29 -4
- package/dist/ui/toggle.mjs.map +1 -1
- package/dist/ui/tooltip/animated.js +3 -3
- package/dist/ui/tooltip/animated.mjs +1 -1
- package/dist/ui/tooltip/tooltip-base.d.ts.map +1 -1
- package/dist/ui/tooltip/types.d.ts +1 -0
- package/dist/ui/tooltip/types.d.ts.map +1 -1
- package/dist/ui/tooltip.js +7 -7
- package/dist/ui/tooltip.mjs +1 -1
- package/package.json +1 -1
- package/src/hooks/useFocusManagement/useFocusManagement.test.tsx +8 -0
- package/src/hooks/useFocusManagement/useFocusManagement.ts +162 -33
- package/src/ui/badge/badge-base.tsx +4 -1
- package/src/ui/badge/types.ts +1 -0
- package/src/ui/badge/variants.ts +7 -7
- package/src/ui/buttons/button.test.tsx +1 -1
- package/src/ui/buttons/variants.ts +8 -8
- package/src/ui/drawer/animated/drawer-content-animated.tsx +4 -5
- package/src/ui/drawer/drawer-base.tsx +16 -8
- package/src/ui/drawer/types.ts +1 -0
- package/src/ui/dropdown/dropdown.test.tsx +1 -3
- package/src/ui/dropdown/dropdown.tsx +23 -5
- package/src/ui/dropdown/types.ts +1 -0
- package/src/ui/dropdown/variants.ts +2 -2
- package/src/ui/empty-state/empty-state-base.tsx +9 -1
- package/src/ui/empty-state/types.ts +1 -0
- package/src/ui/file-upload/file-upload.tsx +0 -2
- package/src/ui/inputs/input-base.tsx +60 -6
- package/src/ui/inputs/types.ts +3 -1
- package/src/ui/modal/animated/modal-content-animated.tsx +4 -5
- package/src/ui/modal/modal-base.tsx +19 -9
- package/src/ui/modal/modal.test.tsx +38 -0
- package/src/ui/pagination/pagination.tsx +2 -2
- package/src/ui/progress/animated/progress-animated.tsx +42 -3
- package/src/ui/progress/progress-base.tsx +59 -3
- package/src/ui/progress/types.ts +3 -0
- package/src/ui/search/search-bar.tsx +5 -0
- package/src/ui/select/select.tsx +97 -6
- package/src/ui/select/types.ts +1 -0
- package/src/ui/select/variants.ts +5 -3
- package/src/ui/slider/slider.test.tsx +25 -1
- package/src/ui/slider/slider.tsx +45 -4
- package/src/ui/slider/types.ts +8 -2
- package/src/ui/spinner/animated/spinner.tsx +4 -0
- package/src/ui/stepper/stepper.test.tsx +6 -7
- package/src/ui/stepper/stepper.tsx +11 -10
- package/src/ui/stepper/types.ts +7 -3
- package/src/ui/table/table-base.tsx +32 -6
- package/src/ui/table/types.ts +8 -1
- package/src/ui/tabs/tabs-base.tsx +71 -10
- package/src/ui/tabs/types.ts +2 -1
- package/src/ui/tabs/variants.ts +1 -1
- package/src/ui/toast/toast-base.tsx +1 -1
- package/src/ui/toggle/toggle-base.tsx +37 -4
- package/src/ui/tooltip/tooltip-base.tsx +119 -22
- package/src/ui/tooltip/types.ts +1 -0
- package/src/ui/tooltip/variants.ts +2 -2
- package/dist/chunk-2PQEXQVR.js.map +0 -1
- package/dist/chunk-3OR47XMY.js.map +0 -1
- package/dist/chunk-5QB2KNZQ.js.map +0 -1
- package/dist/chunk-7HL3A4YF.mjs.map +0 -1
- package/dist/chunk-BVXTOEBI.mjs.map +0 -1
- package/dist/chunk-E3DZNJAD.js.map +0 -1
- package/dist/chunk-IXDJ3IPG.mjs.map +0 -1
- package/dist/chunk-N4NO3SYL.js.map +0 -1
- package/dist/chunk-P5HUBXUX.js.map +0 -1
- package/dist/chunk-PGH27VTL.mjs.map +0 -1
- package/dist/chunk-RDSPHBHK.mjs.map +0 -1
- package/dist/chunk-WDCIZHXY.mjs.map +0 -1
- package/dist/chunk-WL5I7RVS.mjs +0 -54
- package/dist/chunk-WL5I7RVS.mjs.map +0 -1
- package/dist/chunk-WZKGRU3U.js.map +0 -1
- package/dist/chunk-XLAFQ24R.js.map +0 -1
- package/dist/chunk-XWM2S6VV.mjs.map +0 -1
- package/dist/chunk-YNCD6TKE.mjs.map +0 -1
- package/dist/chunk-YPLVTUYL.js +0 -56
- package/dist/chunk-YPLVTUYL.js.map +0 -1
|
@@ -30,6 +30,7 @@ export function TableBase(props: TableProps) {
|
|
|
30
30
|
size = "md",
|
|
31
31
|
textAlign = "left",
|
|
32
32
|
stickyHeader = false,
|
|
33
|
+
scrollAreaAriaLabel,
|
|
33
34
|
children,
|
|
34
35
|
ref,
|
|
35
36
|
...rest
|
|
@@ -47,11 +48,19 @@ export function TableBase(props: TableProps) {
|
|
|
47
48
|
|
|
48
49
|
return (
|
|
49
50
|
<TableContext.Provider value={ctx}>
|
|
50
|
-
<div
|
|
51
|
+
<div
|
|
52
|
+
data-slot="table-scroll"
|
|
53
|
+
tabIndex={0}
|
|
54
|
+
role="region"
|
|
55
|
+
aria-label={scrollAreaAriaLabel ?? "Scrollable table"}
|
|
56
|
+
className={cn(
|
|
57
|
+
"relative w-full overflow-auto",
|
|
58
|
+
"outline-none focus-visible:ring-2 focus-visible:ring-slate-300 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950",
|
|
59
|
+
)}
|
|
60
|
+
>
|
|
51
61
|
<table
|
|
52
62
|
ref={ref}
|
|
53
63
|
data-slot="table"
|
|
54
|
-
role="table"
|
|
55
64
|
className={cn(
|
|
56
65
|
tableVariants({ appearance, size, stickyHeader }),
|
|
57
66
|
"w-full min-w-0 table",
|
|
@@ -163,17 +172,34 @@ export function TableCell({
|
|
|
163
172
|
className,
|
|
164
173
|
children,
|
|
165
174
|
ref,
|
|
175
|
+
scope,
|
|
166
176
|
...rest
|
|
167
177
|
}: TableCellProps) {
|
|
168
178
|
const { appearance, size, textAlign } = useTableContext("TableCell");
|
|
179
|
+
const cellClassName = cn(
|
|
180
|
+
tableCellVariants({ appearance, size, textAlign }),
|
|
181
|
+
className,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
if (scope !== undefined) {
|
|
185
|
+
return (
|
|
186
|
+
<th
|
|
187
|
+
ref={ref}
|
|
188
|
+
data-slot="table-cell"
|
|
189
|
+
scope={scope}
|
|
190
|
+
className={cellClassName}
|
|
191
|
+
{...rest}
|
|
192
|
+
>
|
|
193
|
+
{children}
|
|
194
|
+
</th>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
169
198
|
return (
|
|
170
199
|
<td
|
|
171
200
|
ref={ref}
|
|
172
201
|
data-slot="table-cell"
|
|
173
|
-
className={
|
|
174
|
-
tableCellVariants({ appearance, size, textAlign }),
|
|
175
|
-
className,
|
|
176
|
-
)}
|
|
202
|
+
className={cellClassName}
|
|
177
203
|
{...rest}
|
|
178
204
|
>
|
|
179
205
|
{children}
|
package/src/ui/table/types.ts
CHANGED
|
@@ -19,6 +19,8 @@ export type TableProps = TableVariantProps &
|
|
|
19
19
|
children?: ReactNode;
|
|
20
20
|
ref?: Ref<HTMLTableElement>;
|
|
21
21
|
textAlign?: "left" | "center" | "right";
|
|
22
|
+
/** Label for the overflow scroll wrapper (keyboard-focusable region). */
|
|
23
|
+
scrollAreaAriaLabel?: string;
|
|
22
24
|
};
|
|
23
25
|
|
|
24
26
|
export type TableSectionProps = {
|
|
@@ -33,9 +35,14 @@ export type TableHeadCellProps = ThHTMLAttributes<HTMLTableCellElement> & {
|
|
|
33
35
|
ref?: Ref<HTMLTableCellElement>;
|
|
34
36
|
};
|
|
35
37
|
|
|
36
|
-
export type TableCellProps =
|
|
38
|
+
export type TableCellProps = Omit<
|
|
39
|
+
TdHTMLAttributes<HTMLTableCellElement>,
|
|
40
|
+
"scope"
|
|
41
|
+
> & {
|
|
37
42
|
ref?: Ref<HTMLTableCellElement>;
|
|
38
43
|
textAlign?: "left" | "center" | "right";
|
|
44
|
+
/** Row/column header scope; when set, the cell renders as `<th>` (required for valid `scope` usage). */
|
|
45
|
+
scope?: ThHTMLAttributes<HTMLTableCellElement>["scope"];
|
|
39
46
|
};
|
|
40
47
|
|
|
41
48
|
export type TableCtx = {
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
KeyboardEvent,
|
|
6
6
|
useContext,
|
|
7
7
|
useId,
|
|
8
|
+
useRef,
|
|
8
9
|
useState,
|
|
9
10
|
} from "react";
|
|
10
11
|
|
|
@@ -41,6 +42,7 @@ export function Tabs({
|
|
|
41
42
|
}: TabsProps) {
|
|
42
43
|
const [internalValue, setInternalValue] = useState(defaultValue);
|
|
43
44
|
const idPrefix = useId();
|
|
45
|
+
const listRef = useRef<HTMLDivElement | null>(null);
|
|
44
46
|
|
|
45
47
|
const isControlled = value !== undefined;
|
|
46
48
|
const currentValue = isControlled ? value : internalValue;
|
|
@@ -60,6 +62,7 @@ export function Tabs({
|
|
|
60
62
|
value={{
|
|
61
63
|
value: currentValue,
|
|
62
64
|
setValue,
|
|
65
|
+
listRef,
|
|
63
66
|
orientation,
|
|
64
67
|
size,
|
|
65
68
|
variant,
|
|
@@ -76,10 +79,11 @@ export function Tabs({
|
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
export function TabsList({ children, className, ...props }: TabsListProps) {
|
|
79
|
-
const { orientation, size } = useTabs();
|
|
82
|
+
const { orientation, size, listRef } = useTabs();
|
|
80
83
|
|
|
81
84
|
return (
|
|
82
85
|
<div
|
|
86
|
+
ref={listRef}
|
|
83
87
|
role="tablist"
|
|
84
88
|
aria-orientation={orientation}
|
|
85
89
|
className={cn(tabsListVariants({ orientation, size }), className)}
|
|
@@ -100,6 +104,8 @@ export function TabsTrigger({
|
|
|
100
104
|
const {
|
|
101
105
|
value: activeValue,
|
|
102
106
|
setValue,
|
|
107
|
+
listRef,
|
|
108
|
+
orientation,
|
|
103
109
|
tabTriggerId,
|
|
104
110
|
tabPanelId,
|
|
105
111
|
size,
|
|
@@ -110,30 +116,84 @@ export function TabsTrigger({
|
|
|
110
116
|
const isActive = activeValue === value;
|
|
111
117
|
|
|
112
118
|
const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
119
|
+
const list = listRef.current;
|
|
120
|
+
const triggers =
|
|
121
|
+
list === null
|
|
122
|
+
? []
|
|
123
|
+
: Array.from(list.querySelectorAll<HTMLButtonElement>('[role="tab"]'));
|
|
124
|
+
|
|
125
|
+
const nextKeys =
|
|
126
|
+
orientation === "vertical" ? ["ArrowDown"] : ["ArrowRight"];
|
|
127
|
+
const prevKeys = orientation === "vertical" ? ["ArrowUp"] : ["ArrowLeft"];
|
|
116
128
|
|
|
117
129
|
const index = triggers.findIndex((el) => el === e.currentTarget);
|
|
130
|
+
if (index === -1) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
118
133
|
|
|
119
|
-
|
|
134
|
+
const findEnabledIndex = (
|
|
135
|
+
start: number,
|
|
136
|
+
direction: 1 | -1,
|
|
137
|
+
): number | undefined => {
|
|
138
|
+
const n = triggers.length;
|
|
139
|
+
if (n === 0) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
let i = start;
|
|
143
|
+
for (let step = 0; step < n; step += 1) {
|
|
144
|
+
i = (i + direction + n) % n;
|
|
145
|
+
if (triggers[i]?.disabled !== true) {
|
|
146
|
+
return i;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const focusAt = (i: number) => {
|
|
153
|
+
const target = triggers[i];
|
|
154
|
+
if (target !== undefined && target.disabled !== true) {
|
|
155
|
+
target.focus();
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const isNext = nextKeys.includes(e.key);
|
|
160
|
+
const isPrev = prevKeys.includes(e.key);
|
|
161
|
+
|
|
162
|
+
if (isNext) {
|
|
120
163
|
e.preventDefault();
|
|
121
|
-
|
|
164
|
+
const nextIdx = findEnabledIndex(index, 1);
|
|
165
|
+
if (nextIdx !== undefined) {
|
|
166
|
+
focusAt(nextIdx);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
122
169
|
}
|
|
123
170
|
|
|
124
|
-
if (
|
|
171
|
+
if (isPrev) {
|
|
125
172
|
e.preventDefault();
|
|
126
|
-
|
|
173
|
+
const prevIdx = findEnabledIndex(index, -1);
|
|
174
|
+
if (prevIdx !== undefined) {
|
|
175
|
+
focusAt(prevIdx);
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
127
178
|
}
|
|
128
179
|
|
|
129
180
|
if (e.key === "Home") {
|
|
130
181
|
e.preventDefault();
|
|
131
|
-
triggers
|
|
182
|
+
const firstEnabledIndex = triggers.findIndex((btn) => !btn.disabled);
|
|
183
|
+
if (firstEnabledIndex !== -1) {
|
|
184
|
+
triggers[firstEnabledIndex]?.focus();
|
|
185
|
+
}
|
|
186
|
+
return;
|
|
132
187
|
}
|
|
133
188
|
|
|
134
189
|
if (e.key === "End") {
|
|
135
190
|
e.preventDefault();
|
|
136
|
-
triggers
|
|
191
|
+
for (let i = triggers.length - 1; i >= 0; i -= 1) {
|
|
192
|
+
if (!triggers[i]?.disabled) {
|
|
193
|
+
triggers[i]?.focus();
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
137
197
|
}
|
|
138
198
|
};
|
|
139
199
|
|
|
@@ -146,6 +206,7 @@ export function TabsTrigger({
|
|
|
146
206
|
aria-selected={isActive}
|
|
147
207
|
aria-controls={tabPanelId(value)}
|
|
148
208
|
disabled={disabled}
|
|
209
|
+
tabIndex={activeValue === undefined ? undefined : isActive ? 0 : -1}
|
|
149
210
|
onClick={() => setValue(value)}
|
|
150
211
|
onKeyDown={handleKeyDown}
|
|
151
212
|
className={cn(
|
package/src/ui/tabs/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ElementType, HTMLAttributes, ReactNode } from "react";
|
|
1
|
+
import type { ElementType, HTMLAttributes, ReactNode, RefObject } from "react";
|
|
2
2
|
|
|
3
3
|
export type TabsValue = string;
|
|
4
4
|
|
|
@@ -59,6 +59,7 @@ export type TabsContentProps = {
|
|
|
59
59
|
export type TabsContextType = {
|
|
60
60
|
value: TabsValue | undefined;
|
|
61
61
|
setValue: (value: TabsValue) => void;
|
|
62
|
+
listRef: RefObject<HTMLDivElement | null>;
|
|
62
63
|
orientation: "horizontal" | "vertical";
|
|
63
64
|
size?: "sm" | "md" | "lg";
|
|
64
65
|
variant?: "default" | "underline" | "pills";
|
package/src/ui/tabs/variants.ts
CHANGED
|
@@ -24,7 +24,7 @@ export const tabsListVariants = cva("flex items-center gap-1", {
|
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
export const tabsTriggerVariants = cva(
|
|
27
|
-
"px-3 py-1.5 rounded-md transition-all focus:outline-none focus:ring-2 focus:ring-ring",
|
|
27
|
+
"px-3 py-1.5 rounded-md transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
28
28
|
{
|
|
29
29
|
variants: {
|
|
30
30
|
appearance: {
|
|
@@ -217,7 +217,7 @@ export function ToastClose({
|
|
|
217
217
|
data-slot="toast-close"
|
|
218
218
|
aria-label="Dismiss notification"
|
|
219
219
|
className={cn(
|
|
220
|
-
"absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10",
|
|
220
|
+
"absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950",
|
|
221
221
|
className,
|
|
222
222
|
)}
|
|
223
223
|
onClick={onClick}
|
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useState } from "react";
|
|
3
|
+
import { useCallback, useId, useState, type ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
import { cn } from "../../lib/utils";
|
|
6
6
|
|
|
7
7
|
import type { ToggleProps } from "./types";
|
|
8
8
|
import { toggleThumbVariants, toggleTrackVariants } from "./variants";
|
|
9
9
|
|
|
10
|
+
function hasToggleLabelChildren(node: ReactNode): boolean {
|
|
11
|
+
if (node === undefined || node === null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (typeof node === "boolean") {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (typeof node === "string") {
|
|
18
|
+
return node.trim().length > 0;
|
|
19
|
+
}
|
|
20
|
+
if (typeof node === "number") {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(node)) {
|
|
24
|
+
return node.some(hasToggleLabelChildren);
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
10
29
|
export function ToggleBase(props: ToggleProps) {
|
|
11
30
|
const {
|
|
12
31
|
className,
|
|
@@ -17,10 +36,11 @@ export function ToggleBase(props: ToggleProps) {
|
|
|
17
36
|
onCheckedChange,
|
|
18
37
|
disabled,
|
|
19
38
|
ref,
|
|
20
|
-
"aria-label":
|
|
39
|
+
"aria-label": ariaLabelProp,
|
|
21
40
|
children,
|
|
22
41
|
...rest
|
|
23
42
|
} = props;
|
|
43
|
+
const toggleLabelId = useId();
|
|
24
44
|
const isControlled = checked !== undefined;
|
|
25
45
|
const [uncontrolled, setUncontrolled] = useState(defaultChecked);
|
|
26
46
|
const resolved = isControlled ? Boolean(checked) : uncontrolled;
|
|
@@ -36,6 +56,15 @@ export function ToggleBase(props: ToggleProps) {
|
|
|
36
56
|
);
|
|
37
57
|
|
|
38
58
|
const thumbShiftPx = size === "sm" ? 14 : size === "lg" ? 26 : 20;
|
|
59
|
+
const labeledByChildren = hasToggleLabelChildren(children);
|
|
60
|
+
const labeling =
|
|
61
|
+
labeledByChildren ?
|
|
62
|
+
{
|
|
63
|
+
"aria-labelledby": toggleLabelId,
|
|
64
|
+
}
|
|
65
|
+
: {
|
|
66
|
+
"aria-label": ariaLabelProp ?? "Toggle",
|
|
67
|
+
};
|
|
39
68
|
|
|
40
69
|
return (
|
|
41
70
|
<button
|
|
@@ -44,10 +73,10 @@ export function ToggleBase(props: ToggleProps) {
|
|
|
44
73
|
role="switch"
|
|
45
74
|
data-slot="toggle"
|
|
46
75
|
aria-checked={resolved}
|
|
47
|
-
aria-label={ariaLabel}
|
|
48
76
|
data-state={resolved ? "checked" : "unchecked"}
|
|
49
77
|
disabled={disabled}
|
|
50
78
|
className={cn(toggleTrackVariants({ size, appearance }), className)}
|
|
79
|
+
{...labeling}
|
|
51
80
|
onClick={() => {
|
|
52
81
|
if (!disabled) {
|
|
53
82
|
setChecked(!resolved);
|
|
@@ -55,7 +84,11 @@ export function ToggleBase(props: ToggleProps) {
|
|
|
55
84
|
}}
|
|
56
85
|
{...rest}
|
|
57
86
|
>
|
|
58
|
-
|
|
87
|
+
{labeledByChildren ?
|
|
88
|
+
<span id={toggleLabelId} className="sr-only">
|
|
89
|
+
{children}
|
|
90
|
+
</span>
|
|
91
|
+
: null}
|
|
59
92
|
<span
|
|
60
93
|
className={cn(
|
|
61
94
|
toggleThumbVariants({ size }),
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
Children,
|
|
5
|
+
cloneElement,
|
|
4
6
|
createContext,
|
|
7
|
+
isValidElement,
|
|
5
8
|
useCallback,
|
|
6
9
|
useContext,
|
|
7
10
|
useEffect,
|
|
11
|
+
useId,
|
|
8
12
|
useRef,
|
|
9
13
|
useState,
|
|
14
|
+
type KeyboardEventHandler,
|
|
15
|
+
type MouseEventHandler,
|
|
16
|
+
type FocusEventHandler,
|
|
17
|
+
type ReactElement,
|
|
10
18
|
} from "react";
|
|
11
19
|
|
|
12
20
|
import { cn } from "../../lib/utils";
|
|
@@ -29,6 +37,22 @@ export const useTooltip = () => {
|
|
|
29
37
|
return context;
|
|
30
38
|
};
|
|
31
39
|
|
|
40
|
+
function mergeDescribedBy(
|
|
41
|
+
tooltipId: string,
|
|
42
|
+
existing: unknown,
|
|
43
|
+
open: boolean,
|
|
44
|
+
): string | undefined {
|
|
45
|
+
if (!open) {
|
|
46
|
+
return typeof existing === "string" ? existing : undefined;
|
|
47
|
+
}
|
|
48
|
+
const baseIds =
|
|
49
|
+
typeof existing === "string" && existing.trim().length > 0
|
|
50
|
+
? existing.split(/\s+/).filter(Boolean)
|
|
51
|
+
: [];
|
|
52
|
+
const merged = [...new Set([...baseIds, tooltipId])];
|
|
53
|
+
return merged.join(" ");
|
|
54
|
+
}
|
|
55
|
+
|
|
32
56
|
export const Tooltip = ({
|
|
33
57
|
children,
|
|
34
58
|
defaultOpen = false,
|
|
@@ -38,6 +62,7 @@ export const Tooltip = ({
|
|
|
38
62
|
delay = 100,
|
|
39
63
|
}: TooltipProps) => {
|
|
40
64
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
65
|
+
const tooltipId = `${useId()}-tooltip`;
|
|
41
66
|
|
|
42
67
|
const isControlled = controlledOpen !== undefined;
|
|
43
68
|
const open = isControlled ? controlledOpen : uncontrolledOpen;
|
|
@@ -78,6 +103,7 @@ export const Tooltip = ({
|
|
|
78
103
|
delay,
|
|
79
104
|
scheduleDelayedOpen,
|
|
80
105
|
cancelDelayedOpen,
|
|
106
|
+
tooltipId,
|
|
81
107
|
}}
|
|
82
108
|
>
|
|
83
109
|
<div className="relative inline-block">{children}</div>
|
|
@@ -89,33 +115,103 @@ export const TooltipTrigger = ({
|
|
|
89
115
|
children,
|
|
90
116
|
className,
|
|
91
117
|
}: TooltipTriggerProps) => {
|
|
92
|
-
const { setOpen, scheduleDelayedOpen, cancelDelayedOpen } =
|
|
118
|
+
const { setOpen, scheduleDelayedOpen, cancelDelayedOpen, open, tooltipId } =
|
|
119
|
+
useTooltip();
|
|
93
120
|
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
121
|
+
const onMouseEnter: MouseEventHandler = () => scheduleDelayedOpen();
|
|
122
|
+
const onMouseLeave: MouseEventHandler = () => {
|
|
123
|
+
cancelDelayedOpen();
|
|
124
|
+
setOpen(false);
|
|
125
|
+
};
|
|
126
|
+
const onFocus: FocusEventHandler = () => {
|
|
127
|
+
cancelDelayedOpen();
|
|
128
|
+
setOpen(true);
|
|
129
|
+
};
|
|
130
|
+
const onBlur: FocusEventHandler = () => {
|
|
131
|
+
cancelDelayedOpen();
|
|
132
|
+
setOpen(false);
|
|
133
|
+
};
|
|
134
|
+
const onKeyDown: KeyboardEventHandler = (event) => {
|
|
135
|
+
if (event.key === "Escape") {
|
|
105
136
|
cancelDelayedOpen();
|
|
106
137
|
setOpen(false);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const childList = Children.toArray(children).filter(
|
|
142
|
+
(node) =>
|
|
143
|
+
node !== null && node !== undefined && typeof node !== "boolean",
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const soleCandidate =
|
|
147
|
+
childList.length === 1 && isValidElement(childList[0])
|
|
148
|
+
? (childList[0] as ReactElement<{
|
|
149
|
+
className?: string;
|
|
150
|
+
"aria-describedby"?: string;
|
|
151
|
+
onMouseEnter?: MouseEventHandler;
|
|
152
|
+
onMouseLeave?: MouseEventHandler;
|
|
153
|
+
onFocus?: FocusEventHandler;
|
|
154
|
+
onBlur?: FocusEventHandler;
|
|
155
|
+
onKeyDown?: KeyboardEventHandler;
|
|
156
|
+
}>)
|
|
157
|
+
: undefined;
|
|
158
|
+
|
|
159
|
+
if (soleCandidate) {
|
|
160
|
+
const describedBy = mergeDescribedBy(
|
|
161
|
+
tooltipId,
|
|
162
|
+
soleCandidate.props["aria-describedby"],
|
|
163
|
+
open,
|
|
164
|
+
);
|
|
165
|
+
return cloneElement(soleCandidate, {
|
|
166
|
+
onMouseEnter: (event: React.MouseEvent) => {
|
|
167
|
+
soleCandidate.props.onMouseEnter?.(event);
|
|
168
|
+
if (!event.defaultPrevented) {
|
|
169
|
+
scheduleDelayedOpen();
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
onMouseLeave: (event: React.MouseEvent) => {
|
|
173
|
+
soleCandidate.props.onMouseLeave?.(event);
|
|
110
174
|
cancelDelayedOpen();
|
|
111
175
|
setOpen(false);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
176
|
+
},
|
|
177
|
+
onFocus: (event: React.FocusEvent) => {
|
|
178
|
+
soleCandidate.props.onFocus?.(event);
|
|
179
|
+
if (!event.defaultPrevented) {
|
|
180
|
+
cancelDelayedOpen();
|
|
181
|
+
setOpen(true);
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
onBlur: (event: React.FocusEvent) => {
|
|
185
|
+
soleCandidate.props.onBlur?.(event);
|
|
186
|
+
cancelDelayedOpen();
|
|
187
|
+
setOpen(false);
|
|
188
|
+
},
|
|
189
|
+
onKeyDown: (event: React.KeyboardEvent) => {
|
|
190
|
+
soleCandidate.props.onKeyDown?.(event);
|
|
191
|
+
if (event.key === "Escape") {
|
|
192
|
+
cancelDelayedOpen();
|
|
193
|
+
setOpen(false);
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
className: cn(className, soleCandidate.props.className),
|
|
197
|
+
"aria-describedby": describedBy,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
117
200
|
|
|
118
|
-
return
|
|
201
|
+
return (
|
|
202
|
+
<span
|
|
203
|
+
className={className}
|
|
204
|
+
tabIndex={0}
|
|
205
|
+
aria-describedby={mergeDescribedBy(tooltipId, undefined, open)}
|
|
206
|
+
onMouseEnter={onMouseEnter}
|
|
207
|
+
onMouseLeave={onMouseLeave}
|
|
208
|
+
onFocus={onFocus}
|
|
209
|
+
onBlur={onBlur}
|
|
210
|
+
onKeyDown={onKeyDown}
|
|
211
|
+
>
|
|
212
|
+
{children}
|
|
213
|
+
</span>
|
|
214
|
+
);
|
|
119
215
|
};
|
|
120
216
|
|
|
121
217
|
export const TooltipContent = ({
|
|
@@ -125,7 +221,7 @@ export const TooltipContent = ({
|
|
|
125
221
|
size,
|
|
126
222
|
width,
|
|
127
223
|
}: TooltipContentProps) => {
|
|
128
|
-
const { open, position } = useTooltip();
|
|
224
|
+
const { open, position, tooltipId } = useTooltip();
|
|
129
225
|
|
|
130
226
|
if (!open) return null;
|
|
131
227
|
|
|
@@ -138,6 +234,7 @@ export const TooltipContent = ({
|
|
|
138
234
|
|
|
139
235
|
return (
|
|
140
236
|
<div
|
|
237
|
+
id={tooltipId}
|
|
141
238
|
data-open={open}
|
|
142
239
|
role="tooltip"
|
|
143
240
|
className={cn(
|
package/src/ui/tooltip/types.ts
CHANGED
|
@@ -9,12 +9,12 @@ export const tooltipVariants = cva(
|
|
|
9
9
|
outline: "border bg-white text-black",
|
|
10
10
|
ghost: "bg-gray-800 text-white/90",
|
|
11
11
|
glass: "border border-white/15 bg-white/10 text-white backdrop-blur-md",
|
|
12
|
-
emerald: "bg-emerald-
|
|
12
|
+
emerald: "bg-emerald-800 text-white",
|
|
13
13
|
indigo: "bg-indigo-600 text-white",
|
|
14
14
|
purple: "bg-purple-600 text-white",
|
|
15
15
|
pink: "bg-pink-600 text-white",
|
|
16
16
|
rose: "bg-rose-600 text-white",
|
|
17
|
-
sky: "bg-sky-
|
|
17
|
+
sky: "bg-sky-700 text-white",
|
|
18
18
|
teal: "bg-teal-600 text-white",
|
|
19
19
|
yellow: "bg-yellow-600 text-white",
|
|
20
20
|
orange: "bg-orange-600 text-white",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/tabs/variants.ts","../src/ui/tabs/tabs-base.tsx"],"names":["cva","createContext","useContext","useState","useId","jsx","cn"],"mappings":"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","file":"chunk-2PQEXQVR.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const tabsListVariants = cva(\"flex items-center gap-1\", {\n variants: {\n variant: {\n default: \"bg-transparent\",\n underline: \"border-b-2 border-transparent\",\n pills: \"rounded-md\",\n },\n size: {\n sm: \"text-sm p-1\",\n md: \"text-base p-1.5\",\n lg: \"text-lg p-2\",\n },\n orientation: {\n horizontal: \"flex-row\",\n vertical: \"flex-col\",\n },\n },\n defaultVariants: {\n size: \"md\",\n orientation: \"horizontal\",\n },\n});\n\nexport const tabsTriggerVariants = cva(\n \"px-3 py-1.5 rounded-md transition-all focus:outline-none focus:ring-2 focus:ring-ring\",\n {\n variants: {\n appearance: {\n default: \"bg-transparent\",\n sky: \"bg-sky-500/75\",\n rose: \"bg-rose-500/75\",\n purple: \"bg-purple-500/75\",\n pink: \"bg-pink-500/75\",\n orange: \"bg-orange-500/75\",\n yellow: \"bg-yellow-500/75\",\n teal: \"bg-teal-500/75\",\n indigo: \"bg-indigo-500/75\",\n emerald: \"bg-emerald-500/75\",\n gray: \"bg-gray-500/75\",\n \"gradient-blue\": \"bg-gradient-to-r from-blue-600 to-purple-600\",\n \"gradient-green\": \"bg-gradient-to-r from-green-600 to-lime-600\",\n \"gradient-red\": \"bg-gradient-to-r from-red-600 to-pink-600\",\n \"gradient-yellow\": \"bg-gradient-to-r from-yellow-600 to-orange-600\",\n \"gradient-purple\": \"bg-gradient-to-r from-purple-600 to-pink-600\",\n \"gradient-teal\": \"bg-gradient-to-r from-teal-600 to-cyan-600\",\n \"gradient-indigo\": \"bg-gradient-to-r from-indigo-600 to-purple-600\",\n \"gradient-pink\": \"bg-gradient-to-r from-pink-600 to-rose-600\",\n \"gradient-orange\": \"bg-gradient-to-r from-orange-600 to-red-600\",\n },\n variant: {\n default: \"data-[state=active]:bg-background\",\n underline:\n \"border-b-2 border-transparent data-[state=active]:border-primary rounded-none\",\n pills: \"data-[state=active]:bg-primary data-[state=active]:text-white\",\n },\n size: {\n sm: \"px-2 py-1\",\n md: \"px-3 py-1.5\",\n lg: \"px-4 py-2\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n","\"use client\";\n\nimport {\n createContext,\n KeyboardEvent,\n useContext,\n useId,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport {\n TabsContentProps,\n TabsListProps,\n TabsProps,\n TabsTriggerProps,\n TabsValue,\n TabsContextType,\n} from \"./types\";\nimport { tabsListVariants, tabsTriggerVariants } from \"./variants\";\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\nexport const useTabs = () => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error(\"Tabs components must be used within Tabs\");\n return ctx;\n};\n\nexport function Tabs({\n value,\n defaultValue,\n onValueChange,\n orientation = \"horizontal\",\n variant,\n size,\n appearance,\n children,\n className,\n}: TabsProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const idPrefix = useId();\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const setValue = (val: string) => {\n if (!isControlled) setInternalValue(val);\n onValueChange?.(val);\n };\n\n const tabTriggerId = (tabValue: TabsValue) =>\n `${idPrefix}zentauri-tab-${tabValue}`;\n const tabPanelId = (tabValue: TabsValue) =>\n `${idPrefix}zentauri-panel-${tabValue}`;\n\n return (\n <TabsContext.Provider\n value={{\n value: currentValue,\n setValue,\n orientation,\n size,\n variant,\n appearance,\n tabTriggerId,\n tabPanelId,\n }}\n >\n <div data-slot=\"tabs\" className={cn(\"w-full\", className)}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport function TabsList({ children, className, ...props }: TabsListProps) {\n const { orientation, size } = useTabs();\n\n return (\n <div\n role=\"tablist\"\n aria-orientation={orientation}\n className={cn(tabsListVariants({ orientation, size }), className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function TabsTrigger({\n value,\n children,\n disabled,\n className,\n ...props\n}: TabsTriggerProps) {\n const {\n value: activeValue,\n setValue,\n tabTriggerId,\n tabPanelId,\n size,\n appearance,\n variant,\n } = useTabs();\n\n const isActive = activeValue === value;\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n const triggers = Array.from(\n document.querySelectorAll('[role=\"tab\"]'),\n ) as HTMLElement[];\n\n const index = triggers.findIndex((el) => el === e.currentTarget);\n\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n triggers[index + 1]?.focus();\n }\n\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n triggers[index - 1]?.focus();\n }\n\n if (e.key === \"Home\") {\n e.preventDefault();\n triggers[0]?.focus();\n }\n\n if (e.key === \"End\") {\n e.preventDefault();\n triggers[triggers.length - 1]?.focus();\n }\n };\n\n return (\n <button\n id={tabTriggerId(value)}\n type=\"button\"\n role=\"tab\"\n data-state={isActive ? \"active\" : \"inactive\"}\n aria-selected={isActive}\n aria-controls={tabPanelId(value)}\n disabled={disabled}\n onClick={() => setValue(value)}\n onKeyDown={handleKeyDown}\n className={cn(\n tabsTriggerVariants({ size, appearance, variant }),\n className,\n \"cursor-pointer\",\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function TabsContent({\n value,\n children,\n className,\n as: Wrapper = \"div\",\n ...props\n}: TabsContentProps) {\n const { value: activeValue, tabTriggerId, tabPanelId } = useTabs();\n\n if (activeValue !== value) return null;\n\n return (\n <Wrapper\n id={tabPanelId(value)}\n role=\"tabpanel\"\n aria-labelledby={tabTriggerId(value)}\n className={cn(\"mt-2\", className)}\n {...props}\n >\n {children}\n </Wrapper>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/table/variants.ts","../src/ui/table/table-base.tsx"],"names":["cva","createContext","useContext","useMemo","jsx","cn"],"mappings":"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","file":"chunk-3OR47XMY.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const tableVariants = cva(\n \"w-full table-auto border-collapse caption-bottom text-sm text-slate-200 md:table-fixed\",\n {\n variants: {\n appearance: {\n default: \"\",\n striped: \"\",\n bordered: \"border border-white/10\",\n ghost: \"\",\n sky: \"border border-sky-600\",\n rose: \"border border-rose-600\",\n purple: \"border border-purple-600\",\n pink: \"border border-pink-600\",\n orange: \"border border-orange-600\",\n yellow: \"border border-yellow-600\",\n teal: \"border border-teal-600\",\n indigo: \"border border-indigo-600\",\n emerald: \"border border-emerald-600\",\n gray: \"border border-gray-600\",\n amber: \"border border-amber-600\",\n violet: \"border border-violet-600\",\n },\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n },\n stickyHeader: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n stickyHeader: false,\n },\n },\n);\n\nexport const tableRowVariants = cva(\n \"border-b border-white/5 transition-colors data-[state=selected]:bg-white/[0.06]\",\n {\n variants: {\n appearance: {\n default: \"\",\n striped: \"odd:bg-white/[0.03]\",\n bordered: \"\",\n ghost: \"border-transparent hover:bg-white/[0.03]\",\n sky: \"border-sky-600 hover:bg-sky-600\",\n rose: \"border-rose-600 hover:bg-rose-900\",\n purple: \"border-purple-600 hover:bg-purple-900\",\n pink: \"border-pink-600 hover:bg-pink-900\",\n orange: \"border-orange-600 hover:bg-orange-900\",\n yellow: \"border-yellow-600 hover:bg-yellow-900\",\n teal: \"border-teal-600 hover:bg-teal-900\",\n indigo: \"border-indigo-600 hover:bg-indigo-900\",\n emerald: \"border-emerald-600 hover:bg-emerald-900\",\n gray: \"border-gray-600 hover:bg-gray-900\",\n amber: \"border-amber-600 hover:bg-amber-900\",\n violet: \"border-violet-600 hover:bg-violet-900\",\n },\n },\n defaultVariants: { appearance: \"default\" },\n },\n);\n\nexport const tableCellVariants = cva(\n \"min-w-0 border p-3 align-middle break-words\",\n {\n variants: {\n appearance: {\n default: \"border-white/10\",\n striped: \"border-white/10\",\n bordered: \"border-white/10\",\n ghost: \"border-white/10\",\n sky: \"border-sky-600\",\n rose: \"border-rose-600\",\n purple: \"border-purple-600\",\n pink: \"border-pink-600\",\n orange: \"border-orange-600\",\n yellow: \"border-yellow-600\",\n teal: \"border-teal-600\",\n indigo: \"border-indigo-600\",\n emerald: \"border-emerald-600\",\n gray: \"border-gray-600\",\n amber: \"border-amber-600\",\n violet: \"border-violet-600\",\n },\n size: {\n sm: \"p-2\",\n md: \"p-3\",\n lg: \"p-4\",\n },\n textAlign: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n },\n defaultVariants: { appearance: \"default\", size: \"md\" },\n },\n);\n","\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n TableCtx,\n TableCellProps,\n TableHeadCellProps,\n TableProps,\n TableSectionProps,\n} from \"./types\";\nimport { tableCellVariants, tableRowVariants, tableVariants } from \"./variants\";\n\nexport const TableContext = createContext<TableCtx | null>(null);\n\nexport function useTableContext(component: string): TableCtx {\n const ctx = useContext(TableContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Table>`);\n }\n return ctx;\n}\n\nexport function TableBase(props: TableProps) {\n const {\n className,\n appearance = \"default\",\n size = \"md\",\n textAlign = \"left\",\n stickyHeader = false,\n children,\n ref,\n ...rest\n } = props;\n const ctx = useMemo(\n () => ({\n appearance: appearance ?? \"default\",\n size: size ?? \"md\",\n stickyHeader: Boolean(stickyHeader),\n rowAnimation: \"none\" as const,\n textAlign,\n }),\n [appearance, size, stickyHeader, textAlign],\n );\n\n return (\n <TableContext.Provider value={ctx}>\n <div data-slot=\"table-scroll\" className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n data-slot=\"table\"\n role=\"table\"\n className={cn(\n tableVariants({ appearance, size, stickyHeader }),\n \"w-full min-w-0 table\",\n className,\n )}\n {...rest}\n >\n {children}\n </table>\n </div>\n </TableContext.Provider>\n );\n}\n\nTableBase.displayName = \"Table\";\n\nexport function TableHeader({ className, children }: TableSectionProps) {\n const { stickyHeader } = useTableContext(\"TableHeader\");\n const stickyClass = stickyHeader\n ? \"sticky top-0 z-10 bg-slate-950/95 backdrop-blur\"\n : \"\";\n return (\n <thead data-slot=\"table-header\" className={cn(stickyClass, className)}>\n {children}\n </thead>\n );\n}\n\nTableHeader.displayName = \"TableHeader\";\n\nexport function TableBody({ className, children }: TableSectionProps) {\n return (\n <tbody data-slot=\"table-body\" className={cn(className)}>\n {children}\n </tbody>\n );\n}\n\nTableBody.displayName = \"TableBody\";\n\nexport function TableFooter({ className, children }: TableSectionProps) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t border-white/10 bg-white/3 font-medium\",\n className,\n )}\n >\n {children}\n </tfoot>\n );\n}\n\nTableFooter.displayName = \"TableFooter\";\n\nexport function TableRow({\n className,\n children,\n ref,\n as: Wrapper = \"tr\",\n ...rest\n}: TableSectionProps & { ref?: React.Ref<HTMLTableRowElement> }) {\n const { appearance } = useTableContext(\"TableRow\");\n\n return (\n <tr\n ref={ref}\n data-slot=\"table-row\"\n className={cn(tableRowVariants({ appearance }), className)}\n {...rest}\n >\n {children}\n </tr>\n );\n}\n\nTableRow.displayName = \"TableRow\";\n\nexport function TableHead({\n className,\n children,\n scope = \"col\",\n sortDirection,\n ref,\n ...rest\n}: TableHeadCellProps) {\n const { appearance, size, textAlign } = useTableContext(\"TableHead\");\n return (\n <th\n ref={ref}\n data-slot=\"table-head\"\n scope={scope}\n aria-sort={sortDirection}\n className={cn(\n tableCellVariants({ appearance, size, textAlign }),\n className,\n )}\n {...rest}\n >\n {children}\n </th>\n );\n}\n\nTableHead.displayName = \"TableHead\";\n\nexport function TableCell({\n className,\n children,\n ref,\n ...rest\n}: TableCellProps) {\n const { appearance, size, textAlign } = useTableContext(\"TableCell\");\n return (\n <td\n ref={ref}\n data-slot=\"table-cell\"\n className={cn(\n tableCellVariants({ appearance, size, textAlign }),\n className,\n )}\n {...rest}\n >\n {children}\n </td>\n );\n}\n\nTableCell.displayName = \"TableCell\";\n\nexport function TableCaption({ className, children }: TableSectionProps) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-3 text-left text-xs text-slate-500\", className)}\n >\n {children}\n </caption>\n );\n}\n\nTableCaption.displayName = \"TableCaption\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/empty-state/variants.ts","../src/ui/empty-state/empty-state-base.tsx"],"names":["cva","createContext","useContext","useMemo","jsx","cn"],"mappings":"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","file":"chunk-5QB2KNZQ.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const emptyStateVariants = cva(\n \"flex w-full flex-col items-center text-center\",\n {\n variants: {\n size: {\n sm: \"gap-2 p-4 text-sm\",\n md: \"gap-3 p-6 text-sm\",\n lg: \"gap-4 p-8 text-base\",\n },\n appearance: {\n default: \"text-slate-50\",\n ghost: \"text-slate-200\",\n card: \"rounded-2xl border border-white/10 bg-white/5 p-8 text-slate-50 shadow-[0_18px_48px_rgba(15,23,42,0.35)]\",\n },\n align: {\n start: \"items-start text-left\",\n center: \"items-center text-center\",\n end: \"items-end text-right\",\n },\n },\n defaultVariants: {\n size: \"md\",\n appearance: \"default\",\n align: \"center\",\n },\n },\n);\n\nexport const emptyStateTitleVariants = cva(\"font-semibold tracking-tight\", {\n variants: {\n size: {\n sm: \"text-base\",\n md: \"text-lg\",\n lg: \"text-xl\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport const emptyStateDescriptionVariants = cva(\"max-w-md text-slate-400\", {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n","\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { EmptyStateProps, EmptyStateSectionProps, EmptyStateSize } from \"./types\";\nimport {\n emptyStateDescriptionVariants,\n emptyStateTitleVariants,\n emptyStateVariants,\n} from \"./variants\";\n\nexport const EmptyStateSizeContext = createContext<EmptyStateSize>(\"md\");\n\nfunction useEmptyStateSize(): EmptyStateSize {\n return useContext(EmptyStateSizeContext);\n}\n\nexport function EmptyStateBase(props: EmptyStateProps) {\n const {\n className,\n size = \"md\",\n appearance,\n align,\n children,\n ref,\n as: Wrapper = \"section\",\n ...rest\n } = props;\n const ctx = useMemo(() => size ?? \"md\", [size]);\n\n return (\n <EmptyStateSizeContext.Provider value={ctx}>\n <Wrapper\n ref={ref}\n data-slot=\"empty-state\"\n aria-live=\"polite\"\n className={cn(\n emptyStateVariants({ size, appearance, align }),\n className,\n )}\n {...rest}\n >\n {children}\n </Wrapper>\n </EmptyStateSizeContext.Provider>\n );\n}\n\nEmptyStateBase.displayName = \"EmptyState\";\n\nexport function EmptyStateIcon({\n className,\n children,\n}: EmptyStateSectionProps) {\n return (\n <div\n data-slot=\"empty-state-icon\"\n className={cn(\"text-slate-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nEmptyStateIcon.displayName = \"EmptyStateIcon\";\n\nexport function EmptyStateTitle({\n className,\n children,\n}: EmptyStateSectionProps) {\n const size = useEmptyStateSize();\n return (\n <h2\n data-slot=\"empty-state-title\"\n className={cn(emptyStateTitleVariants({ size }), className)}\n >\n {children}\n </h2>\n );\n}\n\nEmptyStateTitle.displayName = \"EmptyStateTitle\";\n\nexport function EmptyStateDescription({\n className,\n children,\n}: EmptyStateSectionProps) {\n const size = useEmptyStateSize();\n return (\n <p\n data-slot=\"empty-state-description\"\n className={cn(emptyStateDescriptionVariants({ size }), className)}\n >\n {children}\n </p>\n );\n}\n\nEmptyStateDescription.displayName = \"EmptyStateDescription\";\n\nexport function EmptyStateAction({\n className,\n children,\n}: EmptyStateSectionProps) {\n return (\n <div data-slot=\"empty-state-action\" className={cn(\"mt-2\", className)}>\n {children}\n </div>\n );\n}\n\nEmptyStateAction.displayName = \"EmptyStateAction\";\n"]}
|