xertica-ui 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/ThemeContext-BgclCB35.js +1856 -0
  4. package/dist/ThemeContext-DQUOeziy.cjs +1855 -0
  5. package/dist/VerifyEmailPage-RrUApqBN.js +3214 -0
  6. package/dist/VerifyEmailPage-VoMI7MYH.cjs +3213 -0
  7. package/dist/XerticaProvider-BSyFrmC0.js +49 -0
  8. package/dist/XerticaProvider-CiNKjMx1.cjs +48 -0
  9. package/dist/XerticaXLogo-B2svDGZh.cjs +251 -0
  10. package/dist/XerticaXLogo-CowGv7BC.js +252 -0
  11. package/dist/brand.cjs.js +2 -2
  12. package/dist/brand.es.js +2 -2
  13. package/dist/hooks.cjs.js +1 -1
  14. package/dist/hooks.es.js +1 -1
  15. package/dist/index.cjs.js +5 -5
  16. package/dist/index.es.js +5 -5
  17. package/dist/layout.cjs.js +1 -1
  18. package/dist/layout.es.js +1 -1
  19. package/dist/pages.cjs.js +1 -1
  20. package/dist/pages.es.js +1 -1
  21. package/dist/sidebar-CRMiBtAi.js +801 -0
  22. package/dist/sidebar-CZ2mWaMM.cjs +800 -0
  23. package/dist/xertica-ui.css +1 -1
  24. package/package.json +1 -1
  25. package/templates/CLAUDE.md +165 -180
  26. package/templates/package.json +2 -2
  27. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +9 -7
  28. package/templates/src/features/auth/ui/LoginContent.tsx +10 -8
  29. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +179 -177
  30. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +9 -4
  31. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +84 -82
  32. package/templates/src/features/template/ui/TemplateContent.tsx +1 -1
  33. package/templates/src/locales/en/components/assistant.json +14 -0
  34. package/templates/src/locales/en/pages/forgotPassword.json +10 -0
  35. package/templates/src/locales/en/pages/templates.json +1 -1
  36. package/templates/src/locales/es/components/assistant.json +14 -0
  37. package/templates/src/locales/es/pages/forgotPassword.json +10 -0
  38. package/templates/src/locales/es/pages/templates.json +1 -1
  39. package/templates/src/locales/pt-BR/components/assistant.json +14 -0
  40. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -0
  41. package/templates/src/locales/pt-BR/pages/templates.json +1 -1
  42. package/templates/src/pages/AssistantPage.tsx +464 -463
@@ -0,0 +1,801 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import React__default, { createContext, useState, useEffect, useRef, useMemo, useContext } from "react";
3
+ import { Menu, Settings, User, LogOut, ArrowLeft, Search, Filter, MoreVertical, ChevronRight } from "lucide-react";
4
+ import { B as Button, c as cn } from "./button-C6uvh0rV.js";
5
+ import { L as LanguageSelector, T as ThemeToggle, X as XerticaLogo, a as XerticaXLogo } from "./XerticaXLogo-CowGv7BC.js";
6
+ import { B as Breadcrumb, d as BreadcrumbList, b as BreadcrumbItem, c as BreadcrumbLink, e as BreadcrumbPage, f as BreadcrumbSeparator } from "./breadcrumb-DIJ0X3Ot.js";
7
+ import { D as DropdownMenu, n as DropdownMenuTrigger, b as DropdownMenuContent, e as DropdownMenuLabel, i as DropdownMenuSeparator, d as DropdownMenuItem, k as DropdownMenuSub, m as DropdownMenuSubTrigger, f as DropdownMenuPortal, l as DropdownMenuSubContent } from "./dropdown-menu-CFuCssWA.js";
8
+ import { A as Avatar, b as AvatarImage, a as AvatarFallback } from "./avatar-Cxyofu1H.js";
9
+ import { a as useOptionalLayout } from "./LayoutContext-CGEe1oPq.js";
10
+ import { AnimatePresence, motion } from "framer-motion";
11
+ import { useTranslation } from "react-i18next";
12
+ import { I as Input, S as ScrollArea, P as Popover, c as PopoverTrigger, b as PopoverContent } from "./input-wPYg0d0P.js";
13
+ import { b as TooltipProvider, T as Tooltip, c as TooltipTrigger } from "./tooltip-D-OrYnKO.js";
14
+ import { C as CustomTooltipContent } from "./CustomTooltipContent-CfOfikhq.js";
15
+ function Header({
16
+ title,
17
+ breadcrumbs,
18
+ showLanguageSelector = true,
19
+ showThemeToggle = true,
20
+ className,
21
+ user,
22
+ actions,
23
+ showSettings,
24
+ onSettingsClick,
25
+ showLogout,
26
+ onLogoutClick,
27
+ renderLink,
28
+ breadcrumbSlot
29
+ }) {
30
+ var _a;
31
+ const layout = useOptionalLayout();
32
+ const toggleSidebar = (layout == null ? void 0 : layout.toggleSidebar) ?? (() => {
33
+ });
34
+ return /* @__PURE__ */ jsx(
35
+ "header",
36
+ {
37
+ className: `bg-card text-foreground shadow-sm border-b border-border px-[24px] h-[64px] flex-shrink-0 flex items-center ${className || ""}`,
38
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between w-full p-[0px]", children: [
39
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground w-full overflow-x-auto", children: [
40
+ /* @__PURE__ */ jsx(
41
+ Button,
42
+ {
43
+ variant: "ghost",
44
+ size: "sm",
45
+ onClick: toggleSidebar,
46
+ className: "md:hidden mr-2 p-2 shrink-0",
47
+ "aria-label": "Abrir menu lateral",
48
+ children: /* @__PURE__ */ jsx(Menu, { className: "w-5 h-5" })
49
+ }
50
+ ),
51
+ breadcrumbs && breadcrumbs.length > 0 ? /* @__PURE__ */ jsx(Breadcrumb, { children: /* @__PURE__ */ jsx(BreadcrumbList, { className: "flex-nowrap whitespace-nowrap", children: breadcrumbs.map((item, index) => /* @__PURE__ */ jsxs(React__default.Fragment, { children: [
52
+ /* @__PURE__ */ jsx(BreadcrumbItem, { children: item.href ? renderLink ? /* @__PURE__ */ jsx(BreadcrumbLink, { asChild: true, className: "flex items-center gap-1.5", children: renderLink(item.href, {
53
+ className: "flex items-center gap-1.5",
54
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ item.icon,
56
+ item.label
57
+ ] })
58
+ }) }) : /* @__PURE__ */ jsxs(BreadcrumbLink, { href: item.href, className: "flex items-center gap-1.5", children: [
59
+ item.icon,
60
+ item.label
61
+ ] }) : /* @__PURE__ */ jsxs(BreadcrumbPage, { className: "flex items-center gap-1.5", children: [
62
+ item.icon,
63
+ item.label
64
+ ] }) }),
65
+ index < breadcrumbs.length - 1 && /* @__PURE__ */ jsx(BreadcrumbSeparator, {})
66
+ ] }, index)) }) }) : title ? /* @__PURE__ */ jsx("span", { className: "text-foreground font-medium shrink-0", children: title }) : /* @__PURE__ */ jsx(Breadcrumb, { children: /* @__PURE__ */ jsx(BreadcrumbList, { className: "flex-nowrap whitespace-nowrap", children: /* @__PURE__ */ jsx(BreadcrumbItem, { children: /* @__PURE__ */ jsx(BreadcrumbPage, { className: "text-foreground font-medium shrink-0", children: "Xertica.ai" }) }) }) }),
67
+ breadcrumbSlot && /* @__PURE__ */ jsx("div", { className: "flex items-center shrink-0", children: breadcrumbSlot })
68
+ ] }),
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 shrink-0 ml-4", children: [
70
+ showLanguageSelector && /* @__PURE__ */ jsx(LanguageSelector, { variant: "minimal", showIcon: false, className: "hidden sm:flex" }),
71
+ showThemeToggle && /* @__PURE__ */ jsx(ThemeToggle, { className: "hover:bg-accent" }),
72
+ actions == null ? void 0 : actions.map((action) => /* @__PURE__ */ jsxs(
73
+ Button,
74
+ {
75
+ variant: "ghost",
76
+ size: action.label ? "sm" : "icon",
77
+ onClick: action.onClick,
78
+ className: `hover:bg-accent ${action.className || ""}`,
79
+ "aria-label": action.label || action.id,
80
+ children: [
81
+ action.icon,
82
+ action.label && /* @__PURE__ */ jsx("span", { className: "ml-2 hidden md:inline", children: action.label })
83
+ ]
84
+ },
85
+ action.id
86
+ )),
87
+ showSettings && /* @__PURE__ */ jsx(
88
+ Button,
89
+ {
90
+ variant: "ghost",
91
+ size: "icon",
92
+ onClick: onSettingsClick,
93
+ className: "hover:bg-accent",
94
+ "aria-label": "Configurações",
95
+ children: /* @__PURE__ */ jsx(Settings, { className: "w-5 h-5" })
96
+ }
97
+ ),
98
+ user && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
99
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
100
+ Button,
101
+ {
102
+ variant: "ghost",
103
+ className: "relative h-8 w-8 rounded-full p-0 overflow-hidden border border-border/50 hover:border-primary/30 transition-colors",
104
+ "aria-label": "Menu do usuário",
105
+ children: /* @__PURE__ */ jsxs(Avatar, { className: "h-8 w-8", children: [
106
+ /* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name || "User" }),
107
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-primary/10 text-primary text-xs font-medium", children: user.name ? user.name.charAt(0).toUpperCase() : /* @__PURE__ */ jsx(User, { className: "w-4 h-4" }) })
108
+ ] })
109
+ }
110
+ ) }),
111
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { className: "w-56", align: "end", forceMount: true, children: [
112
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { className: "font-normal", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col space-y-1", children: [
113
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium leading-none", children: user.name || "User" }),
114
+ /* @__PURE__ */ jsx("p", { className: "text-xs leading-none text-muted-foreground", children: user.email || "user@example.com" })
115
+ ] }) }),
116
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
117
+ (_a = user.menuItems) == null ? void 0 : _a.map((item) => /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: item.onClick, className: item.className, children: [
118
+ item.icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: item.icon }),
119
+ item.label
120
+ ] }, item.id)),
121
+ !user.menuItems && /* @__PURE__ */ jsxs(Fragment, { children: [
122
+ /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: onSettingsClick, children: [
123
+ /* @__PURE__ */ jsx(Settings, { className: "mr-2 h-4 w-4" }),
124
+ /* @__PURE__ */ jsx("span", { children: "Settings" })
125
+ ] }),
126
+ /* @__PURE__ */ jsxs(
127
+ DropdownMenuItem,
128
+ {
129
+ onClick: onLogoutClick,
130
+ className: "text-destructive focus:text-destructive",
131
+ children: [
132
+ /* @__PURE__ */ jsx(LogOut, { className: "mr-2 h-4 w-4" }),
133
+ /* @__PURE__ */ jsx("span", { children: "Logout" })
134
+ ]
135
+ }
136
+ )
137
+ ] })
138
+ ] })
139
+ ] }),
140
+ showLogout && /* @__PURE__ */ jsx(
141
+ Button,
142
+ {
143
+ variant: "ghost",
144
+ size: "icon",
145
+ onClick: onLogoutClick,
146
+ className: "hover:bg-accent text-muted-foreground hover:text-foreground",
147
+ "aria-label": "Sair",
148
+ children: /* @__PURE__ */ jsx(LogOut, { className: "w-5 h-5" })
149
+ }
150
+ )
151
+ ] })
152
+ ] })
153
+ }
154
+ );
155
+ }
156
+ const SidebarContext = createContext(null);
157
+ function useSidebarContext() {
158
+ const ctx = useContext(SidebarContext);
159
+ if (!ctx) {
160
+ throw new Error("Sidebar compound components must be used within <Sidebar.Root>");
161
+ }
162
+ return ctx;
163
+ }
164
+ function SidebarRoot({
165
+ expanded: expandedProp,
166
+ onToggle: onToggleProp,
167
+ navigate: navigateProp,
168
+ location: locationProp,
169
+ width: widthProp,
170
+ children,
171
+ className
172
+ }) {
173
+ const layoutContext = useOptionalLayout();
174
+ const [localExpanded, setLocalExpanded] = useState(false);
175
+ const [isMobileViewport, setIsMobileViewport] = useState(false);
176
+ const expanded = expandedProp !== void 0 ? expandedProp : (layoutContext == null ? void 0 : layoutContext.sidebarExpanded) ?? localExpanded;
177
+ const onToggle = onToggleProp || (layoutContext == null ? void 0 : layoutContext.toggleSidebar) || (() => setLocalExpanded((prev) => !prev));
178
+ const width = widthProp !== void 0 ? widthProp : (layoutContext == null ? void 0 : layoutContext.sidebarWidth) ?? 280;
179
+ const navigate = navigateProp || ((path) => {
180
+ if (typeof window !== "undefined") window.location.href = path;
181
+ });
182
+ const location = locationProp || (typeof window !== "undefined" ? window.location : { pathname: "/" });
183
+ useEffect(() => {
184
+ const checkViewport = () => setIsMobileViewport(window.innerWidth < 768);
185
+ checkViewport();
186
+ window.addEventListener("resize", checkViewport);
187
+ return () => window.removeEventListener("resize", checkViewport);
188
+ }, []);
189
+ return /* @__PURE__ */ jsx(
190
+ SidebarContext.Provider,
191
+ {
192
+ value: { expanded, isMobileViewport, onToggle, navigate, location, width },
193
+ children: /* @__PURE__ */ jsxs(TooltipProvider, { delayDuration: 300, children: [
194
+ /* @__PURE__ */ jsx("style", { children: `
195
+ @media (max-width: 767px) {
196
+ [style*="padding-left"].flex-1,
197
+ [style*="paddingLeft"].flex-1 {
198
+ padding-left: 0 !important;
199
+ }
200
+ }
201
+ ` }),
202
+ /* @__PURE__ */ jsx(
203
+ "div",
204
+ {
205
+ className: cn(
206
+ "bg-sidebar text-sidebar-foreground transition-all duration-300 ease-in-out flex flex-col z-50",
207
+ expanded ? "fixed inset-0 md:fixed md:inset-y-0 md:left-0" : "fixed inset-y-0 left-0 w-20 -translate-x-full md:translate-x-0",
208
+ className
209
+ ),
210
+ style: expanded && !isMobileViewport ? { width: `${width}px` } : void 0,
211
+ children
212
+ }
213
+ )
214
+ ] })
215
+ }
216
+ );
217
+ }
218
+ function SidebarHeader({
219
+ logo,
220
+ logoCollapsed
221
+ }) {
222
+ const { expanded, onToggle } = useSidebarContext();
223
+ const { t } = useTranslation();
224
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
225
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 p-[14px] pt-[13px] pr-[14px] pb-[12px] pl-[14px]", children: /* @__PURE__ */ jsx(
226
+ "button",
227
+ {
228
+ onClick: onToggle,
229
+ className: "w-full h-10 flex items-center gap-3 px-3 justify-center rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
230
+ "aria-label": expanded ? t("sidebar.collapse") : t("sidebar.expand"),
231
+ "aria-expanded": expanded,
232
+ "aria-controls": "sidebar-nav",
233
+ children: expanded ? /* @__PURE__ */ jsx(ArrowLeft, { className: "w-5 h-5" }) : /* @__PURE__ */ jsx(Menu, { className: "w-5 h-5" })
234
+ }
235
+ ) }),
236
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 px-4 py-4", children: /* @__PURE__ */ jsx("div", { className: "flex items-center h-10 justify-center", children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center flex-shrink-0", children: expanded ? logo || /* @__PURE__ */ jsx(XerticaLogo, { className: "h-5 w-auto", variant: "white" }) : logoCollapsed || /* @__PURE__ */ jsx(XerticaXLogo, { className: "h-5 w-auto", variant: "white" }) }) }) })
237
+ ] });
238
+ }
239
+ function SidebarNav({
240
+ navigationGroups = [],
241
+ routes = [],
242
+ variant = "default"
243
+ }) {
244
+ const { expanded, navigate, location, onToggle } = useSidebarContext();
245
+ const { t } = useTranslation();
246
+ const navRef = useRef(null);
247
+ const [localActiveItem, setLocalActiveItem] = useState(null);
248
+ const [hasOverflow, setHasOverflow] = useState(false);
249
+ const [visibleItems, setVisibleItems] = useState([]);
250
+ const [overflowItems, setOverflowItems] = useState([]);
251
+ const labelTranslations = useMemo(
252
+ () => ({
253
+ home: "Início",
254
+ dashboard: "Painel",
255
+ components: "Componentes"
256
+ }),
257
+ []
258
+ );
259
+ const navigationItems = useMemo(
260
+ () => (routes || []).map((route) => ({
261
+ ...route,
262
+ label: labelTranslations[route.label.toLowerCase()] || route.label,
263
+ active: location.pathname === route.path || location.pathname.startsWith(route.path + "/"),
264
+ children: route.children
265
+ })),
266
+ [routes, location.pathname, labelTranslations]
267
+ );
268
+ useEffect(() => {
269
+ if (typeof window === "undefined") return;
270
+ const checkOverflow = () => {
271
+ if (!navRef.current) return;
272
+ if (variant === "assistant") return;
273
+ const navHeight = navRef.current.clientHeight;
274
+ const itemHeight = 44;
275
+ const maxVisibleItems = Math.floor(navHeight / itemHeight);
276
+ if (navigationItems.length > maxVisibleItems) {
277
+ setHasOverflow(true);
278
+ setVisibleItems(navigationItems.slice(0, maxVisibleItems - 1));
279
+ setOverflowItems(navigationItems.slice(maxVisibleItems - 1));
280
+ } else {
281
+ setHasOverflow(false);
282
+ setVisibleItems(navigationItems);
283
+ setOverflowItems([]);
284
+ }
285
+ };
286
+ checkOverflow();
287
+ window.addEventListener("resize", checkOverflow);
288
+ return () => window.removeEventListener("resize", checkOverflow);
289
+ }, [navigationItems.length, variant]);
290
+ const handleNavigate = (path) => {
291
+ setLocalActiveItem(path);
292
+ navigate(path);
293
+ if (typeof window !== "undefined" && window.innerWidth < 768) {
294
+ onToggle();
295
+ }
296
+ };
297
+ const toNavItem = (route) => ({
298
+ path: route.path,
299
+ label: labelTranslations[route.label.toLowerCase()] || route.label,
300
+ icon: route.icon,
301
+ active: location.pathname === route.path || location.pathname.startsWith(route.path + "/"),
302
+ children: route.children,
303
+ actions: route.actions
304
+ });
305
+ const renderActionItems = (actions) => {
306
+ return actions.map((action, idx) => {
307
+ const Icon = action.icon;
308
+ if (action.children && action.children.length > 0) {
309
+ return /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
310
+ /* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { children: [
311
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "mr-2 h-4 w-4" }),
312
+ /* @__PURE__ */ jsx("span", { children: action.label })
313
+ ] }),
314
+ /* @__PURE__ */ jsx(DropdownMenuPortal, { children: /* @__PURE__ */ jsx(DropdownMenuSubContent, { className: "w-48 bg-popover border-border", children: renderActionItems(action.children) }) })
315
+ ] }, idx);
316
+ }
317
+ return /* @__PURE__ */ jsxs(
318
+ DropdownMenuItem,
319
+ {
320
+ className: cn(
321
+ "flex items-center gap-2",
322
+ action.variant === "destructive" ? "text-destructive focus:text-destructive" : ""
323
+ ),
324
+ onClick: (e) => {
325
+ var _a;
326
+ e.stopPropagation();
327
+ (_a = action.onClick) == null ? void 0 : _a.call(action, null);
328
+ },
329
+ children: [
330
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 flex-shrink-0" }),
331
+ /* @__PURE__ */ jsx("span", { children: action.label })
332
+ ]
333
+ },
334
+ idx
335
+ );
336
+ });
337
+ };
338
+ const renderAssistantActionMenu = (actions, isHeader = false) => {
339
+ if (!actions || actions.length === 0) return null;
340
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
341
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
342
+ Button,
343
+ {
344
+ variant: "ghost",
345
+ size: "icon",
346
+ className: cn(
347
+ "h-8 w-8 text-sidebar-foreground/80 hover:bg-sidebar-foreground/20 hover:text-sidebar-foreground rounded-full transition-all",
348
+ !isHeader && "opacity-0 group-hover/item:opacity-100"
349
+ ),
350
+ "aria-label": t("sidebar.moreOptions"),
351
+ children: /* @__PURE__ */ jsx(MoreVertical, { className: "h-4 w-4" })
352
+ }
353
+ ) }),
354
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", className: "w-48 bg-popover border-border p-1", children: renderActionItems(actions) })
355
+ ] });
356
+ };
357
+ const renderDefaultItem = (item) => {
358
+ const Icon = item.icon;
359
+ const hasChildren = item.children && item.children.length > 0;
360
+ const activeClass = item.active ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm" : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground";
361
+ if (!expanded) {
362
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
363
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
364
+ "button",
365
+ {
366
+ onClick: () => handleNavigate(item.path),
367
+ className: cn(
368
+ "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200",
369
+ activeClass
370
+ ),
371
+ "aria-label": item.label,
372
+ children: Icon && /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 flex-shrink-0" })
373
+ }
374
+ ) }),
375
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", sideOffset: 0, children: /* @__PURE__ */ jsx("p", { children: item.label }) })
376
+ ] }, item.path);
377
+ }
378
+ return /* @__PURE__ */ jsxs(
379
+ "div",
380
+ {
381
+ className: cn(
382
+ "group/item flex items-center w-full h-10 rounded-[var(--radius-button)] transition-all duration-200",
383
+ activeClass
384
+ ),
385
+ children: [
386
+ /* @__PURE__ */ jsxs(
387
+ "button",
388
+ {
389
+ onClick: () => handleNavigate(item.path),
390
+ className: "flex items-center gap-3 px-3 flex-1 h-full min-w-0 text-left",
391
+ children: [
392
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "w-5 h-5 flex-shrink-0" }),
393
+ /* @__PURE__ */ jsx("span", { className: "truncate flex-1", children: item.label })
394
+ ]
395
+ }
396
+ ),
397
+ hasChildren && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
398
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
399
+ "button",
400
+ {
401
+ onClick: (e) => e.stopPropagation(),
402
+ className: "h-full px-2 pr-2.5 flex items-center justify-center text-sidebar-foreground/40 hover:text-sidebar-foreground transition-colors",
403
+ "aria-label": t("sidebar.submenu", { label: item.label }),
404
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "w-4 h-4" })
405
+ }
406
+ ) }),
407
+ /* @__PURE__ */ jsx(
408
+ DropdownMenuContent,
409
+ {
410
+ side: "right",
411
+ align: "start",
412
+ className: "w-48 bg-popover border-border p-1",
413
+ children: item.children.map((child) => {
414
+ const ChildIcon = child.icon;
415
+ const isChildActive = location.pathname === child.path || location.pathname.startsWith(child.path + "/");
416
+ return /* @__PURE__ */ jsxs(
417
+ DropdownMenuItem,
418
+ {
419
+ onClick: () => handleNavigate(child.path),
420
+ className: cn(
421
+ "flex items-center gap-2 cursor-pointer",
422
+ isChildActive && "bg-accent text-accent-foreground"
423
+ ),
424
+ children: [
425
+ ChildIcon && /* @__PURE__ */ jsx(ChildIcon, { className: "h-4 w-4 flex-shrink-0" }),
426
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: child.label })
427
+ ]
428
+ },
429
+ child.path
430
+ );
431
+ })
432
+ }
433
+ )
434
+ ] })
435
+ ]
436
+ },
437
+ item.path
438
+ );
439
+ };
440
+ const renderDefaultGroup = (group) => {
441
+ const GroupIcon = group.icon;
442
+ if (!expanded) {
443
+ return /* @__PURE__ */ jsx("div", { className: "space-y-1", children: group.items.map((item) => renderDefaultItem(toNavItem(item))) }, group.id);
444
+ }
445
+ return /* @__PURE__ */ jsxs("div", { children: [
446
+ (group.label || GroupIcon) && /* @__PURE__ */ jsxs("div", { className: "px-3 mb-1 flex items-center gap-2", children: [
447
+ GroupIcon && (React__default.isValidElement(GroupIcon) ? GroupIcon : /* @__PURE__ */ jsx(GroupIcon, { className: "h-3 w-3 text-sidebar-foreground/80" })),
448
+ group.label && /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold uppercase tracking-wider text-sidebar-foreground/80", children: group.label })
449
+ ] }),
450
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: group.items.map((item) => renderDefaultItem(toNavItem(item))) })
451
+ ] }, group.id);
452
+ };
453
+ const renderAssistantGroup = (group) => {
454
+ const isAnyItemActive = group.items.some(
455
+ (item) => location.pathname === item.path || location.pathname.startsWith(item.path + "/")
456
+ );
457
+ const GroupIcon = group.icon;
458
+ if (!expanded) {
459
+ if (!GroupIcon) return null;
460
+ return /* @__PURE__ */ jsx("div", { className: "py-2 flex justify-center", children: /* @__PURE__ */ jsxs(Tooltip, { children: [
461
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
462
+ "button",
463
+ {
464
+ onClick: () => onToggle(),
465
+ "aria-label": group.label,
466
+ className: cn(
467
+ "h-10 w-10 flex items-center justify-center rounded-[var(--radius-button)] transition-all duration-200",
468
+ isAnyItemActive ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm" : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground"
469
+ ),
470
+ children: React__default.isValidElement(GroupIcon) ? GroupIcon : /* @__PURE__ */ jsx(GroupIcon, { className: "h-5 w-5" })
471
+ }
472
+ ) }),
473
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", children: /* @__PURE__ */ jsx("p", { children: group.label }) })
474
+ ] }) }, group.id);
475
+ }
476
+ return /* @__PURE__ */ jsxs("div", { className: "py-2 group", children: [
477
+ (group.label || group.icon) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-3 mb-1", children: [
478
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sidebar-foreground/80 text-xs font-semibold uppercase tracking-wider", children: [
479
+ GroupIcon && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: React__default.isValidElement(GroupIcon) ? GroupIcon : /* @__PURE__ */ jsx(GroupIcon, { className: "h-4 w-4" }) }),
480
+ group.label && /* @__PURE__ */ jsx("span", { children: group.label })
481
+ ] }),
482
+ renderAssistantActionMenu(group.actions, true)
483
+ ] }),
484
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: group.items.map((item) => {
485
+ const isRouteActive = location.pathname === item.path || location.pathname.startsWith(item.path + "/");
486
+ const isActive = isRouteActive || localActiveItem === item.path;
487
+ const Icon = item.icon;
488
+ return /* @__PURE__ */ jsxs(
489
+ "div",
490
+ {
491
+ className: `group/item flex items-start justify-between px-3 min-h-[36px] py-2.5 rounded-[var(--radius-button)] cursor-pointer transition-all duration-200 ${isActive ? "bg-sidebar-foreground/15 text-sidebar-foreground" : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/10 hover:text-sidebar-foreground"}`,
492
+ onClick: () => handleNavigate(item.path),
493
+ children: [
494
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [
495
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 overflow-hidden h-5", children: [
496
+ Icon && /* @__PURE__ */ jsx("div", { className: "w-4 h-4 flex-shrink-0 flex items-center justify-center", children: React__default.isValidElement(Icon) ? Icon : /* @__PURE__ */ jsx(Icon, { className: "w-4 h-4" }) }),
497
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium leading-none", children: item.label })
498
+ ] }),
499
+ isActive && item.description && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-sidebar-foreground/60 mt-1.5 animate-in fade-in slide-in-from-top-1 duration-200", children: item.description })
500
+ ] }),
501
+ /* @__PURE__ */ jsx("div", { className: "h-5 flex items-center ml-1", children: renderAssistantActionMenu(item.actions) })
502
+ ]
503
+ },
504
+ item.path
505
+ );
506
+ }) })
507
+ ] }, group.id);
508
+ };
509
+ if (variant === "assistant") {
510
+ return /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 overflow-hidden", children: /* @__PURE__ */ jsx(ScrollArea, { className: "h-full px-4", children: navigationGroups.map((group) => renderAssistantGroup(group)) }) });
511
+ }
512
+ return /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 overflow-hidden", children: /* @__PURE__ */ jsx(
513
+ "nav",
514
+ {
515
+ id: "sidebar-nav",
516
+ "aria-label": t("sidebar.mainNavigation"),
517
+ className: "h-full px-4 py-4 overflow-hidden",
518
+ ref: navRef,
519
+ children: navigationGroups && navigationGroups.length > 0 ? /* @__PURE__ */ jsx("div", { className: "space-y-3", children: navigationGroups.map((group) => /* @__PURE__ */ jsx(React__default.Fragment, { children: renderDefaultGroup(group) }, group.id)) }) : /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
520
+ (hasOverflow ? visibleItems : navigationItems).map((item) => renderDefaultItem(item)),
521
+ hasOverflow && /* @__PURE__ */ jsxs(Popover, { children: [
522
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
523
+ "button",
524
+ {
525
+ className: expanded ? "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground" : "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
526
+ "aria-label": t("sidebar.moreOptions"),
527
+ children: [
528
+ /* @__PURE__ */ jsx(MoreVertical, { className: "w-5 h-5 flex-shrink-0" }),
529
+ expanded && /* @__PURE__ */ jsx("span", { className: "truncate text-sidebar-foreground", children: t("sidebar.moreOptions") })
530
+ ]
531
+ }
532
+ ) }),
533
+ /* @__PURE__ */ jsx(
534
+ PopoverContent,
535
+ {
536
+ side: "right",
537
+ align: "start",
538
+ className: "w-56 p-2 bg-popover border border-border rounded-[var(--radius-card)] shadow-lg",
539
+ sideOffset: 8,
540
+ children: /* @__PURE__ */ jsx("div", { className: "space-y-1", children: overflowItems.map((item) => {
541
+ const Icon = item.icon;
542
+ return /* @__PURE__ */ jsxs(
543
+ "button",
544
+ {
545
+ onClick: () => handleNavigate(item.path),
546
+ className: "w-full h-9 flex items-center gap-2 px-3 rounded-[var(--radius-button)] transition-all duration-200 text-popover-foreground/80 hover:bg-accent hover:text-accent-foreground text-left",
547
+ children: [
548
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "w-4 h-4 flex-shrink-0" }),
549
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: item.label })
550
+ ]
551
+ },
552
+ item.path
553
+ );
554
+ }) })
555
+ }
556
+ )
557
+ ] })
558
+ ] })
559
+ }
560
+ ) });
561
+ }
562
+ function SidebarSearch({
563
+ fixedArea,
564
+ search
565
+ }) {
566
+ var _a, _b;
567
+ const { expanded } = useSidebarContext();
568
+ const { t } = useTranslation();
569
+ const [isFilterOpen, setIsFilterOpen] = useState(false);
570
+ if (!(fixedArea && fixedArea.show || search && search.show)) return null;
571
+ return /* @__PURE__ */ jsxs("div", { className: "flex-shrink-0 px-4 pb-4 space-y-4 border-b border-sidebar-border/30 mb-2", children: [
572
+ (fixedArea == null ? void 0 : fixedArea.show) && fixedArea.content && expanded && /* @__PURE__ */ jsx("div", { className: "animate-in fade-in slide-in-from-top-1 duration-300", children: fixedArea.content }),
573
+ (search == null ? void 0 : search.show) && expanded && /* @__PURE__ */ jsxs(Fragment, { children: [
574
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
575
+ /* @__PURE__ */ jsxs("div", { className: "relative flex-1", children: [
576
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-4 w-4 text-sidebar-foreground/50" }),
577
+ /* @__PURE__ */ jsx(
578
+ Input,
579
+ {
580
+ type: "text",
581
+ placeholder: search.placeholder || t("sidebar.searchPlaceholder"),
582
+ "aria-label": search.placeholder || t("sidebar.searchPlaceholder"),
583
+ value: search.value,
584
+ onChange: (e) => {
585
+ var _a2;
586
+ return (_a2 = search.onChange) == null ? void 0 : _a2.call(search, e.target.value);
587
+ },
588
+ className: "w-full h-9 bg-sidebar-foreground/10 border-sidebar-border text-sidebar-foreground placeholder:text-sidebar-foreground/50 pl-9 focus-visible:ring-1 focus-visible:ring-sidebar-foreground/30 focus-visible:ring-offset-0"
589
+ }
590
+ )
591
+ ] }),
592
+ ((_a = search.filter) == null ? void 0 : _a.show) && search.filter.content && /* @__PURE__ */ jsx(
593
+ Button,
594
+ {
595
+ variant: "ghost",
596
+ size: "icon",
597
+ onClick: () => setIsFilterOpen(!isFilterOpen),
598
+ className: cn(
599
+ "h-9 w-9 text-sidebar-foreground transition-all duration-200",
600
+ isFilterOpen ? "bg-sidebar-foreground/20" : "hover:bg-sidebar-foreground/15"
601
+ ),
602
+ "aria-label": isFilterOpen ? t("sidebar.closeFilters") : t("sidebar.openFilters"),
603
+ children: search.filter.icon || /* @__PURE__ */ jsx(Filter, { className: "h-4 w-4" })
604
+ }
605
+ )
606
+ ] }),
607
+ /* @__PURE__ */ jsx(AnimatePresence, { children: isFilterOpen && ((_b = search.filter) == null ? void 0 : _b.show) && search.filter.content && /* @__PURE__ */ jsx(
608
+ motion.div,
609
+ {
610
+ initial: { height: 0, opacity: 0 },
611
+ animate: { height: "auto", opacity: 1 },
612
+ exit: { height: 0, opacity: 0 },
613
+ transition: { duration: 0.2 },
614
+ className: "overflow-hidden",
615
+ children: /* @__PURE__ */ jsx("div", { className: "pt-2 border-t border-sidebar-border/20", children: search.filter.content })
616
+ }
617
+ ) })
618
+ ] }),
619
+ !expanded && ((fixedArea == null ? void 0 : fixedArea.show) || (search == null ? void 0 : search.show)) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4 py-2", children: [
620
+ (fixedArea == null ? void 0 : fixedArea.show) && fixedArea.icon && /* @__PURE__ */ jsxs(Tooltip, { children: [
621
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
622
+ "button",
623
+ {
624
+ onClick: () => {
625
+ var _a2;
626
+ return (_a2 = fixedArea.onClick) == null ? void 0 : _a2.call(fixedArea);
627
+ },
628
+ className: "h-10 w-10 flex items-center justify-center rounded-[var(--radius-button)] bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 transition-all",
629
+ "aria-label": t("assistant.newConversation"),
630
+ children: React__default.isValidElement(fixedArea.icon) ? fixedArea.icon : /* @__PURE__ */ jsx(fixedArea.icon, { className: "h-5 w-5" })
631
+ }
632
+ ) }),
633
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", children: t("assistant.newConversation") })
634
+ ] }),
635
+ (search == null ? void 0 : search.show) && /* @__PURE__ */ jsxs(Tooltip, { children: [
636
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
637
+ "button",
638
+ {
639
+ className: "h-10 w-10 flex items-center justify-center rounded-[var(--radius-button)] text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
640
+ "aria-label": t("sidebar.search"),
641
+ children: /* @__PURE__ */ jsx(Search, { className: "h-5 w-5" })
642
+ }
643
+ ) }),
644
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", children: t("sidebar.search") })
645
+ ] })
646
+ ] })
647
+ ] });
648
+ }
649
+ function SidebarFooter({
650
+ user,
651
+ onLogout = () => {
652
+ },
653
+ onSettingsClick,
654
+ showUser = true,
655
+ showSettings = true,
656
+ showLogout = true
657
+ }) {
658
+ const { expanded, navigate, location, onToggle } = useSidebarContext();
659
+ const { t } = useTranslation();
660
+ const isSettingsActive = location.pathname === "/settings";
661
+ const handleSettingsClick = () => {
662
+ if (onSettingsClick) {
663
+ onSettingsClick();
664
+ } else {
665
+ navigate("/settings");
666
+ }
667
+ if (typeof window !== "undefined" && window.innerWidth < 768) {
668
+ onToggle();
669
+ }
670
+ };
671
+ return /* @__PURE__ */ jsxs("div", { className: "flex-shrink-0 p-4 space-y-2", children: [
672
+ showUser && (!expanded ? /* @__PURE__ */ jsxs(Tooltip, { children: [
673
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
674
+ "button",
675
+ {
676
+ className: "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
677
+ "aria-label": t("sidebar.userProfile"),
678
+ children: /* @__PURE__ */ jsxs(Avatar, { className: "w-7 h-7 flex-shrink-0", children: [
679
+ /* @__PURE__ */ jsx(AvatarImage, { src: user == null ? void 0 : user.avatar, alt: (user == null ? void 0 : user.name) || "User" }),
680
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-sidebar-foreground/15 text-sidebar-foreground text-xs", children: (user == null ? void 0 : user.name) ? user.name.charAt(0).toUpperCase() : "U" })
681
+ ] })
682
+ }
683
+ ) }),
684
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", sideOffset: 0, children: /* @__PURE__ */ jsx("p", { children: (user == null ? void 0 : user.name) || t("sidebar.profile") }) })
685
+ ] }) : /* @__PURE__ */ jsxs("button", { className: "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground", children: [
686
+ /* @__PURE__ */ jsxs(Avatar, { className: "w-7 h-7 flex-shrink-0", children: [
687
+ /* @__PURE__ */ jsx(AvatarImage, { src: user == null ? void 0 : user.avatar, alt: (user == null ? void 0 : user.name) || "User" }),
688
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-sidebar-foreground/15 text-sidebar-foreground text-xs", children: (user == null ? void 0 : user.name) ? user.name.charAt(0).toUpperCase() : "U" })
689
+ ] }),
690
+ /* @__PURE__ */ jsx("span", { className: "text-sidebar-foreground truncate", children: (user == null ? void 0 : user.name) || t("sidebar.profile") })
691
+ ] })),
692
+ showSettings && (!expanded ? /* @__PURE__ */ jsxs(Tooltip, { children: [
693
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
694
+ "button",
695
+ {
696
+ onClick: handleSettingsClick,
697
+ className: cn(
698
+ "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200",
699
+ isSettingsActive ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm" : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground"
700
+ ),
701
+ "aria-label": t("nav.settings"),
702
+ children: /* @__PURE__ */ jsx(Settings, { className: "w-5 h-5 flex-shrink-0" })
703
+ }
704
+ ) }),
705
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", sideOffset: 0, children: /* @__PURE__ */ jsx("p", { children: t("nav.settings") }) })
706
+ ] }) : /* @__PURE__ */ jsxs(
707
+ "button",
708
+ {
709
+ onClick: handleSettingsClick,
710
+ className: cn(
711
+ "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200",
712
+ isSettingsActive ? "bg-sidebar-foreground/15 text-sidebar-foreground shadow-sm" : "text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground"
713
+ ),
714
+ children: [
715
+ /* @__PURE__ */ jsx(Settings, { className: "w-5 h-5 flex-shrink-0" }),
716
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sidebar-foreground", children: t("nav.settings") })
717
+ ]
718
+ }
719
+ )),
720
+ showLogout && (!expanded ? /* @__PURE__ */ jsxs(Tooltip, { children: [
721
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
722
+ "button",
723
+ {
724
+ onClick: onLogout,
725
+ className: "w-full h-10 flex items-center justify-center px-0 rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
726
+ "aria-label": t("sidebar.logout"),
727
+ children: /* @__PURE__ */ jsx(LogOut, { className: "w-5 h-5 flex-shrink-0" })
728
+ }
729
+ ) }),
730
+ /* @__PURE__ */ jsx(CustomTooltipContent, { side: "right", sideOffset: 0, children: /* @__PURE__ */ jsx("p", { children: t("sidebar.logout") }) })
731
+ ] }) : /* @__PURE__ */ jsxs(
732
+ "button",
733
+ {
734
+ onClick: onLogout,
735
+ className: "w-full h-10 flex items-center gap-3 px-3 justify-start rounded-[var(--radius-button)] transition-all duration-200 text-sidebar-foreground/80 hover:bg-sidebar-foreground/15 hover:text-sidebar-foreground",
736
+ children: [
737
+ /* @__PURE__ */ jsx(LogOut, { className: "w-5 h-5 flex-shrink-0" }),
738
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sidebar-foreground", children: t("sidebar.logout") })
739
+ ]
740
+ }
741
+ ))
742
+ ] });
743
+ }
744
+ function Sidebar({
745
+ expanded: expandedProp,
746
+ onToggle: onToggleProp,
747
+ user,
748
+ onLogout = () => {
749
+ },
750
+ onSettingsClick,
751
+ location: locationProp,
752
+ navigate: navigateProp,
753
+ routes,
754
+ logo,
755
+ logoCollapsed,
756
+ variant = "default",
757
+ fixedArea,
758
+ search,
759
+ navigationGroups = [],
760
+ footer,
761
+ showFooter,
762
+ width: widthProp
763
+ }) {
764
+ const { showUser = true, showSettings = true, showLogout = true } = footer || {};
765
+ const displayFooter = showFooter !== void 0 ? showFooter : variant === "default";
766
+ return /* @__PURE__ */ jsxs(
767
+ SidebarRoot,
768
+ {
769
+ expanded: expandedProp,
770
+ onToggle: onToggleProp,
771
+ navigate: navigateProp,
772
+ location: locationProp,
773
+ width: widthProp,
774
+ children: [
775
+ /* @__PURE__ */ jsx(SidebarHeader, { logo, logoCollapsed }),
776
+ variant === "assistant" && /* @__PURE__ */ jsx(SidebarSearch, { fixedArea, search }),
777
+ /* @__PURE__ */ jsx(SidebarNav, { navigationGroups, routes, variant }),
778
+ displayFooter && (showUser || showSettings || showLogout) && /* @__PURE__ */ jsx(
779
+ SidebarFooter,
780
+ {
781
+ user,
782
+ onLogout,
783
+ onSettingsClick,
784
+ showUser,
785
+ showSettings,
786
+ showLogout
787
+ }
788
+ )
789
+ ]
790
+ }
791
+ );
792
+ }
793
+ Sidebar.Root = SidebarRoot;
794
+ Sidebar.Header = SidebarHeader;
795
+ Sidebar.Search = SidebarSearch;
796
+ Sidebar.Nav = SidebarNav;
797
+ Sidebar.Footer = SidebarFooter;
798
+ export {
799
+ Header as H,
800
+ Sidebar as S
801
+ };