@caffeinebounce/ui 0.62.2
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/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.cts +249 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.ts +249 -0
- package/dist/NewsletterSignup-BPreFi5W.d.cts +37 -0
- package/dist/NewsletterSignup-BPreFi5W.d.ts +37 -0
- package/dist/TestimonialsSection-DtPu2OeR.d.ts +736 -0
- package/dist/TestimonialsSection-z-yotRfv.d.cts +736 -0
- package/dist/UnifiedTableControls-CG299y9h.d.ts +1233 -0
- package/dist/UnifiedTableControls-CIjRpNhy.d.cts +1233 -0
- package/dist/blog.d.cts +99 -0
- package/dist/blog.d.ts +99 -0
- package/dist/blog.js +292 -0
- package/dist/blog.mjs +279 -0
- package/dist/button-BHnoRUkF.d.cts +34 -0
- package/dist/button-BHnoRUkF.d.ts +34 -0
- package/dist/charts.d.cts +80 -0
- package/dist/charts.d.ts +80 -0
- package/dist/charts.js +19 -0
- package/dist/charts.mjs +2 -0
- package/dist/chunk-33JR5SYE.js +44 -0
- package/dist/chunk-3NDB4YPC.js +247 -0
- package/dist/chunk-5RW4PYZ6.js +1504 -0
- package/dist/chunk-5THF4YP6.mjs +155 -0
- package/dist/chunk-6BUBNZPG.mjs +164 -0
- package/dist/chunk-6DVWMJ3H.mjs +7029 -0
- package/dist/chunk-6TGV2DNP.js +120 -0
- package/dist/chunk-72JGQ7IJ.mjs +1498 -0
- package/dist/chunk-7DHKQODW.mjs +2932 -0
- package/dist/chunk-7IKHZKAC.js +160 -0
- package/dist/chunk-ADIDI7AJ.js +11 -0
- package/dist/chunk-BFWX5GJZ.mjs +940 -0
- package/dist/chunk-BMFQG6RA.mjs +5537 -0
- package/dist/chunk-C4UT5V3P.js +65 -0
- package/dist/chunk-CC4KUIKC.js +2004 -0
- package/dist/chunk-D3QXPL47.mjs +1814 -0
- package/dist/chunk-DQWHYBV2.js +36 -0
- package/dist/chunk-E42B4GSB.js +993 -0
- package/dist/chunk-ESZ7CBA2.js +1007 -0
- package/dist/chunk-EYJJQVV4.js +111 -0
- package/dist/chunk-FRRS2YZH.mjs +129 -0
- package/dist/chunk-G5TQWWQA.mjs +37 -0
- package/dist/chunk-GAIQJCAZ.js +5612 -0
- package/dist/chunk-GMBGWOCR.mjs +48 -0
- package/dist/chunk-GUSTCU2W.mjs +105 -0
- package/dist/chunk-HBLKVQIQ.mjs +23 -0
- package/dist/chunk-HMAMMC72.js +26 -0
- package/dist/chunk-IMKLN273.mjs +9 -0
- package/dist/chunk-J6OLBSZR.js +250 -0
- package/dist/chunk-JAE45W2T.js +28 -0
- package/dist/chunk-JORVSG52.js +606 -0
- package/dist/chunk-KB7UXIQZ.mjs +984 -0
- package/dist/chunk-KGGQ5NZV.js +186 -0
- package/dist/chunk-KHCC5UKW.mjs +22 -0
- package/dist/chunk-KRRIRS6A.mjs +1945 -0
- package/dist/chunk-LQCVRWVF.js +48 -0
- package/dist/chunk-MHZXUOGN.mjs +168 -0
- package/dist/chunk-MPZFPU4X.js +349 -0
- package/dist/chunk-MVYRNJA6.js +74 -0
- package/dist/chunk-N6AFNFZR.mjs +565 -0
- package/dist/chunk-OFQLWSUR.mjs +214 -0
- package/dist/chunk-OLAAXLXY.mjs +219 -0
- package/dist/chunk-OZZWDIOY.js +1859 -0
- package/dist/chunk-PZRI43EZ.js +111 -0
- package/dist/chunk-Q256HRYD.js +176 -0
- package/dist/chunk-Q52ZEL62.mjs +223 -0
- package/dist/chunk-R26Y7LGJ.js +142 -0
- package/dist/chunk-RBUYW6QQ.js +39 -0
- package/dist/chunk-RVEFPVZF.mjs +43 -0
- package/dist/chunk-SORWLKOK.js +96 -0
- package/dist/chunk-STEP6C4C.mjs +33 -0
- package/dist/chunk-T5R6HUDG.mjs +22 -0
- package/dist/chunk-T6ZBA6VJ.js +7109 -0
- package/dist/chunk-UM7WMXIU.js +2995 -0
- package/dist/chunk-VBD4Q5LL.mjs +117 -0
- package/dist/chunk-WOITB4JL.js +195 -0
- package/dist/chunk-YKZEKJMZ.mjs +71 -0
- package/dist/chunk-YL7RZRHM.mjs +103 -0
- package/dist/chunk-YSLD2HLP.mjs +346 -0
- package/dist/chunk-ZFLZA7UP.mjs +140 -0
- package/dist/chunk-ZKUIUE7W.mjs +26 -0
- package/dist/chunk-ZOA7B32D.js +248 -0
- package/dist/data-table.d.cts +46 -0
- package/dist/data-table.d.ts +46 -0
- package/dist/data-table.js +270 -0
- package/dist/data-table.mjs +13 -0
- package/dist/editor.d.cts +89 -0
- package/dist/editor.d.ts +89 -0
- package/dist/editor.js +10 -0
- package/dist/editor.mjs +1 -0
- package/dist/forms.d.cts +142 -0
- package/dist/forms.d.ts +142 -0
- package/dist/forms.js +24 -0
- package/dist/forms.mjs +11 -0
- package/dist/hooks-8ORd7T1A.d.cts +751 -0
- package/dist/hooks-B2jU1GVT.d.ts +751 -0
- package/dist/hooks.d.cts +6 -0
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.js +99 -0
- package/dist/hooks.mjs +10 -0
- package/dist/index.d.cts +3141 -0
- package/dist/index.d.ts +3141 -0
- package/dist/index.js +7332 -0
- package/dist/index.mjs +5876 -0
- package/dist/layouts-DPfDDF53.d.cts +1001 -0
- package/dist/layouts-DPfDDF53.d.ts +1001 -0
- package/dist/layouts.d.cts +4 -0
- package/dist/layouts.d.ts +4 -0
- package/dist/layouts.js +100 -0
- package/dist/layouts.mjs +11 -0
- package/dist/marketing-3d.d.cts +51 -0
- package/dist/marketing-3d.d.ts +51 -0
- package/dist/marketing-3d.js +553 -0
- package/dist/marketing-3d.mjs +526 -0
- package/dist/marketing.d.cts +583 -0
- package/dist/marketing.d.ts +583 -0
- package/dist/marketing.js +299 -0
- package/dist/marketing.mjs +10 -0
- package/dist/media.d.cts +29 -0
- package/dist/media.d.ts +29 -0
- package/dist/media.js +189 -0
- package/dist/media.mjs +182 -0
- package/dist/navigation.d.cts +591 -0
- package/dist/navigation.d.ts +591 -0
- package/dist/navigation.js +108 -0
- package/dist/navigation.mjs +15 -0
- package/dist/portal.d.cts +58 -0
- package/dist/portal.d.ts +58 -0
- package/dist/portal.js +403 -0
- package/dist/portal.mjs +395 -0
- package/dist/primitives.d.cts +508 -0
- package/dist/primitives.d.ts +508 -0
- package/dist/primitives.js +295 -0
- package/dist/primitives.mjs +14 -0
- package/dist/settings.d.cts +216 -0
- package/dist/settings.d.ts +216 -0
- package/dist/settings.js +34 -0
- package/dist/settings.mjs +9 -0
- package/dist/shared-Dqn36QHZ.d.cts +4 -0
- package/dist/shared-Dqn36QHZ.d.ts +4 -0
- package/dist/styles.css +1213 -0
- package/package.json +189 -0
- package/styles.css +1 -0
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
import { Separator } from './chunk-ZKUIUE7W.mjs';
|
|
2
|
+
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-FRRS2YZH.mjs';
|
|
3
|
+
import { Spinner } from './chunk-HBLKVQIQ.mjs';
|
|
4
|
+
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuItem } from './chunk-OFQLWSUR.mjs';
|
|
5
|
+
import { Input } from './chunk-STEP6C4C.mjs';
|
|
6
|
+
import { getAvatarGradient } from './chunk-MHZXUOGN.mjs';
|
|
7
|
+
import { cn } from './chunk-IMKLN273.mjs';
|
|
8
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
9
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
10
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
11
|
+
import { cva } from 'class-variance-authority';
|
|
12
|
+
import { PanelLeft, ChevronUp } from 'lucide-react';
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
import { Fragment as Fragment$1 } from 'react';
|
|
15
|
+
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
16
|
+
|
|
17
|
+
function Kbd({ className, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"kbd",
|
|
20
|
+
{
|
|
21
|
+
"data-slot": "kbd",
|
|
22
|
+
className: cn(
|
|
23
|
+
"bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none align-middle",
|
|
24
|
+
"[&_svg:not([class*='size-'])]:size-3",
|
|
25
|
+
// Inside tooltips: subtle background with visible text
|
|
26
|
+
"in-data-[slot=tooltip-content]:bg-foreground/10 in-data-[slot=tooltip-content]:text-popover-foreground/70",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function KbdGroup({ className, ...props }) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"kbd",
|
|
36
|
+
{
|
|
37
|
+
"data-slot": "kbd-group",
|
|
38
|
+
className: cn("inline-flex items-center gap-1", className),
|
|
39
|
+
...props
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
function KeyboardShortcut({
|
|
44
|
+
visible = true,
|
|
45
|
+
forceShow = false,
|
|
46
|
+
...props
|
|
47
|
+
}) {
|
|
48
|
+
if (!forceShow && !visible) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return /* @__PURE__ */ jsx(Kbd, { ...props });
|
|
52
|
+
}
|
|
53
|
+
var SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
54
|
+
var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
55
|
+
var SIDEBAR_WIDTH = "16rem";
|
|
56
|
+
var SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
57
|
+
var SIDEBAR_WIDTH_ICON = "3rem";
|
|
58
|
+
var SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
59
|
+
function resolveSidebarMode(width, desktopPref) {
|
|
60
|
+
if (width < 768) return "hidden";
|
|
61
|
+
if (desktopPref) return desktopPref;
|
|
62
|
+
return width < 1024 ? "collapsed" : "expanded";
|
|
63
|
+
}
|
|
64
|
+
function toDesktopPreference(open) {
|
|
65
|
+
if (open === void 0) return void 0;
|
|
66
|
+
return open ? "expanded" : "collapsed";
|
|
67
|
+
}
|
|
68
|
+
function getEffectiveMode(state) {
|
|
69
|
+
const resolved = resolveSidebarMode(state.viewportWidth, state.desktopPref);
|
|
70
|
+
if (resolved === "hidden") {
|
|
71
|
+
return state.openMobile ? "expanded" : "hidden";
|
|
72
|
+
}
|
|
73
|
+
return resolved;
|
|
74
|
+
}
|
|
75
|
+
function sidebarReducer(state, event) {
|
|
76
|
+
switch (event.type) {
|
|
77
|
+
case "VIEWPORT_CHANGED": {
|
|
78
|
+
return {
|
|
79
|
+
...state,
|
|
80
|
+
viewportWidth: event.width,
|
|
81
|
+
hydrated: true,
|
|
82
|
+
openMobile: event.width < 768 ? state.openMobile : false
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
case "TOGGLE_DESKTOP": {
|
|
86
|
+
if (state.viewportWidth < 768) return state;
|
|
87
|
+
const currentMode = resolveSidebarMode(
|
|
88
|
+
state.viewportWidth,
|
|
89
|
+
state.desktopPref
|
|
90
|
+
);
|
|
91
|
+
return {
|
|
92
|
+
...state,
|
|
93
|
+
desktopPref: currentMode === "expanded" ? "collapsed" : "expanded"
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
case "OPEN_MOBILE": {
|
|
97
|
+
if (state.viewportWidth >= 768) return state;
|
|
98
|
+
return { ...state, openMobile: true };
|
|
99
|
+
}
|
|
100
|
+
case "CLOSE_MOBILE": {
|
|
101
|
+
if (state.viewportWidth >= 768) return state;
|
|
102
|
+
return { ...state, openMobile: false };
|
|
103
|
+
}
|
|
104
|
+
case "SET_DESKTOP_PREF": {
|
|
105
|
+
return { ...state, desktopPref: event.pref };
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
return state;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
var SidebarContext = React.createContext(null);
|
|
112
|
+
function useSidebar() {
|
|
113
|
+
const context = React.useContext(SidebarContext);
|
|
114
|
+
if (!context) {
|
|
115
|
+
throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
116
|
+
}
|
|
117
|
+
return context;
|
|
118
|
+
}
|
|
119
|
+
var SidebarProvider = React.forwardRef(
|
|
120
|
+
({
|
|
121
|
+
defaultOpen,
|
|
122
|
+
open: openProp,
|
|
123
|
+
onOpenChange: setOpenProp,
|
|
124
|
+
className,
|
|
125
|
+
style,
|
|
126
|
+
children,
|
|
127
|
+
...props
|
|
128
|
+
}, ref) => {
|
|
129
|
+
const [machine, dispatch] = React.useReducer(sidebarReducer, {
|
|
130
|
+
viewportWidth: typeof window === "undefined" ? 1024 : window.innerWidth,
|
|
131
|
+
desktopPref: toDesktopPreference(defaultOpen),
|
|
132
|
+
openMobile: false,
|
|
133
|
+
hydrated: typeof window === "undefined"
|
|
134
|
+
});
|
|
135
|
+
React.useLayoutEffect(() => {
|
|
136
|
+
const syncViewport = () => {
|
|
137
|
+
dispatch({ type: "VIEWPORT_CHANGED", width: window.innerWidth });
|
|
138
|
+
};
|
|
139
|
+
syncViewport();
|
|
140
|
+
window.addEventListener("resize", syncViewport);
|
|
141
|
+
return () => window.removeEventListener("resize", syncViewport);
|
|
142
|
+
}, []);
|
|
143
|
+
const controlledDesktopPref = toDesktopPreference(openProp);
|
|
144
|
+
React.useEffect(() => {
|
|
145
|
+
if (controlledDesktopPref) {
|
|
146
|
+
dispatch({ type: "SET_DESKTOP_PREF", pref: controlledDesktopPref });
|
|
147
|
+
}
|
|
148
|
+
}, [controlledDesktopPref]);
|
|
149
|
+
const desktopPref = controlledDesktopPref ?? machine.desktopPref;
|
|
150
|
+
const effectiveMode = React.useMemo(
|
|
151
|
+
() => getEffectiveMode({
|
|
152
|
+
...machine,
|
|
153
|
+
desktopPref
|
|
154
|
+
}),
|
|
155
|
+
[desktopPref, machine]
|
|
156
|
+
);
|
|
157
|
+
const isMobile = machine.viewportWidth < 768;
|
|
158
|
+
const openMobile = isMobile && machine.openMobile;
|
|
159
|
+
const open = resolveSidebarMode(machine.viewportWidth, desktopPref) === "expanded";
|
|
160
|
+
const setDesktopPreference = React.useCallback(
|
|
161
|
+
(pref) => {
|
|
162
|
+
if (setOpenProp) {
|
|
163
|
+
setOpenProp(pref === "expanded");
|
|
164
|
+
}
|
|
165
|
+
if (openProp === void 0) {
|
|
166
|
+
dispatch({ type: "SET_DESKTOP_PREF", pref });
|
|
167
|
+
}
|
|
168
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${pref === "expanded"}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
|
|
169
|
+
},
|
|
170
|
+
[openProp, setOpenProp]
|
|
171
|
+
);
|
|
172
|
+
const setOpen = React.useCallback(
|
|
173
|
+
(nextOpen) => {
|
|
174
|
+
setDesktopPreference(nextOpen ? "expanded" : "collapsed");
|
|
175
|
+
},
|
|
176
|
+
[setDesktopPreference]
|
|
177
|
+
);
|
|
178
|
+
const setOpenMobile = React.useCallback((nextOpen) => {
|
|
179
|
+
dispatch({ type: nextOpen ? "OPEN_MOBILE" : "CLOSE_MOBILE" });
|
|
180
|
+
}, []);
|
|
181
|
+
const toggleSidebar = React.useCallback(() => {
|
|
182
|
+
if (isMobile) {
|
|
183
|
+
dispatch({ type: openMobile ? "CLOSE_MOBILE" : "OPEN_MOBILE" });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const nextPref = open ? "collapsed" : "expanded";
|
|
187
|
+
if (setOpenProp) {
|
|
188
|
+
setOpenProp(nextPref === "expanded");
|
|
189
|
+
}
|
|
190
|
+
if (openProp === void 0) {
|
|
191
|
+
dispatch({ type: "TOGGLE_DESKTOP" });
|
|
192
|
+
}
|
|
193
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${nextPref === "expanded"}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
|
|
194
|
+
}, [isMobile, open, openMobile, openProp, setOpenProp]);
|
|
195
|
+
React.useEffect(() => {
|
|
196
|
+
const handleKeyDown = (event) => {
|
|
197
|
+
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
toggleSidebar();
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
203
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
204
|
+
}, [toggleSidebar]);
|
|
205
|
+
const mode = effectiveMode;
|
|
206
|
+
const state = mode === "expanded" ? "expanded" : "collapsed";
|
|
207
|
+
const ready = machine.hydrated;
|
|
208
|
+
const contextValue = React.useMemo(
|
|
209
|
+
() => ({
|
|
210
|
+
state,
|
|
211
|
+
mode,
|
|
212
|
+
open,
|
|
213
|
+
setOpen,
|
|
214
|
+
isMobile,
|
|
215
|
+
openMobile,
|
|
216
|
+
setOpenMobile,
|
|
217
|
+
ready,
|
|
218
|
+
toggleSidebar
|
|
219
|
+
}),
|
|
220
|
+
[
|
|
221
|
+
state,
|
|
222
|
+
mode,
|
|
223
|
+
open,
|
|
224
|
+
setOpen,
|
|
225
|
+
isMobile,
|
|
226
|
+
openMobile,
|
|
227
|
+
setOpenMobile,
|
|
228
|
+
ready,
|
|
229
|
+
toggleSidebar
|
|
230
|
+
]
|
|
231
|
+
);
|
|
232
|
+
return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
|
|
233
|
+
"div",
|
|
234
|
+
{
|
|
235
|
+
style: {
|
|
236
|
+
"--sidebar-width": SIDEBAR_WIDTH,
|
|
237
|
+
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
238
|
+
...style
|
|
239
|
+
},
|
|
240
|
+
className: cn(
|
|
241
|
+
"group/sidebar-wrapper flex h-full min-h-0 w-full has-data-[variant=inset]:bg-sidebar",
|
|
242
|
+
className
|
|
243
|
+
),
|
|
244
|
+
ref,
|
|
245
|
+
...props,
|
|
246
|
+
children
|
|
247
|
+
}
|
|
248
|
+
) }) });
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
SidebarProvider.displayName = "SidebarProvider";
|
|
252
|
+
var Sidebar = React.forwardRef(
|
|
253
|
+
({
|
|
254
|
+
side = "left",
|
|
255
|
+
variant = "sidebar",
|
|
256
|
+
collapsible = "offcanvas",
|
|
257
|
+
className,
|
|
258
|
+
children,
|
|
259
|
+
...props
|
|
260
|
+
}, ref) => {
|
|
261
|
+
const { isMobile, state, openMobile, setOpenMobile, ready } = useSidebar();
|
|
262
|
+
if (collapsible === "none") {
|
|
263
|
+
return /* @__PURE__ */ jsx(
|
|
264
|
+
"div",
|
|
265
|
+
{
|
|
266
|
+
className: cn(
|
|
267
|
+
"flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
|
|
268
|
+
className
|
|
269
|
+
),
|
|
270
|
+
ref,
|
|
271
|
+
...props,
|
|
272
|
+
children
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
if (isMobile) {
|
|
277
|
+
return /* @__PURE__ */ jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs(
|
|
278
|
+
SheetContent,
|
|
279
|
+
{
|
|
280
|
+
"data-sidebar": "sidebar",
|
|
281
|
+
"data-mobile": "true",
|
|
282
|
+
className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
|
|
283
|
+
style: {
|
|
284
|
+
"--sidebar-width": SIDEBAR_WIDTH_MOBILE
|
|
285
|
+
},
|
|
286
|
+
side,
|
|
287
|
+
children: [
|
|
288
|
+
/* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
|
|
289
|
+
/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
|
|
290
|
+
/* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
|
|
291
|
+
] }),
|
|
292
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
) });
|
|
296
|
+
}
|
|
297
|
+
return /* @__PURE__ */ jsxs(
|
|
298
|
+
"div",
|
|
299
|
+
{
|
|
300
|
+
ref,
|
|
301
|
+
className: cn(
|
|
302
|
+
"group peer hidden md:block text-sidebar-foreground",
|
|
303
|
+
!ready && "md:invisible [&_*]:!transition-none [&_*]:!duration-0"
|
|
304
|
+
),
|
|
305
|
+
"data-state": state,
|
|
306
|
+
"data-collapsible": state === "collapsed" ? collapsible : "",
|
|
307
|
+
"data-variant": variant,
|
|
308
|
+
"data-side": side,
|
|
309
|
+
children: [
|
|
310
|
+
/* @__PURE__ */ jsx(
|
|
311
|
+
"div",
|
|
312
|
+
{
|
|
313
|
+
className: cn(
|
|
314
|
+
"duration-200 relative h-svh bg-transparent transition-[width] ease-linear shrink-0",
|
|
315
|
+
"group-data-[collapsible=offcanvas]:w-0",
|
|
316
|
+
"group-data-[side=right]:rotate-180",
|
|
317
|
+
variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
|
|
318
|
+
),
|
|
319
|
+
style: {
|
|
320
|
+
width: state === "collapsed" ? void 0 : "var(--sidebar-width)"
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
),
|
|
324
|
+
/* @__PURE__ */ jsx(
|
|
325
|
+
"div",
|
|
326
|
+
{
|
|
327
|
+
className: cn(
|
|
328
|
+
"duration-200 fixed inset-y-0 z-10 hidden h-svh transition-[left,right,width] ease-linear md:flex",
|
|
329
|
+
side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
330
|
+
// Adjust the padding for floating and inset variants.
|
|
331
|
+
variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
332
|
+
className
|
|
333
|
+
),
|
|
334
|
+
style: {
|
|
335
|
+
width: state === "collapsed" ? void 0 : "var(--sidebar-width)"
|
|
336
|
+
},
|
|
337
|
+
...props,
|
|
338
|
+
children: /* @__PURE__ */ jsx(
|
|
339
|
+
"div",
|
|
340
|
+
{
|
|
341
|
+
"data-sidebar": "sidebar",
|
|
342
|
+
className: cn(
|
|
343
|
+
"flex h-full w-full flex-col bg-sidebar overflow-x-hidden group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
|
|
344
|
+
),
|
|
345
|
+
children
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
}
|
|
349
|
+
)
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
);
|
|
355
|
+
Sidebar.displayName = "Sidebar";
|
|
356
|
+
var SidebarTrigger = React.forwardRef(({ className, onClick, ...props }, ref) => {
|
|
357
|
+
const { toggleSidebar } = useSidebar();
|
|
358
|
+
return /* @__PURE__ */ jsxs(
|
|
359
|
+
"button",
|
|
360
|
+
{
|
|
361
|
+
ref,
|
|
362
|
+
type: "button",
|
|
363
|
+
"data-sidebar": "trigger",
|
|
364
|
+
className: cn(
|
|
365
|
+
"inline-flex h-8 w-8 items-center justify-center rounded-md text-icon transition-colors hover:text-icon-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
366
|
+
className
|
|
367
|
+
),
|
|
368
|
+
onClick: (event) => {
|
|
369
|
+
onClick?.(event);
|
|
370
|
+
toggleSidebar();
|
|
371
|
+
},
|
|
372
|
+
...props,
|
|
373
|
+
children: [
|
|
374
|
+
/* @__PURE__ */ jsx(PanelLeft, { className: "h-4 w-4 transition-transform duration-300 hover:rotate-12" }),
|
|
375
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
|
|
376
|
+
]
|
|
377
|
+
}
|
|
378
|
+
);
|
|
379
|
+
});
|
|
380
|
+
SidebarTrigger.displayName = "SidebarTrigger";
|
|
381
|
+
var SidebarRail = React.forwardRef(({ className, ...props }, ref) => {
|
|
382
|
+
const { toggleSidebar } = useSidebar();
|
|
383
|
+
return /* @__PURE__ */ jsx(
|
|
384
|
+
"button",
|
|
385
|
+
{
|
|
386
|
+
ref,
|
|
387
|
+
"data-sidebar": "rail",
|
|
388
|
+
"aria-label": "Toggle Sidebar",
|
|
389
|
+
tabIndex: -1,
|
|
390
|
+
onClick: toggleSidebar,
|
|
391
|
+
title: "Toggle Sidebar",
|
|
392
|
+
className: cn(
|
|
393
|
+
"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
|
|
394
|
+
"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
|
|
395
|
+
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
|
|
396
|
+
"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
|
|
397
|
+
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
|
|
398
|
+
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
|
|
399
|
+
className
|
|
400
|
+
),
|
|
401
|
+
...props
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
});
|
|
405
|
+
SidebarRail.displayName = "SidebarRail";
|
|
406
|
+
var SidebarInset = React.forwardRef(({ className, ...props }, ref) => {
|
|
407
|
+
return /* @__PURE__ */ jsx(
|
|
408
|
+
"main",
|
|
409
|
+
{
|
|
410
|
+
ref,
|
|
411
|
+
className: cn(
|
|
412
|
+
// h-full + min-h-0: inherit height, allow shrinking
|
|
413
|
+
// flex-col: stack header and content vertically
|
|
414
|
+
"relative flex h-full min-h-0 flex-1 flex-col min-w-0 bg-background",
|
|
415
|
+
"peer-data-[variant=inset]:h-[calc(100%-1rem)] peer-data-[variant=inset]:min-h-0 md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
|
|
416
|
+
className
|
|
417
|
+
),
|
|
418
|
+
...props
|
|
419
|
+
}
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
SidebarInset.displayName = "SidebarInset";
|
|
423
|
+
var SidebarInput = React.forwardRef(({ className, ...props }, ref) => {
|
|
424
|
+
return /* @__PURE__ */ jsx(
|
|
425
|
+
Input,
|
|
426
|
+
{
|
|
427
|
+
ref,
|
|
428
|
+
"data-sidebar": "input",
|
|
429
|
+
className: cn(
|
|
430
|
+
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
|
|
431
|
+
className
|
|
432
|
+
),
|
|
433
|
+
...props
|
|
434
|
+
}
|
|
435
|
+
);
|
|
436
|
+
});
|
|
437
|
+
SidebarInput.displayName = "SidebarInput";
|
|
438
|
+
var SidebarHeader = React.forwardRef(({ className, ...props }, ref) => {
|
|
439
|
+
return /* @__PURE__ */ jsx(
|
|
440
|
+
"div",
|
|
441
|
+
{
|
|
442
|
+
ref,
|
|
443
|
+
"data-sidebar": "header",
|
|
444
|
+
className: cn("flex flex-col gap-2 p-2", className),
|
|
445
|
+
...props
|
|
446
|
+
}
|
|
447
|
+
);
|
|
448
|
+
});
|
|
449
|
+
SidebarHeader.displayName = "SidebarHeader";
|
|
450
|
+
var SidebarFooter = React.forwardRef(({ className, ...props }, ref) => {
|
|
451
|
+
return /* @__PURE__ */ jsx(
|
|
452
|
+
"div",
|
|
453
|
+
{
|
|
454
|
+
ref,
|
|
455
|
+
"data-sidebar": "footer",
|
|
456
|
+
className: cn("flex flex-col gap-2 p-2", className),
|
|
457
|
+
...props
|
|
458
|
+
}
|
|
459
|
+
);
|
|
460
|
+
});
|
|
461
|
+
SidebarFooter.displayName = "SidebarFooter";
|
|
462
|
+
var SidebarSeparator = React.forwardRef(({ className, ...props }, ref) => {
|
|
463
|
+
return /* @__PURE__ */ jsx(
|
|
464
|
+
Separator,
|
|
465
|
+
{
|
|
466
|
+
ref,
|
|
467
|
+
"data-sidebar": "separator",
|
|
468
|
+
className: cn("mx-2 w-auto bg-sidebar-border", className),
|
|
469
|
+
...props
|
|
470
|
+
}
|
|
471
|
+
);
|
|
472
|
+
});
|
|
473
|
+
SidebarSeparator.displayName = "SidebarSeparator";
|
|
474
|
+
var SidebarContent = React.forwardRef(({ className, ...props }, ref) => {
|
|
475
|
+
return /* @__PURE__ */ jsx(
|
|
476
|
+
"div",
|
|
477
|
+
{
|
|
478
|
+
ref,
|
|
479
|
+
"data-sidebar": "content",
|
|
480
|
+
className: cn(
|
|
481
|
+
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
|
|
482
|
+
className
|
|
483
|
+
),
|
|
484
|
+
...props
|
|
485
|
+
}
|
|
486
|
+
);
|
|
487
|
+
});
|
|
488
|
+
SidebarContent.displayName = "SidebarContent";
|
|
489
|
+
var SidebarGroup = React.forwardRef(({ className, ...props }, ref) => {
|
|
490
|
+
return /* @__PURE__ */ jsx(
|
|
491
|
+
"div",
|
|
492
|
+
{
|
|
493
|
+
ref,
|
|
494
|
+
"data-sidebar": "group",
|
|
495
|
+
className: cn("relative flex w-full min-w-0 flex-col p-2", className),
|
|
496
|
+
...props
|
|
497
|
+
}
|
|
498
|
+
);
|
|
499
|
+
});
|
|
500
|
+
SidebarGroup.displayName = "SidebarGroup";
|
|
501
|
+
var SidebarGroupLabel = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
|
|
502
|
+
const Comp = asChild ? Slot : "div";
|
|
503
|
+
return /* @__PURE__ */ jsx(
|
|
504
|
+
Comp,
|
|
505
|
+
{
|
|
506
|
+
ref,
|
|
507
|
+
"data-sidebar": "group-label",
|
|
508
|
+
className: cn(
|
|
509
|
+
"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
510
|
+
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
|
|
511
|
+
className
|
|
512
|
+
),
|
|
513
|
+
...props
|
|
514
|
+
}
|
|
515
|
+
);
|
|
516
|
+
});
|
|
517
|
+
SidebarGroupLabel.displayName = "SidebarGroupLabel";
|
|
518
|
+
var SidebarGroupAction = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
|
|
519
|
+
const Comp = asChild ? Slot : "button";
|
|
520
|
+
return /* @__PURE__ */ jsx(
|
|
521
|
+
Comp,
|
|
522
|
+
{
|
|
523
|
+
ref,
|
|
524
|
+
"data-sidebar": "group-action",
|
|
525
|
+
className: cn(
|
|
526
|
+
"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
527
|
+
// Increases the hit area of the button on mobile.
|
|
528
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
529
|
+
"group-data-[collapsible=icon]:hidden",
|
|
530
|
+
className
|
|
531
|
+
),
|
|
532
|
+
...props
|
|
533
|
+
}
|
|
534
|
+
);
|
|
535
|
+
});
|
|
536
|
+
SidebarGroupAction.displayName = "SidebarGroupAction";
|
|
537
|
+
var SidebarGroupContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
538
|
+
"div",
|
|
539
|
+
{
|
|
540
|
+
ref,
|
|
541
|
+
"data-sidebar": "group-content",
|
|
542
|
+
className: cn("w-full text-sm", className),
|
|
543
|
+
...props
|
|
544
|
+
}
|
|
545
|
+
));
|
|
546
|
+
SidebarGroupContent.displayName = "SidebarGroupContent";
|
|
547
|
+
var SidebarMenu = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
548
|
+
"ul",
|
|
549
|
+
{
|
|
550
|
+
ref,
|
|
551
|
+
"data-sidebar": "menu",
|
|
552
|
+
className: cn("flex w-full min-w-0 flex-col gap-1", className),
|
|
553
|
+
...props
|
|
554
|
+
}
|
|
555
|
+
));
|
|
556
|
+
SidebarMenu.displayName = "SidebarMenu";
|
|
557
|
+
var SidebarMenuItem = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
558
|
+
"li",
|
|
559
|
+
{
|
|
560
|
+
ref,
|
|
561
|
+
"data-sidebar": "menu-item",
|
|
562
|
+
className: cn("group/menu-item relative", className),
|
|
563
|
+
...props
|
|
564
|
+
}
|
|
565
|
+
));
|
|
566
|
+
SidebarMenuItem.displayName = "SidebarMenuItem";
|
|
567
|
+
var sidebarMenuButtonVariants = cva(
|
|
568
|
+
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] 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 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
569
|
+
{
|
|
570
|
+
variants: {
|
|
571
|
+
variant: {
|
|
572
|
+
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
573
|
+
outline: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"
|
|
574
|
+
},
|
|
575
|
+
size: {
|
|
576
|
+
default: "h-8 text-sm",
|
|
577
|
+
sm: "h-7 text-xs",
|
|
578
|
+
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0 group-data-[collapsible=icon]:!gap-0 group-data-[collapsible=icon]:!size-8 [.group[data-collapsible=icon]_&]:hover:!bg-transparent [.group[data-collapsible=icon]_&]:active:!bg-transparent"
|
|
579
|
+
}
|
|
580
|
+
},
|
|
581
|
+
defaultVariants: {
|
|
582
|
+
variant: "default",
|
|
583
|
+
size: "default"
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
);
|
|
587
|
+
var SidebarMenuButton = React.forwardRef(
|
|
588
|
+
({
|
|
589
|
+
asChild = false,
|
|
590
|
+
isActive = false,
|
|
591
|
+
variant = "default",
|
|
592
|
+
size = "default",
|
|
593
|
+
tooltip,
|
|
594
|
+
className,
|
|
595
|
+
...props
|
|
596
|
+
}, ref) => {
|
|
597
|
+
const Comp = asChild ? Slot : "button";
|
|
598
|
+
const { isMobile, state } = useSidebar();
|
|
599
|
+
const button = /* @__PURE__ */ jsx(
|
|
600
|
+
Comp,
|
|
601
|
+
{
|
|
602
|
+
ref,
|
|
603
|
+
"data-sidebar": "menu-button",
|
|
604
|
+
"data-size": size,
|
|
605
|
+
"data-active": isActive,
|
|
606
|
+
className: cn(sidebarMenuButtonVariants({ variant, size }), className),
|
|
607
|
+
...props
|
|
608
|
+
}
|
|
609
|
+
);
|
|
610
|
+
if (!tooltip) {
|
|
611
|
+
return button;
|
|
612
|
+
}
|
|
613
|
+
if (typeof tooltip === "string") {
|
|
614
|
+
tooltip = {
|
|
615
|
+
children: tooltip
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
return /* @__PURE__ */ jsxs(TooltipPrimitive.Root, { children: [
|
|
619
|
+
/* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { asChild: true, children: button }),
|
|
620
|
+
/* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
621
|
+
TooltipContent,
|
|
622
|
+
{
|
|
623
|
+
side: "right",
|
|
624
|
+
align: "center",
|
|
625
|
+
hidden: state !== "collapsed" || isMobile,
|
|
626
|
+
...tooltip
|
|
627
|
+
}
|
|
628
|
+
) })
|
|
629
|
+
] });
|
|
630
|
+
}
|
|
631
|
+
);
|
|
632
|
+
SidebarMenuButton.displayName = "SidebarMenuButton";
|
|
633
|
+
var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
634
|
+
TooltipPrimitive.Content,
|
|
635
|
+
{
|
|
636
|
+
ref,
|
|
637
|
+
sideOffset,
|
|
638
|
+
className: cn(
|
|
639
|
+
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
640
|
+
className
|
|
641
|
+
),
|
|
642
|
+
...props
|
|
643
|
+
}
|
|
644
|
+
));
|
|
645
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
646
|
+
var SidebarMenuAction = React.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
|
|
647
|
+
const Comp = asChild ? Slot : "button";
|
|
648
|
+
return /* @__PURE__ */ jsx(
|
|
649
|
+
Comp,
|
|
650
|
+
{
|
|
651
|
+
ref,
|
|
652
|
+
"data-sidebar": "menu-action",
|
|
653
|
+
className: cn(
|
|
654
|
+
"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
|
|
655
|
+
// Increases the hit area of the button on mobile.
|
|
656
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
657
|
+
"peer-data-[size=sm]/menu-button:top-1",
|
|
658
|
+
"peer-data-[size=default]/menu-button:top-1.5",
|
|
659
|
+
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
660
|
+
"group-data-[collapsible=icon]:hidden",
|
|
661
|
+
showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
|
|
662
|
+
className
|
|
663
|
+
),
|
|
664
|
+
...props
|
|
665
|
+
}
|
|
666
|
+
);
|
|
667
|
+
});
|
|
668
|
+
SidebarMenuAction.displayName = "SidebarMenuAction";
|
|
669
|
+
var SidebarMenuBadge = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
670
|
+
"div",
|
|
671
|
+
{
|
|
672
|
+
ref,
|
|
673
|
+
"data-sidebar": "menu-badge",
|
|
674
|
+
className: cn(
|
|
675
|
+
"absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none",
|
|
676
|
+
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
677
|
+
"peer-data-[size=sm]/menu-button:top-1",
|
|
678
|
+
"peer-data-[size=default]/menu-button:top-1.5",
|
|
679
|
+
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
680
|
+
"group-data-[collapsible=icon]:hidden",
|
|
681
|
+
className
|
|
682
|
+
),
|
|
683
|
+
...props
|
|
684
|
+
}
|
|
685
|
+
));
|
|
686
|
+
SidebarMenuBadge.displayName = "SidebarMenuBadge";
|
|
687
|
+
var SidebarMenuSkeleton = React.forwardRef(({ className, showIcon = false, ...props }, ref) => {
|
|
688
|
+
const width = React.useMemo(() => {
|
|
689
|
+
return `${Math.floor(Math.random() * 40) + 50}%`;
|
|
690
|
+
}, []);
|
|
691
|
+
return /* @__PURE__ */ jsxs(
|
|
692
|
+
"div",
|
|
693
|
+
{
|
|
694
|
+
ref,
|
|
695
|
+
"data-sidebar": "menu-skeleton",
|
|
696
|
+
className: cn("rounded-md h-8 flex gap-2 px-2 items-center", className),
|
|
697
|
+
...props,
|
|
698
|
+
children: [
|
|
699
|
+
showIcon && /* @__PURE__ */ jsx(
|
|
700
|
+
"div",
|
|
701
|
+
{
|
|
702
|
+
className: "size-4 rounded-md bg-sidebar-accent-foreground/10",
|
|
703
|
+
"data-skeleton": "icon"
|
|
704
|
+
}
|
|
705
|
+
),
|
|
706
|
+
/* @__PURE__ */ jsx(
|
|
707
|
+
"div",
|
|
708
|
+
{
|
|
709
|
+
className: "h-4 flex-1 max-w-[--skeleton-width] rounded-md bg-sidebar-accent-foreground/10",
|
|
710
|
+
"data-skeleton": "text",
|
|
711
|
+
style: {
|
|
712
|
+
"--skeleton-width": width
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
)
|
|
716
|
+
]
|
|
717
|
+
}
|
|
718
|
+
);
|
|
719
|
+
});
|
|
720
|
+
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
|
|
721
|
+
var SidebarMenuSub = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
722
|
+
"ul",
|
|
723
|
+
{
|
|
724
|
+
ref,
|
|
725
|
+
"data-sidebar": "menu-sub",
|
|
726
|
+
className: cn(
|
|
727
|
+
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
|
|
728
|
+
"group-data-[collapsible=icon]:hidden",
|
|
729
|
+
className
|
|
730
|
+
),
|
|
731
|
+
...props
|
|
732
|
+
}
|
|
733
|
+
));
|
|
734
|
+
SidebarMenuSub.displayName = "SidebarMenuSub";
|
|
735
|
+
var SidebarMenuSubItem = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, ...props }));
|
|
736
|
+
SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
|
|
737
|
+
var SidebarMenuSubButton = React.forwardRef(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
|
|
738
|
+
const Comp = asChild ? Slot : "a";
|
|
739
|
+
return /* @__PURE__ */ jsx(
|
|
740
|
+
Comp,
|
|
741
|
+
{
|
|
742
|
+
ref,
|
|
743
|
+
"data-sidebar": "menu-sub-button",
|
|
744
|
+
"data-size": size,
|
|
745
|
+
"data-active": isActive,
|
|
746
|
+
className: cn(
|
|
747
|
+
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring 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 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
|
|
748
|
+
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
|
|
749
|
+
size === "sm" && "text-xs",
|
|
750
|
+
size === "md" && "text-sm",
|
|
751
|
+
"group-data-[collapsible=icon]:hidden",
|
|
752
|
+
className
|
|
753
|
+
),
|
|
754
|
+
...props
|
|
755
|
+
}
|
|
756
|
+
);
|
|
757
|
+
});
|
|
758
|
+
SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
|
|
759
|
+
function Avatar({
|
|
760
|
+
className,
|
|
761
|
+
...props
|
|
762
|
+
}) {
|
|
763
|
+
return /* @__PURE__ */ jsx(
|
|
764
|
+
AvatarPrimitive.Root,
|
|
765
|
+
{
|
|
766
|
+
"data-slot": "avatar",
|
|
767
|
+
className: cn(
|
|
768
|
+
"relative flex size-10 shrink-0 overflow-hidden rounded-full",
|
|
769
|
+
className
|
|
770
|
+
),
|
|
771
|
+
...props
|
|
772
|
+
}
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
function AvatarImage({
|
|
776
|
+
className,
|
|
777
|
+
...props
|
|
778
|
+
}) {
|
|
779
|
+
return /* @__PURE__ */ jsx(
|
|
780
|
+
AvatarPrimitive.Image,
|
|
781
|
+
{
|
|
782
|
+
"data-slot": "avatar-image",
|
|
783
|
+
className: cn("aspect-square size-full object-cover", className),
|
|
784
|
+
...props
|
|
785
|
+
}
|
|
786
|
+
);
|
|
787
|
+
}
|
|
788
|
+
function AvatarFallback({
|
|
789
|
+
className,
|
|
790
|
+
...props
|
|
791
|
+
}) {
|
|
792
|
+
return /* @__PURE__ */ jsx(
|
|
793
|
+
AvatarPrimitive.Fallback,
|
|
794
|
+
{
|
|
795
|
+
"data-slot": "avatar-fallback",
|
|
796
|
+
className: cn(
|
|
797
|
+
"bg-muted flex size-full items-center justify-center rounded-full",
|
|
798
|
+
className
|
|
799
|
+
),
|
|
800
|
+
...props
|
|
801
|
+
}
|
|
802
|
+
);
|
|
803
|
+
}
|
|
804
|
+
var sizeClasses = {
|
|
805
|
+
sm: "h-6 w-6",
|
|
806
|
+
md: "h-8 w-8",
|
|
807
|
+
lg: "h-10 w-10"
|
|
808
|
+
};
|
|
809
|
+
var avatarTextSizes = {
|
|
810
|
+
sm: "text-xs",
|
|
811
|
+
md: "text-xs",
|
|
812
|
+
lg: "text-sm"
|
|
813
|
+
};
|
|
814
|
+
function UserAvatarMenu({
|
|
815
|
+
user,
|
|
816
|
+
loading = false,
|
|
817
|
+
items,
|
|
818
|
+
size = "md",
|
|
819
|
+
side = "bottom",
|
|
820
|
+
align = "end",
|
|
821
|
+
open,
|
|
822
|
+
onOpenChange,
|
|
823
|
+
showChevron = false,
|
|
824
|
+
isActive = false,
|
|
825
|
+
trigger,
|
|
826
|
+
header,
|
|
827
|
+
showUserInfo = false,
|
|
828
|
+
menuShortcut,
|
|
829
|
+
menuWidth,
|
|
830
|
+
className = "",
|
|
831
|
+
avatarClassName = "",
|
|
832
|
+
LinkComponent,
|
|
833
|
+
ShortcutComponent
|
|
834
|
+
}) {
|
|
835
|
+
const Shortcut = ShortcutComponent || KeyboardShortcut;
|
|
836
|
+
const sizeClass = sizeClasses[size];
|
|
837
|
+
const textSize = avatarTextSizes[size];
|
|
838
|
+
if (loading) {
|
|
839
|
+
return /* @__PURE__ */ jsx(
|
|
840
|
+
"div",
|
|
841
|
+
{
|
|
842
|
+
className: `inline-flex items-center justify-center rounded-md ${sizeClass} ${className}`,
|
|
843
|
+
children: /* @__PURE__ */ jsx(Spinner, { size: "sm" })
|
|
844
|
+
}
|
|
845
|
+
);
|
|
846
|
+
}
|
|
847
|
+
const { id, email, avatarUrl, name, initials } = user;
|
|
848
|
+
const displayInitials = initials || name?.[0]?.toUpperCase() || "U";
|
|
849
|
+
const gradient = getAvatarGradient(id);
|
|
850
|
+
const avatarContent = /* @__PURE__ */ jsxs(Avatar, { className: `${sizeClass} rounded-full ${avatarClassName}`, children: [
|
|
851
|
+
avatarUrl && /* @__PURE__ */ jsx(AvatarImage, { src: avatarUrl, alt: name || email || "User" }),
|
|
852
|
+
/* @__PURE__ */ jsx(
|
|
853
|
+
AvatarFallback,
|
|
854
|
+
{
|
|
855
|
+
className: `rounded-full font-medium text-white ${textSize}`,
|
|
856
|
+
style: gradient.style,
|
|
857
|
+
children: displayInitials
|
|
858
|
+
}
|
|
859
|
+
)
|
|
860
|
+
] });
|
|
861
|
+
const defaultTrigger = /* @__PURE__ */ jsxs(
|
|
862
|
+
"button",
|
|
863
|
+
{
|
|
864
|
+
type: "button",
|
|
865
|
+
className: `inline-flex items-center justify-center rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-all hover:scale-105 ${isActive ? "ring-2 ring-primary" : ""} ${className}`,
|
|
866
|
+
children: [
|
|
867
|
+
avatarContent,
|
|
868
|
+
showChevron && /* @__PURE__ */ jsx(ChevronUp, { className: "ml-1 size-4" }),
|
|
869
|
+
menuShortcut && /* @__PURE__ */ jsx(Shortcut, { className: "ml-auto hidden text-xs text-muted-foreground md:inline-flex", children: menuShortcut }),
|
|
870
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "User menu" })
|
|
871
|
+
]
|
|
872
|
+
}
|
|
873
|
+
);
|
|
874
|
+
const renderMenuItem = (item) => {
|
|
875
|
+
const Icon = item.icon;
|
|
876
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
877
|
+
Icon && /* @__PURE__ */ jsx(Icon, { className: "mr-2 h-4 w-4" }),
|
|
878
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: item.label }),
|
|
879
|
+
item.showShortcut !== false && item.shortcut && /* @__PURE__ */ jsx(Shortcut, { className: "text-xs text-muted-foreground", children: item.shortcut })
|
|
880
|
+
] });
|
|
881
|
+
const menuItemProps = {
|
|
882
|
+
variant: item.destructive ? "destructive" : void 0,
|
|
883
|
+
className: "cursor-pointer"
|
|
884
|
+
};
|
|
885
|
+
if (item.href) {
|
|
886
|
+
if (item.external) {
|
|
887
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(
|
|
888
|
+
"a",
|
|
889
|
+
{
|
|
890
|
+
href: item.href,
|
|
891
|
+
target: "_blank",
|
|
892
|
+
rel: "noopener noreferrer",
|
|
893
|
+
className: `cursor-pointer${item.destructive ? "" : " text-muted-foreground"}`,
|
|
894
|
+
children: content
|
|
895
|
+
}
|
|
896
|
+
) });
|
|
897
|
+
}
|
|
898
|
+
if (LinkComponent) {
|
|
899
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(LinkComponent, { href: item.href, className: "cursor-pointer", children: content }) });
|
|
900
|
+
}
|
|
901
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(
|
|
902
|
+
"a",
|
|
903
|
+
{
|
|
904
|
+
href: item.href,
|
|
905
|
+
className: `cursor-pointer${item.destructive ? "" : ""}`,
|
|
906
|
+
children: content
|
|
907
|
+
}
|
|
908
|
+
) });
|
|
909
|
+
}
|
|
910
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: item.onClick, ...menuItemProps, children: content });
|
|
911
|
+
};
|
|
912
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { open, onOpenChange, children: [
|
|
913
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: trigger || defaultTrigger }),
|
|
914
|
+
/* @__PURE__ */ jsxs(
|
|
915
|
+
DropdownMenuContent,
|
|
916
|
+
{
|
|
917
|
+
className: `rounded-lg ${menuWidth || "w-56"}`,
|
|
918
|
+
side,
|
|
919
|
+
align,
|
|
920
|
+
sideOffset: 4,
|
|
921
|
+
children: [
|
|
922
|
+
showUserInfo && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
923
|
+
/* @__PURE__ */ jsxs("div", { className: "px-2 py-1.5 text-sm", children: [
|
|
924
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold", children: name || "User" }),
|
|
925
|
+
email && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: email })
|
|
926
|
+
] }),
|
|
927
|
+
/* @__PURE__ */ jsx(DropdownMenuSeparator, {})
|
|
928
|
+
] }),
|
|
929
|
+
header,
|
|
930
|
+
items.map((item, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
931
|
+
item.separatorBefore && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
932
|
+
renderMenuItem(item)
|
|
933
|
+
] }, item.label || index))
|
|
934
|
+
]
|
|
935
|
+
}
|
|
936
|
+
)
|
|
937
|
+
] });
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
export { Avatar, AvatarFallback, AvatarImage, Kbd, KbdGroup, KeyboardShortcut, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, UserAvatarMenu, useSidebar };
|