@codefast/ui 0.3.16-canary.3 → 0.4.0-canary.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/CHANGELOG.md +112 -0
- package/README.md +27 -16
- package/dist/components/accordion.d.mts +7 -22
- package/dist/components/accordion.mjs +26 -29
- package/dist/components/alert-dialog.d.mts +27 -26
- package/dist/components/alert-dialog.mjs +53 -45
- package/dist/components/alert.d.mts +12 -2
- package/dist/components/alert.mjs +15 -6
- package/dist/components/aspect-ratio.d.mts +2 -2
- package/dist/components/aspect-ratio.mjs +2 -3
- package/dist/components/avatar.d.mts +41 -5
- package/dist/components/avatar.mjs +40 -10
- package/dist/components/badge.mjs +4 -4
- package/dist/components/breadcrumb.d.mts +1 -0
- package/dist/components/breadcrumb.mjs +11 -10
- package/dist/components/button-group.d.mts +1 -1
- package/dist/components/button-group.mjs +6 -7
- package/dist/components/button.d.mts +0 -1
- package/dist/components/button.mjs +7 -7
- package/dist/components/calendar.d.mts +6 -2
- package/dist/components/calendar.mjs +39 -43
- package/dist/components/card.d.mts +4 -2
- package/dist/components/card.mjs +9 -9
- package/dist/components/carousel.d.mts +16 -4
- package/dist/components/carousel.mjs +25 -12
- package/dist/components/chart.d.mts +8 -3
- package/dist/components/chart.mjs +21 -15
- package/dist/components/checkbox-cards.mjs +6 -6
- package/dist/components/checkbox-group.mjs +6 -7
- package/dist/components/checkbox.d.mts +2 -2
- package/dist/components/checkbox.mjs +8 -9
- package/dist/components/collapsible.d.mts +4 -4
- package/dist/components/collapsible.mjs +4 -5
- package/dist/components/command.d.mts +11 -1
- package/dist/components/command.mjs +35 -32
- package/dist/components/context-menu.d.mts +22 -15
- package/dist/components/context-menu.mjs +44 -39
- package/dist/components/dialog.d.mts +19 -23
- package/dist/components/dialog.mjs +48 -47
- package/dist/components/direction.d.mts +24 -0
- package/dist/components/direction.mjs +18 -0
- package/dist/components/drawer.d.mts +2 -20
- package/dist/components/drawer.mjs +17 -25
- package/dist/components/dropdown-menu.d.mts +22 -15
- package/dist/components/dropdown-menu.mjs +41 -37
- package/dist/components/empty.mjs +5 -5
- package/dist/components/field.d.mts +1 -1
- package/dist/components/field.mjs +11 -12
- package/dist/components/form.d.mts +6 -7
- package/dist/components/form.mjs +6 -7
- package/dist/components/hover-card.d.mts +5 -5
- package/dist/components/hover-card.mjs +14 -12
- package/dist/components/input-group.d.mts +1 -1
- package/dist/components/input-group.mjs +12 -7
- package/dist/components/input-number.d.mts +3 -1
- package/dist/components/input-number.mjs +49 -27
- package/dist/components/input-otp.mjs +9 -7
- package/dist/components/input-password.mjs +1 -4
- package/dist/components/input-search.mjs +3 -5
- package/dist/components/input.mjs +1 -2
- package/dist/components/item.mjs +9 -9
- package/dist/components/kbd.mjs +1 -1
- package/dist/components/label.d.mts +2 -2
- package/dist/components/label.mjs +3 -4
- package/dist/components/menubar.d.mts +22 -16
- package/dist/components/menubar.mjs +54 -47
- package/dist/components/native-select.d.mts +5 -1
- package/dist/components/native-select.mjs +9 -6
- package/dist/components/navigation-menu.d.mts +30 -8
- package/dist/components/navigation-menu.mjs +33 -23
- package/dist/components/pagination.d.mts +6 -0
- package/dist/components/pagination.mjs +26 -11
- package/dist/components/popover.d.mts +40 -7
- package/dist/components/popover.mjs +46 -14
- package/dist/components/progress-circle.d.mts +1 -1
- package/dist/components/progress-circle.mjs +1 -2
- package/dist/components/progress.d.mts +2 -2
- package/dist/components/progress.mjs +5 -6
- package/dist/components/radio-cards.d.mts +3 -3
- package/dist/components/radio-cards.mjs +11 -11
- package/dist/components/radio-group.d.mts +3 -3
- package/dist/components/radio-group.mjs +9 -9
- package/dist/components/radio.mjs +2 -3
- package/dist/components/resizable.mjs +3 -8
- package/dist/components/scroll-area.d.mts +5 -5
- package/dist/components/scroll-area.mjs +13 -10
- package/dist/components/select.d.mts +14 -14
- package/dist/components/select.mjs +47 -47
- package/dist/components/separator.d.mts +2 -2
- package/dist/components/separator.mjs +3 -4
- package/dist/components/sheet.d.mts +13 -14
- package/dist/components/sheet.mjs +41 -39
- package/dist/components/sidebar.d.mts +2 -3
- package/dist/components/sidebar.mjs +46 -46
- package/dist/components/skeleton.mjs +1 -1
- package/dist/components/slider.d.mts +2 -2
- package/dist/components/slider.mjs +9 -11
- package/dist/components/sonner.mjs +11 -3
- package/dist/components/spinner.mjs +6 -7
- package/dist/components/switch.d.mts +5 -2
- package/dist/components/switch.mjs +7 -7
- package/dist/components/table.mjs +10 -10
- package/dist/components/tabs.d.mts +8 -5
- package/dist/components/tabs.mjs +18 -12
- package/dist/components/textarea.mjs +1 -1
- package/dist/components/toggle-group.d.mts +9 -6
- package/dist/components/toggle-group.mjs +19 -20
- package/dist/components/toggle.d.mts +2 -3
- package/dist/components/toggle.mjs +4 -6
- package/dist/components/tooltip.d.mts +7 -6
- package/dist/components/tooltip.mjs +19 -17
- package/dist/hooks/use-animated-value.mjs +0 -1
- package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
- package/dist/hooks/use-is-mobile.mjs +0 -1
- package/dist/hooks/use-media-query.mjs +0 -1
- package/dist/hooks/use-mutation-observer.mjs +0 -1
- package/dist/hooks/use-pagination.mjs +0 -1
- package/dist/index.d.mts +15 -13
- package/dist/index.mjs +18 -16
- package/dist/primitives/checkbox-group.d.mts +9 -10
- package/dist/primitives/checkbox-group.mjs +14 -19
- package/dist/primitives/input-number.d.mts +3 -3
- package/dist/primitives/input-number.mjs +3 -5
- package/dist/primitives/input.d.mts +4 -4
- package/dist/primitives/input.mjs +2 -3
- package/dist/primitives/progress-circle.d.mts +3 -3
- package/dist/primitives/progress-circle.mjs +2 -3
- package/dist/variants/alert.d.mts +1 -1
- package/dist/variants/alert.mjs +3 -13
- package/dist/variants/badge.d.mts +6 -4
- package/dist/variants/badge.mjs +7 -34
- package/dist/variants/button-group.d.mts +2 -2
- package/dist/variants/button-group.mjs +3 -14
- package/dist/variants/button.d.mts +12 -10
- package/dist/variants/button.mjs +15 -57
- package/dist/variants/empty.d.mts +1 -1
- package/dist/variants/empty.mjs +2 -7
- package/dist/variants/field.d.mts +3 -3
- package/dist/variants/field.mjs +4 -22
- package/dist/variants/input-group.d.mts +9 -9
- package/dist/variants/input-group.mjs +11 -70
- package/dist/variants/input-number.d.mts +45 -0
- package/dist/variants/input-number.mjs +40 -0
- package/dist/variants/item.d.mts +5 -4
- package/dist/variants/item.mjs +9 -31
- package/dist/variants/navigation-menu.d.mts +1 -1
- package/dist/variants/navigation-menu.mjs +1 -5
- package/dist/variants/progress-circle.d.mts +1 -1
- package/dist/variants/progress-circle.mjs +1 -5
- package/dist/variants/scroll-area.d.mts +2 -2
- package/dist/variants/scroll-area.mjs +3 -8
- package/dist/variants/separator.mjs +6 -6
- package/dist/variants/sheet.d.mts +4 -4
- package/dist/variants/sheet.mjs +5 -38
- package/dist/variants/sidebar.d.mts +4 -4
- package/dist/variants/sidebar.mjs +6 -23
- package/dist/variants/tabs.d.mts +18 -0
- package/dist/variants/tabs.mjs +15 -0
- package/dist/variants/toggle.d.mts +4 -4
- package/dist/variants/toggle.mjs +9 -27
- package/package.json +27 -44
- package/src/components/accordion.tsx +26 -68
- package/src/components/alert-dialog.tsx +70 -86
- package/src/components/alert.tsx +27 -19
- package/src/components/aspect-ratio.tsx +1 -4
- package/src/components/avatar.tsx +99 -12
- package/src/components/badge.tsx +5 -8
- package/src/components/breadcrumb.tsx +18 -24
- package/src/components/button-group.tsx +10 -20
- package/src/components/button.tsx +8 -19
- package/src/components/calendar.tsx +77 -132
- package/src/components/card.tsx +16 -22
- package/src/components/carousel.tsx +40 -58
- package/src/components/chart.tsx +41 -92
- package/src/components/checkbox-cards.tsx +11 -30
- package/src/components/checkbox-group.tsx +6 -28
- package/src/components/checkbox.tsx +6 -26
- package/src/components/collapsible.tsx +1 -4
- package/src/components/command.tsx +52 -65
- package/src/components/context-menu.tsx +46 -125
- package/src/components/dialog.tsx +49 -101
- package/src/components/direction.tsx +32 -0
- package/src/components/drawer.tsx +17 -79
- package/src/components/dropdown-menu.tsx +39 -118
- package/src/components/empty.tsx +6 -20
- package/src/components/field.tsx +19 -52
- package/src/components/form.tsx +19 -61
- package/src/components/hover-card.tsx +4 -27
- package/src/components/input-group.tsx +13 -52
- package/src/components/input-number.tsx +55 -75
- package/src/components/input-otp.tsx +19 -38
- package/src/components/input-password.tsx +5 -29
- package/src/components/input-search.tsx +6 -23
- package/src/components/input.tsx +1 -17
- package/src/components/item.tsx +17 -31
- package/src/components/kbd.tsx +2 -14
- package/src/components/label.tsx +2 -10
- package/src/components/menubar.tsx +34 -125
- package/src/components/native-select.tsx +21 -30
- package/src/components/navigation-menu.tsx +34 -94
- package/src/components/pagination.tsx +28 -34
- package/src/components/popover.tsx +66 -35
- package/src/components/progress-circle.tsx +7 -25
- package/src/components/progress.tsx +3 -16
- package/src/components/radio-cards.tsx +8 -27
- package/src/components/radio-group.tsx +7 -27
- package/src/components/radio.tsx +3 -24
- package/src/components/resizable.tsx +5 -26
- package/src/components/scroll-area.tsx +12 -32
- package/src/components/select.tsx +37 -60
- package/src/components/separator.tsx +4 -18
- package/src/components/sheet.tsx +37 -74
- package/src/components/sidebar.tsx +47 -177
- package/src/components/skeleton.tsx +1 -3
- package/src/components/slider.tsx +7 -36
- package/src/components/sonner.tsx +16 -6
- package/src/components/spinner.tsx +6 -15
- package/src/components/switch.tsx +8 -30
- package/src/components/table.tsx +18 -35
- package/src/components/tabs.tsx +16 -34
- package/src/components/textarea.tsx +1 -15
- package/src/components/toggle-group.tsx +34 -38
- package/src/components/toggle.tsx +4 -13
- package/src/components/tooltip.tsx +11 -37
- package/src/css/foundation/base.css +74 -0
- package/src/css/foundation/motion.css +69 -0
- package/src/css/foundation/source.css +10 -0
- package/src/css/foundation/tokens.css +107 -0
- package/src/css/foundation/variants.css +121 -0
- package/src/css/preset.css +13 -214
- package/src/css/style.css +9 -1
- package/src/css/{amber.css → themes/amber.css} +29 -0
- package/src/css/{blue.css → themes/blue.css} +29 -0
- package/src/css/{cyan.css → themes/cyan.css} +29 -0
- package/src/css/{emerald.css → themes/emerald.css} +29 -0
- package/src/css/{fuchsia.css → themes/fuchsia.css} +29 -0
- package/src/css/{gray.css → themes/gray.css} +29 -0
- package/src/css/{green.css → themes/green.css} +29 -0
- package/src/css/{indigo.css → themes/indigo.css} +29 -0
- package/src/css/{lime.css → themes/lime.css} +29 -0
- package/src/css/{neutral.css → themes/neutral.css} +29 -0
- package/src/css/{orange.css → themes/orange.css} +29 -0
- package/src/css/{pink.css → themes/pink.css} +29 -0
- package/src/css/{purple.css → themes/purple.css} +29 -0
- package/src/css/{red.css → themes/red.css} +29 -0
- package/src/css/{rose.css → themes/rose.css} +29 -0
- package/src/css/{sky.css → themes/sky.css} +29 -0
- package/src/css/{slate.css → themes/slate.css} +29 -0
- package/src/css/{stone.css → themes/stone.css} +29 -0
- package/src/css/{teal.css → themes/teal.css} +29 -0
- package/src/css/{violet.css → themes/violet.css} +29 -0
- package/src/css/{yellow.css → themes/yellow.css} +29 -0
- package/src/css/{zinc.css → themes/zinc.css} +29 -0
- package/src/hooks/use-animated-value.ts +1 -7
- package/src/hooks/use-copy-to-clipboard.ts +1 -6
- package/src/hooks/use-is-mobile.ts +0 -2
- package/src/hooks/use-media-query.ts +0 -2
- package/src/hooks/use-mutation-observer.ts +0 -3
- package/src/hooks/use-pagination.ts +0 -2
- package/src/index.ts +39 -80
- package/src/primitives/checkbox-group.tsx +25 -39
- package/src/primitives/input-number.tsx +17 -63
- package/src/primitives/input.tsx +8 -24
- package/src/primitives/progress-circle.tsx +13 -43
- package/src/variants/alert.ts +3 -14
- package/src/variants/badge.ts +8 -35
- package/src/variants/button-group.ts +5 -18
- package/src/variants/button.ts +21 -58
- package/src/variants/empty.ts +2 -11
- package/src/variants/field.ts +6 -19
- package/src/variants/input-group.ts +12 -64
- package/src/variants/input-number.ts +65 -0
- package/src/variants/item.ts +10 -32
- package/src/variants/navigation-menu.ts +1 -8
- package/src/variants/progress-circle.ts +1 -2
- package/src/variants/scroll-area.ts +3 -9
- package/src/variants/separator.ts +6 -7
- package/src/variants/sheet.ts +6 -39
- package/src/variants/sidebar.ts +7 -27
- package/src/variants/tabs.ts +34 -0
- package/src/variants/toggle.ts +9 -28
package/src/components/sheet.tsx
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { XIcon } from "lucide-react";
|
|
2
|
+
import { Dialog as SheetPrimitive } from "radix-ui";
|
|
3
|
+
import type { ComponentProps, JSX } from "react";
|
|
2
4
|
|
|
5
|
+
import { cn } from "#/lib/utils";
|
|
3
6
|
import type { ButtonVariants } from "#/variants/button";
|
|
4
7
|
import { buttonVariants } from "#/variants/button";
|
|
5
8
|
import type { SheetContentVariants } from "#/variants/sheet";
|
|
6
9
|
import { sheetContentVariants } from "#/variants/sheet";
|
|
7
|
-
import type { ComponentProps, JSX } from "react";
|
|
8
|
-
|
|
9
|
-
import { cn } from "#/lib/utils";
|
|
10
|
-
import * as SheetPrimitive from "@radix-ui/react-dialog";
|
|
11
|
-
import { XIcon } from "lucide-react";
|
|
12
10
|
|
|
13
11
|
/* -----------------------------------------------------------------------------
|
|
14
12
|
* Component: Sheet
|
|
@@ -22,12 +20,8 @@ type SheetProps = ComponentProps<typeof SheetPrimitive.Root>;
|
|
|
22
20
|
/**
|
|
23
21
|
* @since 0.3.16-canary.0
|
|
24
22
|
*/
|
|
25
|
-
function Sheet({
|
|
26
|
-
return
|
|
27
|
-
<SheetPrimitive.Root data-slot="sheet" {...props}>
|
|
28
|
-
{children}
|
|
29
|
-
</SheetPrimitive.Root>
|
|
30
|
-
);
|
|
23
|
+
function Sheet({ ...props }: SheetProps): JSX.Element {
|
|
24
|
+
return <SheetPrimitive.Root data-slot="sheet" {...props} />;
|
|
31
25
|
}
|
|
32
26
|
|
|
33
27
|
/* -----------------------------------------------------------------------------
|
|
@@ -53,13 +47,8 @@ function SheetTrigger({ ...props }: SheetTriggerProps): JSX.Element {
|
|
|
53
47
|
/**
|
|
54
48
|
* @since 0.3.16-canary.0
|
|
55
49
|
*/
|
|
56
|
-
interface SheetContentProps
|
|
57
|
-
|
|
58
|
-
classNames?: {
|
|
59
|
-
close?: string;
|
|
60
|
-
content?: string;
|
|
61
|
-
overlay?: string;
|
|
62
|
-
};
|
|
50
|
+
interface SheetContentProps extends ComponentProps<typeof SheetPrimitive.Content>, SheetContentVariants {
|
|
51
|
+
showCloseButton?: boolean;
|
|
63
52
|
}
|
|
64
53
|
|
|
65
54
|
/**
|
|
@@ -68,40 +57,38 @@ interface SheetContentProps
|
|
|
68
57
|
function SheetContent({
|
|
69
58
|
children,
|
|
70
59
|
className,
|
|
71
|
-
|
|
60
|
+
showCloseButton = true,
|
|
72
61
|
side = "right",
|
|
73
62
|
...props
|
|
74
63
|
}: SheetContentProps): JSX.Element {
|
|
75
64
|
return (
|
|
76
|
-
<SheetPrimitive.Portal>
|
|
65
|
+
<SheetPrimitive.Portal data-slot="sheet-portal">
|
|
77
66
|
<SheetPrimitive.Overlay
|
|
78
|
-
className={
|
|
79
|
-
"fixed inset-0 z-50"
|
|
80
|
-
|
|
81
|
-
"ease-gentle data-open:animate-in data-open:animation-duration-380 data-open:fade-in-0",
|
|
82
|
-
"data-closed:animate-out data-closed:animation-duration-280 data-closed:fade-out-0",
|
|
83
|
-
"motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
|
|
84
|
-
classNames?.overlay,
|
|
85
|
-
)}
|
|
67
|
+
className={
|
|
68
|
+
"fixed inset-0 z-50 bg-black/10 ease-gentle supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:animation-duration-panel-in data-open:fade-in-0 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-panel-out data-closed:fade-out-0"
|
|
69
|
+
}
|
|
86
70
|
data-slot="sheet-overlay"
|
|
87
71
|
/>
|
|
88
72
|
<SheetPrimitive.Content
|
|
89
|
-
className={sheetContentVariants({ className
|
|
73
|
+
className={sheetContentVariants({ className, side })}
|
|
74
|
+
data-side={side}
|
|
90
75
|
data-slot="sheet-content"
|
|
91
76
|
{...props}
|
|
92
77
|
>
|
|
93
78
|
{children}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
className
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
79
|
+
{showCloseButton ? (
|
|
80
|
+
<SheetPrimitive.Close
|
|
81
|
+
className={buttonVariants({
|
|
82
|
+
className: "absolute top-4 end-4",
|
|
83
|
+
size: "icon-sm",
|
|
84
|
+
variant: "ghost",
|
|
85
|
+
})}
|
|
86
|
+
data-slot="sheet-close"
|
|
87
|
+
>
|
|
88
|
+
<XIcon />
|
|
89
|
+
<span className="sr-only">Close</span>
|
|
90
|
+
</SheetPrimitive.Close>
|
|
91
|
+
) : null}
|
|
105
92
|
</SheetPrimitive.Content>
|
|
106
93
|
</SheetPrimitive.Portal>
|
|
107
94
|
);
|
|
@@ -120,17 +107,7 @@ type SheetHeaderProps = ComponentProps<"div">;
|
|
|
120
107
|
* @since 0.3.16-canary.0
|
|
121
108
|
*/
|
|
122
109
|
function SheetHeader({ className, ...props }: SheetHeaderProps): JSX.Element {
|
|
123
|
-
return (
|
|
124
|
-
<header
|
|
125
|
-
className={cn(
|
|
126
|
-
"flex shrink-0 flex-col gap-1.5 px-6 pt-6 pb-4 text-center",
|
|
127
|
-
"sm:text-left",
|
|
128
|
-
className,
|
|
129
|
-
)}
|
|
130
|
-
data-slot="sheet-header"
|
|
131
|
-
{...props}
|
|
132
|
-
/>
|
|
133
|
-
);
|
|
110
|
+
return <div className={cn("flex shrink-0 flex-col gap-1.5 p-4", className)} data-slot="sheet-header" {...props} />;
|
|
134
111
|
}
|
|
135
112
|
|
|
136
113
|
/* -----------------------------------------------------------------------------
|
|
@@ -138,6 +115,10 @@ function SheetHeader({ className, ...props }: SheetHeaderProps): JSX.Element {
|
|
|
138
115
|
* -------------------------------------------------------------------------- */
|
|
139
116
|
|
|
140
117
|
/**
|
|
118
|
+
* Optional scrollable region for long content. When used, the Header and Footer
|
|
119
|
+
* stay pinned (shrink-0) and only this body scrolls. A codefast enhancement over
|
|
120
|
+
* radix-vega.
|
|
121
|
+
*
|
|
141
122
|
* @since 0.3.16-canary.0
|
|
142
123
|
*/
|
|
143
124
|
type SheetBodyProps = ComponentProps<"div">;
|
|
@@ -146,13 +127,7 @@ type SheetBodyProps = ComponentProps<"div">;
|
|
|
146
127
|
* @since 0.3.16-canary.0
|
|
147
128
|
*/
|
|
148
129
|
function SheetBody({ className, ...props }: SheetBodyProps): JSX.Element {
|
|
149
|
-
return (
|
|
150
|
-
<main
|
|
151
|
-
className={cn("overflow-auto", "px-6 py-2", className)}
|
|
152
|
-
data-slot="sheet-body"
|
|
153
|
-
{...props}
|
|
154
|
-
/>
|
|
155
|
-
);
|
|
130
|
+
return <div className={cn("min-h-0 flex-1 overflow-y-auto px-4", className)} data-slot="sheet-body" {...props} />;
|
|
156
131
|
}
|
|
157
132
|
|
|
158
133
|
/* -----------------------------------------------------------------------------
|
|
@@ -169,15 +144,7 @@ type SheetFooterProps = ComponentProps<"div">;
|
|
|
169
144
|
*/
|
|
170
145
|
function SheetFooter({ className, ...props }: SheetFooterProps): JSX.Element {
|
|
171
146
|
return (
|
|
172
|
-
<footer
|
|
173
|
-
className={cn(
|
|
174
|
-
"flex shrink-0 flex-col-reverse gap-2 px-6 pt-4 pb-6",
|
|
175
|
-
"sm:flex-row sm:justify-end",
|
|
176
|
-
className,
|
|
177
|
-
)}
|
|
178
|
-
data-slot="sheet-footer"
|
|
179
|
-
{...props}
|
|
180
|
-
/>
|
|
147
|
+
<div className={cn("mt-auto flex shrink-0 flex-col gap-2 p-4", className)} data-slot="sheet-footer" {...props} />
|
|
181
148
|
);
|
|
182
149
|
}
|
|
183
150
|
|
|
@@ -196,7 +163,7 @@ type SheetTitleProps = ComponentProps<typeof SheetPrimitive.Title>;
|
|
|
196
163
|
function SheetTitle({ className, ...props }: SheetTitleProps): JSX.Element {
|
|
197
164
|
return (
|
|
198
165
|
<SheetPrimitive.Title
|
|
199
|
-
className={cn("
|
|
166
|
+
className={cn("font-heading font-medium text-foreground", className)}
|
|
200
167
|
data-slot="sheet-title"
|
|
201
168
|
{...props}
|
|
202
169
|
/>
|
|
@@ -242,11 +209,7 @@ interface SheetCloseProps extends ComponentProps<typeof SheetPrimitive.Close> {
|
|
|
242
209
|
*/
|
|
243
210
|
function SheetClose({ className, size, variant, ...props }: SheetCloseProps): JSX.Element {
|
|
244
211
|
return (
|
|
245
|
-
<SheetPrimitive.Close
|
|
246
|
-
className={buttonVariants({ className, size, variant })}
|
|
247
|
-
data-slot="sheet-close"
|
|
248
|
-
{...props}
|
|
249
|
-
/>
|
|
212
|
+
<SheetPrimitive.Close className={buttonVariants({ className, size, variant })} data-slot="sheet-close" {...props} />
|
|
250
213
|
);
|
|
251
214
|
}
|
|
252
215
|
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import type { SidebarMenuButtonVariants } from "#/variants/sidebar";
|
|
4
|
-
import type { ComponentProps, CSSProperties, Dispatch, JSX, SetStateAction } from "react";
|
|
5
|
-
|
|
6
|
-
import { cn } from "#/lib/utils";
|
|
7
|
-
|
|
8
|
-
import { sidebarMenuButtonVariants } from "#/variants/sidebar";
|
|
9
|
-
import { createContext } from "@radix-ui/react-context";
|
|
10
|
-
import { Slot } from "@radix-ui/react-slot";
|
|
11
1
|
import { PanelLeftIcon } from "lucide-react";
|
|
2
|
+
import { Slot } from "radix-ui";
|
|
3
|
+
import { Context } from "radix-ui/internal";
|
|
4
|
+
import type { ComponentProps, CSSProperties, Dispatch, JSX, SetStateAction } from "react";
|
|
12
5
|
import { useCallback, useEffect, useState } from "react";
|
|
13
6
|
|
|
14
7
|
import { Button } from "#/components/button";
|
|
@@ -18,6 +11,9 @@ import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "
|
|
|
18
11
|
import { Skeleton } from "#/components/skeleton";
|
|
19
12
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "#/components/tooltip";
|
|
20
13
|
import { useIsMobile } from "#/hooks/use-is-mobile";
|
|
14
|
+
import { cn } from "#/lib/utils";
|
|
15
|
+
import type { SidebarMenuButtonVariants } from "#/variants/sidebar";
|
|
16
|
+
import { sidebarMenuButtonVariants } from "#/variants/sidebar";
|
|
21
17
|
|
|
22
18
|
const SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
23
19
|
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
@@ -42,8 +38,7 @@ interface SidebarContextValue {
|
|
|
42
38
|
|
|
43
39
|
const SIDEBAR_PROVIDER_NAME = "SidebarProvider";
|
|
44
40
|
|
|
45
|
-
const [SidebarContextProvider, useSidebar] =
|
|
46
|
-
createContext<SidebarContextValue>(SIDEBAR_PROVIDER_NAME);
|
|
41
|
+
const [SidebarContextProvider, useSidebar] = Context.createContext<SidebarContextValue>(SIDEBAR_PROVIDER_NAME);
|
|
47
42
|
|
|
48
43
|
/* -----------------------------------------------------------------------------
|
|
49
44
|
* Component: SidebarProvider
|
|
@@ -134,11 +129,7 @@ function SidebarProvider({
|
|
|
134
129
|
>
|
|
135
130
|
<TooltipProvider delayDuration={0}>
|
|
136
131
|
<div
|
|
137
|
-
className={cn(
|
|
138
|
-
"group/sidebar-wrapper flex min-h-svh w-full",
|
|
139
|
-
"has-data-[variant=inset]:bg-sidebar",
|
|
140
|
-
className,
|
|
141
|
-
)}
|
|
132
|
+
className={cn("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", className)}
|
|
142
133
|
data-slot="sidebar-wrapper"
|
|
143
134
|
style={
|
|
144
135
|
{
|
|
@@ -187,11 +178,7 @@ function Sidebar({
|
|
|
187
178
|
if (collapsible === "none") {
|
|
188
179
|
return (
|
|
189
180
|
<div
|
|
190
|
-
className={cn(
|
|
191
|
-
"flex h-full w-(--sidebar-width) flex-col",
|
|
192
|
-
"bg-sidebar text-sidebar-foreground",
|
|
193
|
-
className,
|
|
194
|
-
)}
|
|
181
|
+
className={cn("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", className)}
|
|
195
182
|
data-slot="sidebar"
|
|
196
183
|
{...props}
|
|
197
184
|
>
|
|
@@ -204,11 +191,7 @@ function Sidebar({
|
|
|
204
191
|
return (
|
|
205
192
|
<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
|
|
206
193
|
<SheetContent
|
|
207
|
-
className=
|
|
208
|
-
"w-(--sidebar-width) p-0",
|
|
209
|
-
"bg-sidebar text-sidebar-foreground",
|
|
210
|
-
"[&>button]:hidden",
|
|
211
|
-
)}
|
|
194
|
+
className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
|
|
212
195
|
data-mobile="true"
|
|
213
196
|
data-sidebar="sidebar"
|
|
214
197
|
data-slot="sidebar"
|
|
@@ -231,7 +214,7 @@ function Sidebar({
|
|
|
231
214
|
|
|
232
215
|
return (
|
|
233
216
|
<div
|
|
234
|
-
className={cn("group peer hidden
|
|
217
|
+
className={cn("group peer hidden text-sidebar-foreground md:block", className)}
|
|
235
218
|
data-collapsible={state === "collapsed" ? collapsible : ""}
|
|
236
219
|
data-side={side}
|
|
237
220
|
data-slot="sidebar"
|
|
@@ -241,13 +224,7 @@ function Sidebar({
|
|
|
241
224
|
{/* This is what handles the sidebar gap on desktop */}
|
|
242
225
|
<div
|
|
243
226
|
className={cn(
|
|
244
|
-
"relative",
|
|
245
|
-
"w-(--sidebar-width)",
|
|
246
|
-
"bg-transparent",
|
|
247
|
-
"transition-[width] duration-200 ease-linear",
|
|
248
|
-
"motion-reduce:transition-none motion-reduce:duration-0",
|
|
249
|
-
"group-data-[collapsible=offcanvas]:w-0",
|
|
250
|
-
"group-data-side-right:rotate-180",
|
|
227
|
+
"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-gentle group-data-[collapsible=offcanvas]:w-0 group-data-side-right:rotate-180",
|
|
251
228
|
variant === "floating" || variant === "inset"
|
|
252
229
|
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]"
|
|
253
230
|
: "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
|
|
@@ -256,28 +233,18 @@ function Sidebar({
|
|
|
256
233
|
/>
|
|
257
234
|
<div
|
|
258
235
|
className={cn(
|
|
259
|
-
"fixed inset-y-0 z-10 hidden",
|
|
260
|
-
"h-svh w-(--sidebar-width)",
|
|
261
|
-
"transition-[left,right,width] duration-200 ease-linear",
|
|
262
|
-
"motion-reduce:transition-none motion-reduce:duration-0",
|
|
263
|
-
"md:flex",
|
|
264
|
-
side === "left"
|
|
265
|
-
? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
|
|
266
|
-
: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
236
|
+
"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-gentle md:flex data-side-right:right-0 data-side-right:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] data-side-left:left-0 data-side-left:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]",
|
|
267
237
|
variant === "floating" || variant === "inset"
|
|
268
238
|
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
|
|
269
239
|
: "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-side-right:border-l group-data-side-left:border-r",
|
|
270
240
|
className,
|
|
271
241
|
)}
|
|
242
|
+
data-side={side}
|
|
272
243
|
data-slot="sidebar-container"
|
|
273
244
|
{...props}
|
|
274
245
|
>
|
|
275
246
|
<div
|
|
276
|
-
className=
|
|
277
|
-
"flex h-full w-full flex-col",
|
|
278
|
-
"bg-sidebar",
|
|
279
|
-
"group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm",
|
|
280
|
-
)}
|
|
247
|
+
className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border"
|
|
281
248
|
data-sidebar="sidebar"
|
|
282
249
|
data-slot="sidebar-inner"
|
|
283
250
|
>
|
|
@@ -302,15 +269,14 @@ type SidebarTriggerProps = ComponentProps<typeof Button>;
|
|
|
302
269
|
/**
|
|
303
270
|
* @since 0.3.16-canary.0
|
|
304
271
|
*/
|
|
305
|
-
function SidebarTrigger({
|
|
272
|
+
function SidebarTrigger({ onClick, ...props }: SidebarTriggerProps): JSX.Element {
|
|
306
273
|
const { toggleSidebar } = useSidebar(SIDEBAR_TRIGGER_NAME);
|
|
307
274
|
|
|
308
275
|
return (
|
|
309
276
|
<Button
|
|
310
|
-
className={cn("size-7", className)}
|
|
311
277
|
data-sidebar="trigger"
|
|
312
278
|
data-slot="sidebar-trigger"
|
|
313
|
-
size="icon"
|
|
279
|
+
size="icon-sm"
|
|
314
280
|
variant="ghost"
|
|
315
281
|
onClick={(event) => {
|
|
316
282
|
onClick?.(event);
|
|
@@ -318,7 +284,7 @@ function SidebarTrigger({ className, onClick, ...props }: SidebarTriggerProps):
|
|
|
318
284
|
}}
|
|
319
285
|
{...props}
|
|
320
286
|
>
|
|
321
|
-
<PanelLeftIcon />
|
|
287
|
+
<PanelLeftIcon className="rtl:rotate-180" />
|
|
322
288
|
<span className="sr-only">Toggle Sidebar</span>
|
|
323
289
|
</Button>
|
|
324
290
|
);
|
|
@@ -344,23 +310,7 @@ function SidebarRail({ className, ...props }: SidebarRailProps): JSX.Element {
|
|
|
344
310
|
return (
|
|
345
311
|
<button
|
|
346
312
|
className={cn(
|
|
347
|
-
"absolute inset-y-0 z-20 hidden",
|
|
348
|
-
"w-4 -translate-x-1/2 transition-all ease-linear",
|
|
349
|
-
"motion-reduce:transition-none",
|
|
350
|
-
"in-data-side-right:cursor-e-resize",
|
|
351
|
-
"in-data-side-left:cursor-w-resize",
|
|
352
|
-
"group-data-[collapsible=offcanvas]:translate-x-0",
|
|
353
|
-
"group-data-side-right:left-0",
|
|
354
|
-
"group-data-side-left:-right-4",
|
|
355
|
-
"after:absolute after:inset-y-0 after:left-1/2 after:w-0.5",
|
|
356
|
-
"group-data-[collapsible=offcanvas]:after:left-full",
|
|
357
|
-
"hover:group-data-[collapsible=offcanvas]:bg-sidebar",
|
|
358
|
-
"hover:after:bg-sidebar-border",
|
|
359
|
-
"sm:flex",
|
|
360
|
-
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
|
|
361
|
-
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize",
|
|
362
|
-
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
|
|
363
|
-
"[[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
|
|
313
|
+
"absolute inset-y-0 z-20 hidden w-4 transition-all ease-gentle group-data-[collapsible=offcanvas]:translate-x-0 group-data-side-right:left-0 group-data-side-left:-right-4 after:absolute after:inset-y-0 after:inset-s-1/2 after:w-0.5 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar hover:after:bg-sidebar-border in-data-side-right:cursor-e-resize in-data-side-left:cursor-w-resize sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 rtl:group-data-[collapsible=offcanvas]:-translate-x-0 rtl:in-data-side-right:cursor-w-resize rtl:in-data-side-left:cursor-e-resize [[data-side=left][data-collapsible=offcanvas]_&]:-right-2 [[data-side=left][data-state=collapsed]_&]:cursor-e-resize rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize [[data-side=right][data-collapsible=offcanvas]_&]:-left-2 [[data-side=right][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-e-resize",
|
|
364
314
|
className,
|
|
365
315
|
)}
|
|
366
316
|
data-sidebar="rail"
|
|
@@ -389,10 +339,7 @@ function SidebarInset({ className, ...props }: SidebarInsetProps): JSX.Element {
|
|
|
389
339
|
return (
|
|
390
340
|
<main
|
|
391
341
|
className={cn(
|
|
392
|
-
"relative flex w-full
|
|
393
|
-
"bg-background",
|
|
394
|
-
"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm",
|
|
395
|
-
"md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",
|
|
342
|
+
"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-collapsed:ms-2",
|
|
396
343
|
className,
|
|
397
344
|
)}
|
|
398
345
|
data-slot="sidebar-inset"
|
|
@@ -416,7 +363,7 @@ type SidebarInputProps = ComponentProps<typeof Input>;
|
|
|
416
363
|
function SidebarInput({ className, ...props }: SidebarInputProps): JSX.Element {
|
|
417
364
|
return (
|
|
418
365
|
<Input
|
|
419
|
-
className={cn("h-8 w-full
|
|
366
|
+
className={cn("h-8 w-full bg-background shadow-none", className)}
|
|
420
367
|
data-sidebar="input"
|
|
421
368
|
data-slot="sidebar-input"
|
|
422
369
|
{...props}
|
|
@@ -439,7 +386,7 @@ type SidebarHeaderProps = ComponentProps<"div">;
|
|
|
439
386
|
function SidebarHeader({ className, ...props }: SidebarHeaderProps): JSX.Element {
|
|
440
387
|
return (
|
|
441
388
|
<div
|
|
442
|
-
className={cn("flex flex-col gap-2
|
|
389
|
+
className={cn("flex flex-col gap-2 p-2", className)}
|
|
443
390
|
data-sidebar="header"
|
|
444
391
|
data-slot="sidebar-header"
|
|
445
392
|
{...props}
|
|
@@ -462,7 +409,7 @@ type SidebarFooterProps = ComponentProps<"div">;
|
|
|
462
409
|
function SidebarFooter({ className, ...props }: SidebarFooterProps): JSX.Element {
|
|
463
410
|
return (
|
|
464
411
|
<div
|
|
465
|
-
className={cn("flex flex-col gap-2
|
|
412
|
+
className={cn("flex flex-col gap-2 p-2", className)}
|
|
466
413
|
data-sidebar="footer"
|
|
467
414
|
data-slot="sidebar-footer"
|
|
468
415
|
{...props}
|
|
@@ -485,7 +432,7 @@ type SidebarSeparatorProps = ComponentProps<typeof Separator>;
|
|
|
485
432
|
function SidebarSeparator({ className, ...props }: SidebarSeparatorProps): JSX.Element {
|
|
486
433
|
return (
|
|
487
434
|
<Separator
|
|
488
|
-
className={cn("mx-2 w-auto
|
|
435
|
+
className={cn("mx-2 w-auto bg-sidebar-border", className)}
|
|
489
436
|
data-sidebar="separator"
|
|
490
437
|
data-slot="sidebar-separator"
|
|
491
438
|
{...props}
|
|
@@ -509,8 +456,7 @@ function SidebarContent({ className, ...props }: SidebarContentProps): JSX.Eleme
|
|
|
509
456
|
return (
|
|
510
457
|
<div
|
|
511
458
|
className={cn(
|
|
512
|
-
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto",
|
|
513
|
-
"group-data-[collapsible=icon]:overflow-hidden",
|
|
459
|
+
"flex min-h-0 flex-1 scrollbar-none flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
|
|
514
460
|
className,
|
|
515
461
|
)}
|
|
516
462
|
data-sidebar="content"
|
|
@@ -535,7 +481,7 @@ type SidebarGroupProps = ComponentProps<"div">;
|
|
|
535
481
|
function SidebarGroup({ className, ...props }: SidebarGroupProps): JSX.Element {
|
|
536
482
|
return (
|
|
537
483
|
<div
|
|
538
|
-
className={cn("relative flex w-full min-w-0 flex-col
|
|
484
|
+
className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
|
|
539
485
|
data-sidebar="group"
|
|
540
486
|
data-slot="sidebar-group"
|
|
541
487
|
{...props}
|
|
@@ -557,24 +503,13 @@ interface SidebarGroupLabelProps extends ComponentProps<"div"> {
|
|
|
557
503
|
/**
|
|
558
504
|
* @since 0.3.16-canary.0
|
|
559
505
|
*/
|
|
560
|
-
function SidebarGroupLabel({
|
|
561
|
-
|
|
562
|
-
className,
|
|
563
|
-
...props
|
|
564
|
-
}: SidebarGroupLabelProps): JSX.Element {
|
|
565
|
-
const Component = asChild ? Slot : "div";
|
|
506
|
+
function SidebarGroupLabel({ asChild = false, className, ...props }: SidebarGroupLabelProps): JSX.Element {
|
|
507
|
+
const Component = asChild ? Slot.Root : "div";
|
|
566
508
|
|
|
567
509
|
return (
|
|
568
510
|
<Component
|
|
569
511
|
className={cn(
|
|
570
|
-
"flex h-8 shrink-0 items-center px-2",
|
|
571
|
-
"rounded-md ring-sidebar-ring outline-hidden",
|
|
572
|
-
"truncate text-xs font-medium text-sidebar-foreground/70",
|
|
573
|
-
"transition-[margin,opacity] duration-200 ease-linear",
|
|
574
|
-
"motion-reduce:transition-none motion-reduce:duration-0",
|
|
575
|
-
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
|
|
576
|
-
"focus-visible:ring-3",
|
|
577
|
-
"[&>svg]:size-4 [&>svg]:shrink-0",
|
|
512
|
+
"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-gentle group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
578
513
|
className,
|
|
579
514
|
)}
|
|
580
515
|
data-sidebar="group-label"
|
|
@@ -598,27 +533,13 @@ interface SidebarGroupActionProps extends ComponentProps<"button"> {
|
|
|
598
533
|
/**
|
|
599
534
|
* @since 0.3.16-canary.0
|
|
600
535
|
*/
|
|
601
|
-
function SidebarGroupAction({
|
|
602
|
-
|
|
603
|
-
className,
|
|
604
|
-
...props
|
|
605
|
-
}: SidebarGroupActionProps): JSX.Element {
|
|
606
|
-
const Component = asChild ? Slot : "button";
|
|
536
|
+
function SidebarGroupAction({ asChild = false, className, ...props }: SidebarGroupActionProps): JSX.Element {
|
|
537
|
+
const Component = asChild ? Slot.Root : "button";
|
|
607
538
|
|
|
608
539
|
return (
|
|
609
540
|
<Component
|
|
610
541
|
className={cn(
|
|
611
|
-
"absolute top-3.5
|
|
612
|
-
"rounded-md ring-sidebar-ring outline-hidden",
|
|
613
|
-
"text-sidebar-foreground",
|
|
614
|
-
"transition-transform",
|
|
615
|
-
"motion-reduce:transition-none",
|
|
616
|
-
"group-data-[collapsible=icon]:hidden",
|
|
617
|
-
"after:absolute after:-inset-2",
|
|
618
|
-
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
619
|
-
"focus-visible:ring-3",
|
|
620
|
-
"md:after:hidden",
|
|
621
|
-
"[&>svg]:size-4 [&>svg]:shrink-0",
|
|
542
|
+
"absolute end-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
|
|
622
543
|
className,
|
|
623
544
|
)}
|
|
624
545
|
data-sidebar="group-action"
|
|
@@ -643,7 +564,7 @@ type SidebarGroupContentProps = ComponentProps<"div">;
|
|
|
643
564
|
function SidebarGroupContent({ className, ...props }: SidebarGroupContentProps): JSX.Element {
|
|
644
565
|
return (
|
|
645
566
|
<div
|
|
646
|
-
className={cn("w-full
|
|
567
|
+
className={cn("w-full text-sm", className)}
|
|
647
568
|
data-sidebar="group-content"
|
|
648
569
|
data-slot="sidebar-group-content"
|
|
649
570
|
{...props}
|
|
@@ -719,17 +640,17 @@ function SidebarMenuButton({
|
|
|
719
640
|
asChild = false,
|
|
720
641
|
className,
|
|
721
642
|
isActive = false,
|
|
722
|
-
size = "
|
|
643
|
+
size = "default",
|
|
723
644
|
tooltip,
|
|
724
645
|
variant = "default",
|
|
725
646
|
...props
|
|
726
647
|
}: SidebarMenuButtonProps): JSX.Element {
|
|
727
|
-
const Component = asChild ? Slot : "button";
|
|
648
|
+
const Component = asChild ? Slot.Root : "button";
|
|
728
649
|
const { isMobile, state } = useSidebar(SIDEBAR_MENU_BUTTON_NAME);
|
|
729
650
|
|
|
730
651
|
const button = (
|
|
731
652
|
<Component
|
|
732
|
-
className={
|
|
653
|
+
className={sidebarMenuButtonVariants({ size, variant, className })}
|
|
733
654
|
data-active={isActive}
|
|
734
655
|
data-sidebar="menu-button"
|
|
735
656
|
data-size={size}
|
|
@@ -751,12 +672,7 @@ function SidebarMenuButton({
|
|
|
751
672
|
return (
|
|
752
673
|
<Tooltip>
|
|
753
674
|
<TooltipTrigger asChild>{button}</TooltipTrigger>
|
|
754
|
-
<TooltipContent
|
|
755
|
-
align="center"
|
|
756
|
-
hidden={state !== "collapsed" || isMobile}
|
|
757
|
-
side="right"
|
|
758
|
-
{...tooltip}
|
|
759
|
-
/>
|
|
675
|
+
<TooltipContent align="center" hidden={state !== "collapsed" || isMobile} side="right" {...tooltip} />
|
|
760
676
|
</Tooltip>
|
|
761
677
|
);
|
|
762
678
|
}
|
|
@@ -782,28 +698,14 @@ function SidebarMenuAction({
|
|
|
782
698
|
showOnHover = false,
|
|
783
699
|
...props
|
|
784
700
|
}: SidebarMenuActionProps): JSX.Element {
|
|
785
|
-
const Component = asChild ? Slot : "button";
|
|
701
|
+
const Component = asChild ? Slot.Root : "button";
|
|
786
702
|
|
|
787
703
|
return (
|
|
788
704
|
<Component
|
|
789
705
|
className={cn(
|
|
790
|
-
"absolute top-1.5
|
|
791
|
-
"rounded-md ring-sidebar-ring outline-hidden",
|
|
792
|
-
"text-sidebar-foreground",
|
|
793
|
-
"transition-transform",
|
|
794
|
-
"motion-reduce:transition-none",
|
|
795
|
-
"group-data-[collapsible=icon]:hidden",
|
|
796
|
-
"peer-hover/menu-button:text-sidebar-accent-foreground",
|
|
797
|
-
"peer-data-[size=default]/menu-button:top-1.5",
|
|
798
|
-
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
799
|
-
"peer-data-[size=sm]/menu-button:top-1",
|
|
800
|
-
"after:absolute after:-inset-2",
|
|
801
|
-
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
802
|
-
"focus-visible:ring-3",
|
|
803
|
-
"md:after:hidden",
|
|
804
|
-
"[&>svg]:size-4 [&>svg]:shrink-0",
|
|
706
|
+
"absolute end-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
|
|
805
707
|
showOnHover &&
|
|
806
|
-
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground
|
|
708
|
+
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0",
|
|
807
709
|
className,
|
|
808
710
|
)}
|
|
809
711
|
data-sidebar="menu-action"
|
|
@@ -829,16 +731,7 @@ function SidebarMenuBadge({ className, ...props }: SidebarMenuBadgeProps): JSX.E
|
|
|
829
731
|
return (
|
|
830
732
|
<div
|
|
831
733
|
className={cn(
|
|
832
|
-
"absolute
|
|
833
|
-
"rounded-md",
|
|
834
|
-
"text-xs font-medium text-sidebar-foreground tabular-nums",
|
|
835
|
-
"pointer-events-none select-none",
|
|
836
|
-
"group-data-[collapsible=icon]:hidden",
|
|
837
|
-
"peer-hover/menu-button:text-sidebar-accent-foreground",
|
|
838
|
-
"peer-data-[size=default]/menu-button:top-1.5",
|
|
839
|
-
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
840
|
-
"peer-data-[size=sm]/menu-button:top-1",
|
|
841
|
-
"peer-data-active/menu-button:text-sidebar-accent-foreground",
|
|
734
|
+
"pointer-events-none absolute end-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground",
|
|
842
735
|
className,
|
|
843
736
|
)}
|
|
844
737
|
data-sidebar="menu-badge"
|
|
@@ -862,24 +755,18 @@ interface SidebarMenuSkeletonProps extends ComponentProps<"div"> {
|
|
|
862
755
|
/**
|
|
863
756
|
* @since 0.3.16-canary.0
|
|
864
757
|
*/
|
|
865
|
-
function SidebarMenuSkeleton({
|
|
866
|
-
className,
|
|
867
|
-
showIcon = false,
|
|
868
|
-
...props
|
|
869
|
-
}: SidebarMenuSkeletonProps): JSX.Element {
|
|
758
|
+
function SidebarMenuSkeleton({ className, showIcon = false, ...props }: SidebarMenuSkeletonProps): JSX.Element {
|
|
870
759
|
// Random width between 50 to 90% - use useState with lazy initializer to avoid calling Math.random during render
|
|
871
760
|
const [width] = useState(() => `${String(Math.floor(Math.random() * 40) + 50)}%`);
|
|
872
761
|
|
|
873
762
|
return (
|
|
874
763
|
<div
|
|
875
|
-
className={cn("flex h-8 items-center gap-2 px-2",
|
|
764
|
+
className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
|
|
876
765
|
data-sidebar="menu-skeleton"
|
|
877
766
|
data-slot="sidebar-menu-skeleton"
|
|
878
767
|
{...props}
|
|
879
768
|
>
|
|
880
|
-
{showIcon ?
|
|
881
|
-
<Skeleton className={cn("size-4", "rounded-md")} data-sidebar="menu-skeleton-icon" />
|
|
882
|
-
) : null}
|
|
769
|
+
{showIcon ? <Skeleton className="size-4 rounded-md" data-sidebar="menu-skeleton-icon" /> : null}
|
|
883
770
|
<Skeleton
|
|
884
771
|
className="h-4 max-w-(--skeleton-width) flex-1"
|
|
885
772
|
data-sidebar="menu-skeleton-text"
|
|
@@ -909,10 +796,7 @@ function SidebarMenuSub({ className, ...props }: SidebarMenuSubProps): JSX.Eleme
|
|
|
909
796
|
return (
|
|
910
797
|
<ul
|
|
911
798
|
className={cn(
|
|
912
|
-
"mx-3.5 flex min-w-0 flex-col gap-1 px-2.5 py-0.5",
|
|
913
|
-
"border-l border-sidebar-border",
|
|
914
|
-
"translate-x-px",
|
|
915
|
-
"group-data-[collapsible=icon]:hidden",
|
|
799
|
+
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-s border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden rtl:-translate-x-px",
|
|
916
800
|
className,
|
|
917
801
|
)}
|
|
918
802
|
data-sidebar="menu-sub"
|
|
@@ -968,26 +852,12 @@ function SidebarMenuSubButton({
|
|
|
968
852
|
size = "md",
|
|
969
853
|
...props
|
|
970
854
|
}: SidebarMenuSubButtonProps): JSX.Element {
|
|
971
|
-
const Component = asChild ? Slot : "a";
|
|
855
|
+
const Component = asChild ? Slot.Root : "a";
|
|
972
856
|
|
|
973
857
|
return (
|
|
974
858
|
<Component
|
|
975
859
|
className={cn(
|
|
976
|
-
"flex h-7 min-w-0 items-center gap-2 overflow-hidden px-2",
|
|
977
|
-
"rounded-md ring-sidebar-ring outline-hidden",
|
|
978
|
-
"text-sidebar-foreground",
|
|
979
|
-
"-translate-x-px",
|
|
980
|
-
"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
981
|
-
"focus-visible:ring-3",
|
|
982
|
-
"active:bg-sidebar-accent active:text-sidebar-accent-foreground",
|
|
983
|
-
"disabled:pointer-events-none disabled:opacity-50",
|
|
984
|
-
"aria-disabled:pointer-events-none aria-disabled:opacity-50",
|
|
985
|
-
"data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground",
|
|
986
|
-
"group-data-[collapsible=icon]:hidden",
|
|
987
|
-
"[&>span:last-child]:truncate",
|
|
988
|
-
"[&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
|
|
989
|
-
size === "sm" && "text-xs",
|
|
990
|
-
size === "md" && "text-sm",
|
|
860
|
+
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs rtl:translate-x-px data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
|
|
991
861
|
className,
|
|
992
862
|
)}
|
|
993
863
|
data-active={isActive}
|
|
@@ -18,9 +18,7 @@ function Skeleton({ className, ...props }: SkeletonProps): JSX.Element {
|
|
|
18
18
|
return (
|
|
19
19
|
<div
|
|
20
20
|
className={cn(
|
|
21
|
-
"rounded-
|
|
22
|
-
"bg-gradient-to-r from-muted via-white/15 to-muted bg-[length:400%_100%]",
|
|
23
|
-
"animate-shimmer motion-reduce:animate-none",
|
|
21
|
+
"animate-shimmer rounded-md bg-linear-to-r from-muted via-white/15 to-muted bg-size-[400%_100%]",
|
|
24
22
|
className,
|
|
25
23
|
)}
|
|
26
24
|
data-slot="skeleton"
|